From e6929e48904b746f9a8f63015ed436afb7519e77 Mon Sep 17 00:00:00 2001 From: jld3103 Date: Sat, 4 Nov 2023 10:43:59 +0100 Subject: [PATCH 1/3] feat(neon): Allow overriding cache manager in NeonCachedImage Signed-off-by: jld3103 --- packages/neon/neon/lib/src/widgets/image.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/neon/neon/lib/src/widgets/image.dart b/packages/neon/neon/lib/src/widgets/image.dart index 8e903d3d..46ed7fd8 100644 --- a/packages/neon/neon/lib/src/widgets/image.dart +++ b/packages/neon/neon/lib/src/widgets/image.dart @@ -95,20 +95,20 @@ class NeonCachedImage extends StatefulWidget { final CacheWriter? writeCache, final String cacheKey, ) async { - final cached = await checkCache?.call(_cacheManager) ?? await _defaultCacheReviver(cacheKey); + final cached = await checkCache?.call(cacheManager) ?? await _defaultCacheReviver(cacheKey); if (cached != null) { return cached; } final data = await getImage(); - unawaited(writeCache?.call(_cacheManager, data) ?? _defaultCacheWriter(data, cacheKey)); + unawaited(writeCache?.call(cacheManager, data) ?? _defaultCacheWriter(data, cacheKey)); return data; } static Future _defaultCacheReviver(final String cacheKey) async { - final cacheFile = await _cacheManager.getFileFromCache(cacheKey); + final cacheFile = await cacheManager.getFileFromCache(cacheKey); if (cacheFile != null && cacheFile.validTill.isAfter(DateTime.now())) { return cacheFile.file.readAsBytes(); } @@ -120,14 +120,15 @@ class NeonCachedImage extends StatefulWidget { final Uint8List data, final String cacheKey, ) async { - await _cacheManager.putFile( + await cacheManager.putFile( cacheKey, data, maxAge: const Duration(days: 7), ); } - static final _cacheManager = DefaultCacheManager(); + @visibleForTesting + static DefaultCacheManager cacheManager = DefaultCacheManager(); @override State createState() => _NeonCachedImageState(); From dd21721d1182be94560b80ea2b6b4c23bdc4aa6d Mon Sep 17 00:00:00 2001 From: jld3103 Date: Sat, 4 Nov 2023 10:45:34 +0100 Subject: [PATCH 2/3] test(neon_dashboard): Use mock cache manager to fix widget tests Signed-off-by: jld3103 --- packages/neon/neon_dashboard/pubspec.yaml | 1 + packages/neon/neon_dashboard/test/widget_test.dart | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/packages/neon/neon_dashboard/pubspec.yaml b/packages/neon/neon_dashboard/pubspec.yaml index 615d025c..6be0c844 100644 --- a/packages/neon/neon_dashboard/pubspec.yaml +++ b/packages/neon/neon_dashboard/pubspec.yaml @@ -26,6 +26,7 @@ dependencies: dev_dependencies: build_runner: ^2.4.6 built_collection: ^5.1.1 + flutter_cache_manager: ^3.3.1 flutter_test: sdk: flutter go_router_builder: ^2.3.4 diff --git a/packages/neon/neon_dashboard/test/widget_test.dart b/packages/neon/neon_dashboard/test/widget_test.dart index c05d5ddb..7a3f7b5a 100644 --- a/packages/neon/neon_dashboard/test/widget_test.dart +++ b/packages/neon/neon_dashboard/test/widget_test.dart @@ -1,5 +1,6 @@ import 'package:built_collection/built_collection.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:neon/blocs.dart'; @@ -16,6 +17,8 @@ import 'package:rxdart/rxdart.dart'; class MockAccountsBloc extends Mock implements AccountsBloc {} +class MockCacheManager extends Mock implements DefaultCacheManager {} + Widget wrapWidget(final AccountsBloc accountsBloc, final Widget child) => MaterialApp( localizationsDelegates: DashboardLocalizations.localizationsDelegates, supportedLocales: DashboardLocalizations.supportedLocales, @@ -29,6 +32,8 @@ Widget wrapWidget(final AccountsBloc accountsBloc, final Widget child) => Materi ); void main() { + NeonCachedImage.cacheManager = MockCacheManager(); + final accountsBloc = MockAccountsBloc(); when(() => accountsBloc.activeAccount).thenAnswer( (final invocation) => BehaviorSubject.seeded( From 86385b1d04b299b4827177e8610eb935d771b4ee Mon Sep 17 00:00:00 2001 From: jld3103 Date: Sat, 4 Nov 2023 10:15:54 +0100 Subject: [PATCH 3/3] fix(neon_dashboard): Fix matching goldens Signed-off-by: jld3103 --- .../neon/neon_dashboard/test/widget_test.dart | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/neon/neon_dashboard/test/widget_test.dart b/packages/neon/neon_dashboard/test/widget_test.dart index 7a3f7b5a..045b6f45 100644 --- a/packages/neon/neon_dashboard/test/widget_test.dart +++ b/packages/neon/neon_dashboard/test/widget_test.dart @@ -88,7 +88,7 @@ void main() { ); expect(find.byType(NeonCachedImage), findsNWidgets(2)); - expect(find.byType(DashboardWidgetItem), matchesGoldenFile('goldens/widget_item.png')); + await expectLater(find.byType(DashboardWidgetItem), matchesGoldenFile('goldens/widget_item.png')); }); testWidgets('Not round', (final tester) async { @@ -111,7 +111,7 @@ void main() { ), ); - expect(find.byType(DashboardWidgetItem), matchesGoldenFile('goldens/widget_item_not_round.png')); + await expectLater(find.byType(DashboardWidgetItem), matchesGoldenFile('goldens/widget_item_not_round.png')); }); testWidgets('Without link', (final tester) async { @@ -171,7 +171,7 @@ void main() { expect(find.byIcon(Icons.add), findsOneWidget); expect(find.text('Button'), findsOneWidget); - expect(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_new.png')); + await expectLater(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_new.png')); }); testWidgets('More', (final tester) async { @@ -187,7 +187,7 @@ void main() { expect(find.byIcon(Icons.more_outlined), findsOneWidget); expect(find.text('Button'), findsOneWidget); - expect(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_more.png')); + await expectLater(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_more.png')); }); testWidgets('Setup', (final tester) async { @@ -203,7 +203,7 @@ void main() { expect(find.byIcon(Icons.launch), findsOneWidget); expect(find.text('Button'), findsOneWidget); - expect(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_setup.png')); + await expectLater(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_setup.png')); }); testWidgets('Invalid', (final tester) async { @@ -219,7 +219,7 @@ void main() { expect(find.byType(Icon), findsNothing); expect(find.text('Button'), findsOneWidget); - expect(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_invalid.png')); + await expectLater(find.byType(DashboardWidgetButton), matchesGoldenFile('goldens/widget_button_invalid.png')); }); }); @@ -295,7 +295,7 @@ void main() { expect(find.byIcon(Icons.add), findsOneWidget); expect(find.text('Button'), findsOneWidget); - expect(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget.png')); + await expectLater(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget.png')); }); testWidgets('Without widgetUrl', (final tester) async { @@ -339,7 +339,7 @@ void main() { ), ); - expect(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_not_round.png')); + await expectLater(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_not_round.png')); }); testWidgets('With halfEmptyContentMessage', (final tester) async { @@ -356,7 +356,7 @@ void main() { expect(find.text('Half empty'), findsOneWidget); expect(find.byIcon(Icons.check), findsOneWidget); - expect(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_with_half_empty.png')); + await expectLater(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_with_half_empty.png')); }); testWidgets('With emptyContentMessage', (final tester) async { @@ -373,7 +373,7 @@ void main() { expect(find.text('Empty'), findsOneWidget); expect(find.byIcon(Icons.check), findsOneWidget); - expect(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_with_empty.png')); + await expectLater(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_with_empty.png')); }); testWidgets('Without items', (final tester) async { @@ -390,7 +390,7 @@ void main() { expect(find.text('No entries'), findsOneWidget); expect(find.byIcon(Icons.check), findsOneWidget); - expect(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_without_items.png')); + await expectLater(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_without_items.png')); }); testWidgets('Without buttons', (final tester) async { @@ -406,7 +406,7 @@ void main() { expect(find.bySubtype(), findsNothing); - expect(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_without_buttons.png')); + await expectLater(find.byType(DashboardWidget), matchesGoldenFile('goldens/widget_without_buttons.png')); }); }); }