mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-21 23:10:40 +00:00
fixed unit tests
This commit is contained in:
parent
09d04c665f
commit
7db43fb83b
5 changed files with 169 additions and 161 deletions
|
@ -58,7 +58,6 @@ class ApplicationWrapper extends StatelessWidget {
|
||||||
storageService: iapService,
|
storageService: iapService,
|
||||||
child: FilmsProvider(
|
child: FilmsProvider(
|
||||||
filmsStorageService: filmsStorageService,
|
filmsStorageService: filmsStorageService,
|
||||||
storageService: iapService,
|
|
||||||
child: UserPreferencesProvider(
|
child: UserPreferencesProvider(
|
||||||
hasLightSensor: hasLightSensor,
|
hasLightSensor: hasLightSensor,
|
||||||
userPreferencesService: userPreferencesService,
|
userPreferencesService: userPreferencesService,
|
||||||
|
|
|
@ -5,12 +5,10 @@ import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
class FilmsProvider extends StatefulWidget {
|
class FilmsProvider extends StatefulWidget {
|
||||||
final FilmsStorageService filmsStorageService;
|
final FilmsStorageService filmsStorageService;
|
||||||
final IAPStorageService storageService;
|
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
||||||
const FilmsProvider({
|
const FilmsProvider({
|
||||||
required this.filmsStorageService,
|
required this.filmsStorageService,
|
||||||
required this.storageService,
|
|
||||||
required this.child,
|
required this.child,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
@ -39,8 +37,8 @@ class FilmsProviderState extends State<FilmsProvider> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Films(
|
return Films(
|
||||||
predefinedFilms: predefinedFilms,
|
predefinedFilms: context.isPro ? predefinedFilms : {},
|
||||||
customFilms: customFilms,
|
customFilms: context.isPro ? customFilms : {},
|
||||||
selected: context.isPro ? _selectedFilm : const FilmStub(),
|
selected: context.isPro ? _selectedFilm : const FilmStub(),
|
||||||
child: widget.child,
|
child: widget.child,
|
||||||
);
|
);
|
||||||
|
@ -64,7 +62,7 @@ class FilmsProviderState extends State<FilmsProvider> {
|
||||||
void selectFilm(Film film) {
|
void selectFilm(Film film) {
|
||||||
if (_selectedFilm != film) {
|
if (_selectedFilm != film) {
|
||||||
_selectedId = film.id;
|
_selectedId = film.id;
|
||||||
widget.storageService.selectedFilmId = _selectedId;
|
widget.filmsStorageService.selectedFilmId = _selectedId;
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,7 +89,7 @@ class FilmsProviderState extends State<FilmsProvider> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _init() async {
|
Future<void> _init() async {
|
||||||
_selectedId = widget.storageService.selectedFilmId;
|
_selectedId = widget.filmsStorageService.selectedFilmId;
|
||||||
predefinedFilms.addAll(await widget.filmsStorageService.getPredefinedFilms());
|
predefinedFilms.addAll(await widget.filmsStorageService.getPredefinedFilms());
|
||||||
customFilms.addAll(await widget.filmsStorageService.getCustomFilms());
|
customFilms.addAll(await widget.filmsStorageService.getCustomFilms());
|
||||||
_discardSelectedIfNotIncluded();
|
_discardSelectedIfNotIncluded();
|
||||||
|
@ -105,7 +103,7 @@ class FilmsProviderState extends State<FilmsProvider> {
|
||||||
final isSelectedUsed = predefinedFilms[_selectedId]?.isUsed ?? customFilms[_selectedId]?.isUsed ?? false;
|
final isSelectedUsed = predefinedFilms[_selectedId]?.isUsed ?? customFilms[_selectedId]?.isUsed ?? false;
|
||||||
if (!isSelectedUsed) {
|
if (!isSelectedUsed) {
|
||||||
_selectedId = const FilmStub().id;
|
_selectedId = const FilmStub().id;
|
||||||
widget.storageService.selectedFilmId = _selectedId;
|
widget.filmsStorageService.selectedFilmId = _selectedId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,18 +5,29 @@ import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
import 'package:mocktail/mocktail.dart';
|
import 'package:mocktail/mocktail.dart';
|
||||||
|
|
||||||
class _MockIAPStorageService extends Mock implements IAPStorageService {}
|
class _MockFilmsStorageService extends Mock implements FilmsStorageService {}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
TestWidgetsFlutterBinding.ensureInitialized();
|
TestWidgetsFlutterBinding.ensureInitialized();
|
||||||
late _MockIAPStorageService mockIAPStorageService;
|
late _MockFilmsStorageService mockFilmsStorageService;
|
||||||
|
|
||||||
setUpAll(() {
|
setUpAll(() {
|
||||||
mockIAPStorageService = _MockIAPStorageService();
|
mockFilmsStorageService = _MockFilmsStorageService();
|
||||||
|
});
|
||||||
|
|
||||||
|
setUp(() {
|
||||||
|
registerFallbackValue(mockCustomFilms.first);
|
||||||
|
when(() => mockFilmsStorageService.toggleFilm(any<Film>(), any<bool>())).thenAnswer((_) async {});
|
||||||
|
when(() => mockFilmsStorageService.addFilm(any<FilmExponential>())).thenAnswer((_) async {});
|
||||||
|
when(() => mockFilmsStorageService.updateFilm(any<FilmExponential>())).thenAnswer((_) async {});
|
||||||
|
when(() => mockFilmsStorageService.deleteFilm(any<FilmExponential>())).thenAnswer((_) async {});
|
||||||
|
when(() => mockFilmsStorageService.getPredefinedFilms())
|
||||||
|
.thenAnswer((_) => Future.value(mockPredefinedFilms.toFilmsMap()));
|
||||||
|
when(() => mockFilmsStorageService.getCustomFilms()).thenAnswer((_) => Future.value(mockCustomFilms.toFilmsMap()));
|
||||||
});
|
});
|
||||||
|
|
||||||
tearDown(() {
|
tearDown(() {
|
||||||
reset(mockIAPStorageService);
|
reset(mockFilmsStorageService);
|
||||||
});
|
});
|
||||||
|
|
||||||
Future<void> pumpTestWidget(WidgetTester tester, IAPProductStatus productStatus) async {
|
Future<void> pumpTestWidget(WidgetTester tester, IAPProductStatus productStatus) async {
|
||||||
|
@ -30,16 +41,20 @@ void main() {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: FilmsProvider(
|
child: FilmsProvider(
|
||||||
storageService: mockIAPStorageService,
|
filmsStorageService: mockFilmsStorageService,
|
||||||
availableFilms: mockFilms,
|
|
||||||
child: const _Application(),
|
child: const _Application(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
}
|
}
|
||||||
|
|
||||||
void expectFilmsCount(int count) {
|
void expectPredefinedFilmsCount(int count) {
|
||||||
expect(find.text('Films count: $count'), findsOneWidget);
|
expect(find.text('Predefined films count: $count'), findsOneWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
void expectCustomFilmsCount(int count) {
|
||||||
|
expect(find.text('Custom films count: $count'), findsOneWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void expectFilmsInUseCount(int count) {
|
void expectFilmsInUseCount(int count) {
|
||||||
|
@ -54,17 +69,21 @@ void main() {
|
||||||
'FilmsProvider dependency on IAPProductStatus',
|
'FilmsProvider dependency on IAPProductStatus',
|
||||||
() {
|
() {
|
||||||
setUp(() {
|
setUp(() {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(mockFilms.first);
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(mockPredefinedFilms.first.id);
|
||||||
when(() => mockIAPStorageService.filmsInUse).thenReturn(mockFilms);
|
when(() => mockFilmsStorageService.getPredefinedFilms())
|
||||||
|
.thenAnswer((_) => Future.value(mockPredefinedFilms.toFilmsMap()));
|
||||||
|
when(() => mockFilmsStorageService.getCustomFilms())
|
||||||
|
.thenAnswer((_) => Future.value(mockCustomFilms.toFilmsMap()));
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'IAPProductStatus.purchased - show all saved films',
|
'IAPProductStatus.purchased - show all saved films',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
expectFilmsInUseCount(mockFilms.length + 1);
|
expectCustomFilmsCount(mockCustomFilms.length);
|
||||||
expectSelectedFilmName(mockFilms.first.name);
|
expectFilmsInUseCount(mockPredefinedFilms.length + mockCustomFilms.length + 1);
|
||||||
|
expectSelectedFilmName(mockPredefinedFilms.first.name);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -72,7 +91,8 @@ void main() {
|
||||||
'IAPProductStatus.purchasable - show only default',
|
'IAPProductStatus.purchasable - show only default',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
await pumpTestWidget(tester, IAPProductStatus.purchasable);
|
await pumpTestWidget(tester, IAPProductStatus.purchasable);
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
expectPredefinedFilmsCount(0);
|
||||||
|
expectCustomFilmsCount(0);
|
||||||
expectFilmsInUseCount(1);
|
expectFilmsInUseCount(1);
|
||||||
expectSelectedFilmName('');
|
expectSelectedFilmName('');
|
||||||
},
|
},
|
||||||
|
@ -82,7 +102,8 @@ void main() {
|
||||||
'IAPProductStatus.pending - show only default',
|
'IAPProductStatus.pending - show only default',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
await pumpTestWidget(tester, IAPProductStatus.pending);
|
await pumpTestWidget(tester, IAPProductStatus.pending);
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
expectPredefinedFilmsCount(0);
|
||||||
|
expectCustomFilmsCount(0);
|
||||||
expectFilmsInUseCount(1);
|
expectFilmsInUseCount(1);
|
||||||
expectSelectedFilmName('');
|
expectSelectedFilmName('');
|
||||||
},
|
},
|
||||||
|
@ -91,126 +112,126 @@ void main() {
|
||||||
);
|
);
|
||||||
|
|
||||||
group(
|
group(
|
||||||
'FilmsProvider CRUD',
|
'toggleFilm',
|
||||||
() {
|
() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'Select films in use',
|
'toggle predefined film',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(const FilmStub());
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(mockPredefinedFilms.first.id);
|
||||||
when(() => mockIAPStorageService.filmsInUse).thenReturn([]);
|
|
||||||
|
|
||||||
/// Init
|
|
||||||
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
expectFilmsInUseCount(1);
|
expectCustomFilmsCount(mockCustomFilms.length);
|
||||||
|
expectFilmsInUseCount(mockPredefinedFilms.length + mockCustomFilms.length + 1);
|
||||||
|
expectSelectedFilmName(mockPredefinedFilms.first.name);
|
||||||
|
|
||||||
|
await tester.filmsProvider.toggleFilm(mockPredefinedFilms.first, false);
|
||||||
|
await tester.pump();
|
||||||
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
|
expectCustomFilmsCount(mockCustomFilms.length);
|
||||||
|
expectFilmsInUseCount(mockPredefinedFilms.length - 1 + mockCustomFilms.length + 1);
|
||||||
expectSelectedFilmName('');
|
expectSelectedFilmName('');
|
||||||
|
|
||||||
/// Select all filmsInUse
|
verify(() => mockFilmsStorageService.toggleFilm(mockPredefinedFilms.first, false)).called(1);
|
||||||
await tester.tap(find.byKey(_Application.saveFilmsButtonKey(0)));
|
verify(() => mockFilmsStorageService.selectedFilmId = '').called(1);
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
|
||||||
expectFilmsInUseCount(mockFilms.length + 1);
|
|
||||||
expectSelectedFilmName('');
|
|
||||||
|
|
||||||
verify(() => mockIAPStorageService.filmsInUse = mockFilms.skip(0).toList()).called(1);
|
|
||||||
verifyNever(() => mockIAPStorageService.selectedFilm = const FilmStub());
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'Select film',
|
'toggle custom film',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(const FilmStub());
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(mockCustomFilms.first.id);
|
||||||
when(() => mockIAPStorageService.filmsInUse).thenReturn(mockFilms);
|
|
||||||
|
|
||||||
/// Init
|
|
||||||
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
expectFilmsInUseCount(mockFilms.length + 1);
|
expectCustomFilmsCount(mockCustomFilms.length);
|
||||||
|
expectFilmsInUseCount(mockPredefinedFilms.length + mockCustomFilms.length + 1);
|
||||||
|
expectSelectedFilmName(mockCustomFilms.first.name);
|
||||||
|
|
||||||
|
await tester.filmsProvider.toggleFilm(mockCustomFilms.first, false);
|
||||||
|
await tester.pump();
|
||||||
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
|
expectCustomFilmsCount(mockCustomFilms.length);
|
||||||
|
expectFilmsInUseCount(mockPredefinedFilms.length - 1 + mockCustomFilms.length + 1);
|
||||||
expectSelectedFilmName('');
|
expectSelectedFilmName('');
|
||||||
|
|
||||||
/// Select all filmsInUse
|
verify(() => mockFilmsStorageService.toggleFilm(mockCustomFilms.first, false)).called(1);
|
||||||
await tester.tap(find.byKey(_Application.setFilmButtonKey(0)));
|
verify(() => mockFilmsStorageService.selectedFilmId = '').called(1);
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
|
||||||
expectFilmsInUseCount(mockFilms.length + 1);
|
|
||||||
expectSelectedFilmName(mockFilms.first.name);
|
|
||||||
|
|
||||||
verifyNever(() => mockIAPStorageService.filmsInUse = any<List<Film>>());
|
|
||||||
verify(() => mockIAPStorageService.selectedFilm = mockFilms.first).called(1);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
group(
|
|
||||||
'Coming from free app',
|
|
||||||
() {
|
|
||||||
testWidgets(
|
|
||||||
'Has selected film',
|
|
||||||
(tester) async {
|
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(mockFilms[2]);
|
|
||||||
when(() => mockIAPStorageService.filmsInUse).thenReturn([]);
|
|
||||||
|
|
||||||
/// Init
|
|
||||||
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
|
||||||
expectFilmsInUseCount(1);
|
|
||||||
expectSelectedFilmName('');
|
|
||||||
|
|
||||||
verifyNever(() => mockIAPStorageService.filmsInUse = any<List<Film>>());
|
|
||||||
verify(() => mockIAPStorageService.selectedFilm = const FilmStub()).called(1);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgets(
|
|
||||||
'None film selected',
|
|
||||||
(tester) async {
|
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(const FilmStub());
|
|
||||||
when(() => mockIAPStorageService.filmsInUse).thenReturn([]);
|
|
||||||
|
|
||||||
/// Init
|
|
||||||
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
|
||||||
expectFilmsInUseCount(1);
|
|
||||||
expectSelectedFilmName('');
|
|
||||||
|
|
||||||
verifyNever(() => mockIAPStorageService.filmsInUse = any<List<Film>>());
|
|
||||||
verifyNever(() => mockIAPStorageService.selectedFilm = const FilmStub());
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgets(
|
|
||||||
'Discard selected (by filmsInUse list update)',
|
|
||||||
(tester) async {
|
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(mockFilms.first);
|
|
||||||
when(() => mockIAPStorageService.filmsInUse).thenReturn(mockFilms);
|
|
||||||
|
|
||||||
/// Init
|
|
||||||
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
|
||||||
expectFilmsInUseCount(mockFilms.length + 1);
|
|
||||||
expectSelectedFilmName(mockFilms.first.name);
|
|
||||||
|
|
||||||
/// Select all filmsInUse except the first one
|
|
||||||
await tester.tap(find.byKey(_Application.saveFilmsButtonKey(1)));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expectFilmsCount(mockFilms.length + 1);
|
|
||||||
expectFilmsInUseCount((mockFilms.length - 1) + 1);
|
|
||||||
expectSelectedFilmName('');
|
|
||||||
|
|
||||||
verify(() => mockIAPStorageService.filmsInUse = mockFilms.skip(1).toList()).called(1);
|
|
||||||
verify(() => mockIAPStorageService.selectedFilm = const FilmStub()).called(1);
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'selectFilm',
|
||||||
|
(tester) async {
|
||||||
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn('');
|
||||||
|
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
||||||
|
expectSelectedFilmName('');
|
||||||
|
|
||||||
|
tester.filmsProvider.selectFilm(mockPredefinedFilms.first);
|
||||||
|
await tester.pump();
|
||||||
|
expectSelectedFilmName(mockPredefinedFilms.first.name);
|
||||||
|
|
||||||
|
tester.filmsProvider.selectFilm(mockCustomFilms.first);
|
||||||
|
await tester.pump();
|
||||||
|
expectSelectedFilmName(mockCustomFilms.first.name);
|
||||||
|
|
||||||
|
verify(() => mockFilmsStorageService.selectedFilmId = mockPredefinedFilms.first.id).called(1);
|
||||||
|
verify(() => mockFilmsStorageService.selectedFilmId = mockCustomFilms.first.id).called(1);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'Custom film CRUD',
|
||||||
|
(tester) async {
|
||||||
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn('');
|
||||||
|
when(() => mockFilmsStorageService.getCustomFilms()).thenAnswer((_) => Future.value({}));
|
||||||
|
await pumpTestWidget(tester, IAPProductStatus.purchased);
|
||||||
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
|
expectCustomFilmsCount(0);
|
||||||
|
expectFilmsInUseCount(mockPredefinedFilms.length + 0 + 1);
|
||||||
|
expectSelectedFilmName('');
|
||||||
|
|
||||||
|
await tester.filmsProvider.addCustomFilm(mockCustomFilms.first);
|
||||||
|
await tester.filmsProvider.toggleFilm(mockCustomFilms.first, true);
|
||||||
|
tester.filmsProvider.selectFilm(mockCustomFilms.first);
|
||||||
|
await tester.pump();
|
||||||
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
|
expectCustomFilmsCount(1);
|
||||||
|
expectFilmsInUseCount(mockPredefinedFilms.length + 1 + 1);
|
||||||
|
expectSelectedFilmName(mockCustomFilms.first.name);
|
||||||
|
verify(() => mockFilmsStorageService.addFilm(mockCustomFilms.first)).called(1);
|
||||||
|
verify(() => mockFilmsStorageService.toggleFilm(mockCustomFilms.first, true)).called(1);
|
||||||
|
verify(() => mockFilmsStorageService.selectedFilmId = mockCustomFilms.first.id).called(1);
|
||||||
|
|
||||||
|
const editedFilmName = 'Edited custom film 2x';
|
||||||
|
final editedFilm = mockCustomFilms.first.copyWith(name: editedFilmName);
|
||||||
|
await tester.filmsProvider.updateCustomFilm(editedFilm);
|
||||||
|
await tester.pump();
|
||||||
|
expectSelectedFilmName(editedFilm.name);
|
||||||
|
verify(() => mockFilmsStorageService.updateFilm(editedFilm)).called(1);
|
||||||
|
|
||||||
|
await tester.filmsProvider.deleteCustomFilm(editedFilm);
|
||||||
|
await tester.pump();
|
||||||
|
expectPredefinedFilmsCount(mockPredefinedFilms.length);
|
||||||
|
expectCustomFilmsCount(0);
|
||||||
|
expectFilmsInUseCount(mockPredefinedFilms.length + 0 + 1);
|
||||||
|
expectSelectedFilmName('');
|
||||||
|
verify(() => mockFilmsStorageService.deleteFilm(editedFilm)).called(1);
|
||||||
|
verify(() => mockFilmsStorageService.selectedFilmId = '').called(1);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
extension on WidgetTester {
|
||||||
|
FilmsProviderState get filmsProvider {
|
||||||
|
final BuildContext context = element(find.byType(_Application));
|
||||||
|
return FilmsProvider.of(context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _Application extends StatelessWidget {
|
class _Application extends StatelessWidget {
|
||||||
const _Application();
|
const _Application();
|
||||||
|
|
||||||
static ValueKey saveFilmsButtonKey(int index) => ValueKey('saveFilmsButtonKey$index');
|
|
||||||
static ValueKey setFilmButtonKey(int index) => ValueKey('setFilmButtonKey$index');
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
|
@ -218,42 +239,30 @@ class _Application extends StatelessWidget {
|
||||||
body: Center(
|
body: Center(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Text("Films count: ${Films.of(context).length}"),
|
Text("Predefined films count: ${Films.predefinedFilmsOf(context).length}"),
|
||||||
|
Text("Custom films count: ${Films.customFilmsOf(context).length}"),
|
||||||
Text("Films in use count: ${Films.inUseOf(context).length}"),
|
Text("Films in use count: ${Films.inUseOf(context).length}"),
|
||||||
Text("Selected film: ${Films.selectedOf(context).name}"),
|
Text("Selected film: ${Films.selectedOf(context).name}"),
|
||||||
_filmRow(context, 0),
|
|
||||||
_filmRow(context, 1),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _filmRow(BuildContext context, int index) {
|
|
||||||
return Row(
|
|
||||||
children: [
|
|
||||||
ElevatedButton(
|
|
||||||
key: saveFilmsButtonKey(index),
|
|
||||||
onPressed: () {
|
|
||||||
FilmsProvider.of(context).saveFilms(mockFilms.skip(index).toList());
|
|
||||||
},
|
|
||||||
child: const Text("Save filmsInUse"),
|
|
||||||
),
|
|
||||||
ElevatedButton(
|
|
||||||
key: setFilmButtonKey(index),
|
|
||||||
onPressed: () {
|
|
||||||
FilmsProvider.of(context).setFilm(mockFilms[index]);
|
|
||||||
},
|
|
||||||
child: const Text("Set film"),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const mockFilms = [
|
const mockPredefinedFilms = [
|
||||||
FilmExponential(id: '1', name: 'Mock film 2x', iso: 400, exponent: 1.34),
|
FilmExponential(id: '1', name: 'Mock film 2x', iso: 400, exponent: 1.34),
|
||||||
FilmExponential(id: '2', name: 'Mock film 3x', iso: 800, exponent: 1.34),
|
FilmExponential(id: '2', name: 'Mock film 3x', iso: 800, exponent: 1.34),
|
||||||
FilmExponential(id: '3', name: 'Mock film 4x', iso: 1200, exponent: 1.34),
|
FilmExponential(id: '3', name: 'Mock film 4x', iso: 1200, exponent: 1.34),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const mockCustomFilms = [
|
||||||
|
FilmExponential(id: '1abc', name: 'Mock custom film 2x', iso: 400, exponent: 1.34),
|
||||||
|
FilmExponential(id: '2abc', name: 'Mock custom film 3x', iso: 800, exponent: 1.34),
|
||||||
|
];
|
||||||
|
|
||||||
|
extension on List<Film> {
|
||||||
|
Map<String, ({T film, bool isUsed})> toFilmsMap<T extends Film>() =>
|
||||||
|
Map.fromEntries(map((e) => MapEntry(e.id, (film: e as T, isUsed: true))));
|
||||||
|
}
|
||||||
|
|
|
@ -50,8 +50,8 @@ extension WidgetTesterActions on WidgetTester {
|
||||||
}) async {
|
}) async {
|
||||||
await pumpWidget(
|
await pumpWidget(
|
||||||
Films(
|
Films(
|
||||||
values: const [FilmStub()],
|
predefinedFilms: const {},
|
||||||
filmsInUse: const [FilmStub()],
|
customFilms: const {},
|
||||||
selected: const FilmStub(),
|
selected: const FilmStub(),
|
||||||
child: WidgetTestApplicationMock(
|
child: WidgetTestApplicationMock(
|
||||||
child: Row(
|
child: Row(
|
||||||
|
|
|
@ -10,14 +10,16 @@ import 'package:mocktail/mocktail.dart';
|
||||||
import '../../../../../application_mock.dart';
|
import '../../../../../application_mock.dart';
|
||||||
import 'utils.dart';
|
import 'utils.dart';
|
||||||
|
|
||||||
class _MockIAPStorageService extends Mock implements IAPStorageService {}
|
class _MockFilmsStorageService extends Mock implements FilmsStorageService {}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
late final _MockIAPStorageService mockIAPStorageService;
|
late final _MockFilmsStorageService mockFilmsStorageService;
|
||||||
|
|
||||||
setUpAll(() {
|
setUpAll(() {
|
||||||
mockIAPStorageService = _MockIAPStorageService();
|
mockFilmsStorageService = _MockFilmsStorageService();
|
||||||
when(() => mockIAPStorageService.filmsInUse).thenReturn(_films);
|
when(() => mockFilmsStorageService.getPredefinedFilms()).thenAnswer(
|
||||||
|
(_) => Future.value(Map.fromEntries(_films.map((e) => MapEntry(e.id, (film: e, isUsed: true))))),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
Future<void> pumpApplication(WidgetTester tester) async {
|
Future<void> pumpApplication(WidgetTester tester) async {
|
||||||
|
@ -31,7 +33,7 @@ void main() {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: FilmsProvider(
|
child: FilmsProvider(
|
||||||
storageService: mockIAPStorageService,
|
filmsStorageService: mockFilmsStorageService,
|
||||||
child: const WidgetTestApplicationMock(
|
child: const WidgetTestApplicationMock(
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
|
@ -51,7 +53,7 @@ void main() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'Film.other()',
|
'Film.other()',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(const FilmStub());
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(const FilmStub().id);
|
||||||
await pumpApplication(tester);
|
await pumpApplication(tester);
|
||||||
expectReadingValueContainerText(S.current.film);
|
expectReadingValueContainerText(S.current.film);
|
||||||
expectReadingValueContainerText(S.current.none);
|
expectReadingValueContainerText(S.current.none);
|
||||||
|
@ -61,7 +63,7 @@ void main() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'Film with the same ISO',
|
'Film with the same ISO',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(_films[1]);
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(_films[1].id);
|
||||||
await pumpApplication(tester);
|
await pumpApplication(tester);
|
||||||
expectReadingValueContainerText(S.current.film);
|
expectReadingValueContainerText(S.current.film);
|
||||||
expectReadingValueContainerText(_films[1].name);
|
expectReadingValueContainerText(_films[1].name);
|
||||||
|
@ -71,7 +73,7 @@ void main() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'Film with greater ISO',
|
'Film with greater ISO',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(_films[2]);
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(_films[2].id);
|
||||||
await pumpApplication(tester);
|
await pumpApplication(tester);
|
||||||
expectReadingValueContainerText(S.current.filmPull);
|
expectReadingValueContainerText(S.current.filmPull);
|
||||||
expectReadingValueContainerText(_films[2].name);
|
expectReadingValueContainerText(_films[2].name);
|
||||||
|
@ -81,7 +83,7 @@ void main() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'Film with lower ISO',
|
'Film with lower ISO',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(_films[0]);
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(_films[0].id);
|
||||||
await pumpApplication(tester);
|
await pumpApplication(tester);
|
||||||
expectReadingValueContainerText(S.current.filmPush);
|
expectReadingValueContainerText(S.current.filmPush);
|
||||||
expectReadingValueContainerText(_films[0].name);
|
expectReadingValueContainerText(_films[0].name);
|
||||||
|
@ -92,7 +94,7 @@ void main() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'Film picker shows only films in use',
|
'Film picker shows only films in use',
|
||||||
(tester) async {
|
(tester) async {
|
||||||
when(() => mockIAPStorageService.selectedFilm).thenReturn(_films[0]);
|
when(() => mockFilmsStorageService.selectedFilmId).thenReturn(_films[0].id);
|
||||||
await pumpApplication(tester);
|
await pumpApplication(tester);
|
||||||
await tester.openAnimatedPicker<FilmPicker>();
|
await tester.openAnimatedPicker<FilmPicker>();
|
||||||
expectRadioListTile<Film>(S.current.none, isSelected: true);
|
expectRadioListTile<Film>(S.current.none, isSelected: true);
|
||||||
|
@ -104,8 +106,8 @@ void main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const _films = [
|
const _films = [
|
||||||
FilmExponential(id: '', name: 'ISO 100 Film', iso: 100, exponent: 1.34),
|
FilmExponential(id: '1', name: 'ISO 100 Film', iso: 100, exponent: 1.34),
|
||||||
FilmExponential(id: '', name: 'ISO 400 Film', iso: 400, exponent: 1.34),
|
FilmExponential(id: '2', name: 'ISO 400 Film', iso: 400, exponent: 1.34),
|
||||||
FilmExponential(id: '', name: 'ISO 800 Film', iso: 800, exponent: 1.34),
|
FilmExponential(id: '3', name: 'ISO 800 Film', iso: 800, exponent: 1.34),
|
||||||
FilmExponential(id: '', name: 'ISO 1600 Film', iso: 1600, exponent: 1.34),
|
FilmExponential(id: '4', name: 'ISO 1600 Film', iso: 1600, exponent: 1.34),
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in a new issue