|
17 | 17 | */ |
18 | 18 |
|
19 | 19 | import 'package:flutter/material.dart'; |
20 | | -import 'package:flutter_riverpod/flutter_riverpod.dart' as riverpod; |
| 20 | +import 'package:flutter_riverpod/flutter_riverpod.dart'; |
21 | 21 | import 'package:mockito/mockito.dart'; |
22 | | -import 'package:provider/provider.dart'; |
23 | 22 | import 'package:wger/l10n/generated/app_localizations.dart'; |
24 | | -import 'package:wger/models/workouts/session.dart'; |
25 | | -import 'package:wger/providers/auth.dart'; |
26 | | -import 'package:wger/providers/body_weight.dart'; |
27 | | -import 'package:wger/providers/exercises.dart'; |
28 | | -import 'package:wger/providers/gallery.dart'; |
29 | | -import 'package:wger/providers/measurement.dart'; |
30 | | -import 'package:wger/providers/nutrition.dart'; |
31 | | -import 'package:wger/providers/routines.dart'; |
32 | | -import 'package:wger/providers/user.dart'; |
| 23 | +import 'package:wger/models/measurements/measurement_category.dart'; |
| 24 | +import 'package:wger/providers/auth_notifier.dart'; |
| 25 | +import 'package:wger/providers/auth_state.dart'; |
| 26 | +import 'package:wger/providers/body_weight_repository.dart'; |
| 27 | +import 'package:wger/providers/gallery_repository.dart'; |
| 28 | +import 'package:wger/providers/ingredient_repository.dart'; |
| 29 | +import 'package:wger/providers/measurement_repository.dart'; |
| 30 | +import 'package:wger/providers/nutrition_notifier.dart'; |
| 31 | +import 'package:wger/providers/nutrition_repository.dart'; |
| 32 | +import 'package:wger/providers/routines_notifier.dart'; |
| 33 | +import 'package:wger/providers/user_profile_repository.dart'; |
33 | 34 | import 'package:wger/screens/home_tabs_screen.dart'; |
34 | 35 | import 'package:wger/theme/theme.dart'; |
35 | 36 |
|
36 | | -import '../test/exercises/contribute_exercise_test.mocks.dart'; |
37 | 37 | import '../test/gallery/gallery_form_test.mocks.dart'; |
38 | 38 | import '../test/measurements/measurement_categories_screen_test.mocks.dart'; |
39 | 39 | import '../test/nutrition/nutritional_plan_screen_test.mocks.dart'; |
40 | | -import '../test/routine/weight_unit_form_widget_test.mocks.dart'; |
41 | 40 | import '../test/weight/weight_screen_test.mocks.dart' as weight; |
42 | 41 | import '../test_data/body_weight.dart'; |
43 | 42 | import '../test_data/exercises.dart'; |
| 43 | +import '../test_data/gallery.dart'; |
44 | 44 | import '../test_data/measurements.dart'; |
45 | 45 | import '../test_data/nutritional_plans.dart'; |
46 | 46 | import '../test_data/profile.dart'; |
47 | 47 | import '../test_data/routines.dart'; |
48 | 48 |
|
49 | | -Widget createDashboardScreen({Locale? locale}) { |
50 | | - locale ??= const Locale('en'); |
| 49 | +class _FakeAuthNotifier extends AuthNotifier { |
| 50 | + _FakeAuthNotifier(this._state); |
51 | 51 |
|
52 | | - final mockGalleryProvider = MockGalleryProvider(); |
| 52 | + final AuthState _state; |
53 | 53 |
|
54 | | - final mockExercisesProvider = MockExercisesProvider(); |
| 54 | + @override |
| 55 | + Future<AuthState> build() async => _state; |
| 56 | +} |
55 | 57 |
|
56 | | - final mockAuthProvider = MockAuthProvider(); |
57 | | - when(mockAuthProvider.setServerVersion()).thenAnswer((_) async {}); |
58 | | - when(mockAuthProvider.dataInit).thenReturn(true); |
| 58 | +Widget createDashboardScreen({Locale? locale}) { |
| 59 | + locale ??= const Locale('en'); |
59 | 60 |
|
60 | | - final mockWorkoutProvider = MockRoutinesProvider(); |
61 | | - when(mockWorkoutProvider.items).thenReturn([getTestRoutine(exercises: getScreenshotExercises())]); |
62 | | - when( |
63 | | - mockWorkoutProvider.currentRoutine, |
64 | | - ).thenReturn(getTestRoutine(exercises: getScreenshotExercises())); |
| 61 | + final mockGalleryRepo = MockGalleryRepository(); |
| 62 | + when(mockGalleryRepo.watchAllDrift()).thenAnswer((_) => Stream.value(getTestImages())); |
65 | 63 |
|
66 | | - when(mockWorkoutProvider.fetchSessionData()).thenAnswer( |
67 | | - (a) => Future.value([ |
68 | | - WorkoutSession( |
69 | | - routineId: 1, |
70 | | - date: DateTime.now().add(const Duration(days: -1)), |
71 | | - timeStart: const TimeOfDay(hour: 17, minute: 34), |
72 | | - timeEnd: const TimeOfDay(hour: 19, minute: 3), |
73 | | - impression: 3, |
74 | | - ), |
75 | | - ]), |
76 | | - ); |
| 64 | + final mockNutritionRepo = weight.MockNutritionRepository(); |
| 65 | + final mockIngredientRepo = weight.MockIngredientRepository(); |
| 66 | + when(mockIngredientRepo.getById(any)).thenAnswer((_) async => null); |
77 | 67 |
|
78 | | - final mockNutritionProvider = weight.MockNutritionPlansProvider(); |
| 68 | + final mockBodyWeightRepository = MockBodyWeightRepository(); |
| 69 | + when( |
| 70 | + mockBodyWeightRepository.watchAllDrift(), |
| 71 | + ).thenAnswer((_) => Stream.value(getWeightEntries())); |
79 | 72 |
|
| 73 | + final mockMeasurementRepo = MockMeasurementRepository(); |
80 | 74 | when( |
81 | | - mockNutritionProvider.currentPlan, |
82 | | - ).thenAnswer((realInvocation) => getNutritionalPlanScreenshot()); |
83 | | - when(mockNutritionProvider.items).thenReturn([getNutritionalPlanScreenshot()]); |
| 75 | + mockMeasurementRepo.watchAll(), |
| 76 | + ).thenAnswer((_) => Stream<List<MeasurementCategory>>.value(getMeasurementCategories())); |
84 | 77 |
|
85 | | - final mockWeightProvider = weight.MockBodyWeightProvider(); |
86 | | - when(mockWeightProvider.items).thenReturn(getScreenshotWeightEntries()); |
| 78 | + final mockUserProfileRepo = weight.MockUserProfileRepository(); |
| 79 | + when( |
| 80 | + mockUserProfileRepo.watchDrift(), |
| 81 | + ).thenAnswer((_) => Stream.value(tUserProfile1)); |
87 | 82 |
|
88 | | - final mockMeasurementProvider = MockMeasurementProvider(); |
89 | | - when(mockMeasurementProvider.categories).thenReturn(getMeasurementCategories()); |
| 83 | + const loggedInAuth = AuthState( |
| 84 | + status: AuthStatus.loggedIn, |
| 85 | + credential: LegacyCredential('test-token'), |
| 86 | + serverUrl: 'http://localhost', |
| 87 | + ); |
| 88 | + final container = ProviderContainer.test( |
| 89 | + overrides: [ |
| 90 | + bodyWeightRepositoryProvider.overrideWithValue(mockBodyWeightRepository), |
| 91 | + measurementRepositoryProvider.overrideWithValue(mockMeasurementRepo), |
| 92 | + authProvider.overrideWith(() => _FakeAuthNotifier(loggedInAuth)), |
| 93 | + userProfileRepositoryProvider.overrideWithValue(mockUserProfileRepo), |
| 94 | + nutritionRepositoryProvider.overrideWithValue(mockNutritionRepo), |
| 95 | + ingredientRepositoryProvider.overrideWithValue(mockIngredientRepo), |
| 96 | + galleryRepositoryProvider.overrideWithValue(mockGalleryRepo), |
| 97 | + ], |
| 98 | + ); |
| 99 | + container.read(routinesRiverpodProvider.notifier).state = AsyncData( |
| 100 | + RoutinesState( |
| 101 | + routines: [getTestRoutine(exercises: getScreenshotExercises())], |
| 102 | + ), |
| 103 | + ); |
90 | 104 |
|
91 | | - final mockUserProvider = MockUserProvider(); |
92 | | - when(mockUserProvider.profile).thenReturn(tProfile1); |
93 | | - when(mockUserProvider.dashboardWidgets).thenReturn([ |
94 | | - DashboardWidget.routines, |
95 | | - DashboardWidget.weight, |
96 | | - DashboardWidget.measurements, |
97 | | - DashboardWidget.calendar, |
98 | | - DashboardWidget.nutrition, |
99 | | - DashboardWidget.trophies, |
100 | | - ]); |
| 105 | + // Seed the nutrition notifier with the screenshot plan so the dashboard can |
| 106 | + // show it without going through the server. |
| 107 | + container.read(nutritionProvider.notifier).state = AsyncData( |
| 108 | + NutritionState(plans: [getNutritionalPlanScreenshot()]), |
| 109 | + ); |
101 | 110 |
|
102 | | - return riverpod.ProviderScope( |
103 | | - child: MediaQuery( |
104 | | - data: MediaQueryData.fromView(WidgetsBinding.instance.platformDispatcher.views.first) |
105 | | - .copyWith( |
106 | | - padding: EdgeInsets.zero, |
107 | | - viewPadding: EdgeInsets.zero, |
108 | | - viewInsets: EdgeInsets.zero, |
109 | | - ), |
110 | | - child: MultiProvider( |
111 | | - providers: [ |
112 | | - ChangeNotifierProvider<GalleryProvider>( |
113 | | - create: (context) => mockGalleryProvider, |
114 | | - ), |
115 | | - ChangeNotifierProvider<ExercisesProvider>( |
116 | | - create: (context) => mockExercisesProvider, |
117 | | - ), |
118 | | - ChangeNotifierProvider<AuthProvider>( |
119 | | - create: (context) => mockAuthProvider, |
120 | | - ), |
121 | | - ChangeNotifierProvider<UserProvider>( |
122 | | - create: (context) => mockUserProvider, |
123 | | - ), |
124 | | - ChangeNotifierProvider<RoutinesProvider>( |
125 | | - create: (context) => mockWorkoutProvider, |
126 | | - ), |
127 | | - ChangeNotifierProvider<NutritionPlansProvider>( |
128 | | - create: (context) => mockNutritionProvider, |
129 | | - ), |
130 | | - ChangeNotifierProvider<BodyWeightProvider>( |
131 | | - create: (context) => mockWeightProvider, |
132 | | - ), |
133 | | - ChangeNotifierProvider<MeasurementProvider>( |
134 | | - create: (context) => mockMeasurementProvider, |
135 | | - ), |
136 | | - ], |
137 | | - child: MaterialApp( |
138 | | - locale: locale, |
139 | | - debugShowCheckedModeBanner: false, |
140 | | - localizationsDelegates: AppLocalizations.localizationsDelegates, |
141 | | - supportedLocales: AppLocalizations.supportedLocales, |
142 | | - theme: wgerLightTheme, |
143 | | - home: HomeTabsScreen(), |
144 | | - ), |
| 111 | + return MediaQuery( |
| 112 | + data: MediaQueryData.fromView(WidgetsBinding.instance.platformDispatcher.views.first).copyWith( |
| 113 | + padding: EdgeInsets.zero, |
| 114 | + viewPadding: EdgeInsets.zero, |
| 115 | + viewInsets: EdgeInsets.zero, |
| 116 | + ), |
| 117 | + child: UncontrolledProviderScope( |
| 118 | + container: container, |
| 119 | + child: MaterialApp( |
| 120 | + locale: locale, |
| 121 | + debugShowCheckedModeBanner: false, |
| 122 | + localizationsDelegates: AppLocalizations.localizationsDelegates, |
| 123 | + supportedLocales: AppLocalizations.supportedLocales, |
| 124 | + theme: wgerLightTheme, |
| 125 | + home: HomeTabsScreen(), |
145 | 126 | ), |
146 | 127 | ), |
147 | 128 | ); |
|
0 commit comments