From b75ee0decede9e5918e8429bf499ffe0a851467f Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Thu, 4 Dec 2025 13:07:39 +0100 Subject: [PATCH] Merge conflicts --- integration_test/3_gym_mode.dart | 4 +- lib/models/workouts/log.dart | 2 + lib/models/workouts/session.dart | 7 +- lib/providers/gym_state.g.dart | 2 +- lib/providers/routines.dart | 4 +- lib/providers/routines.g.dart | 2 +- lib/screens/gym_mode.dart | 6 +- lib/widgets/dashboard/calendar.dart | 16 +- lib/widgets/routines/gym_mode/gym_mode.dart | 11 +- lib/widgets/routines/gym_mode/log_page.dart | 19 +- .../routines/gym_mode/session_page.dart | 26 ++- lib/widgets/routines/gym_mode/summary.dart | 28 +-- .../routines/logs/day_logs_container.dart | 14 +- .../logs/exercises_expansion_card.dart | 4 +- lib/widgets/routines/logs/muscle_groups.dart | 2 +- lib/widgets/routines/logs/session_info.dart | 4 +- pubspec.lock | 2 +- pubspec.yaml | 1 + test/core/validators_test.mocks.dart | 187 ++++++++++++++++++ test/providers/plate_calculator_test.dart | 1 - .../plate_calculator_test.mocks.dart | 1 + test/routine/gym_mode/gym_mode_test.dart | 66 ++----- test/routine/gym_mode/session_page_test.dart | 2 +- 23 files changed, 284 insertions(+), 127 deletions(-) diff --git a/integration_test/3_gym_mode.dart b/integration_test/3_gym_mode.dart index a47e5f1b..052fdd65 100644 --- a/integration_test/3_gym_mode.dart +++ b/integration_test/3_gym_mode.dart @@ -11,7 +11,7 @@ import 'package:wger/screens/routine_screen.dart'; import 'package:wger/theme/theme.dart'; import 'package:wger/widgets/routines/gym_mode/summary.dart'; -import '../test/routine/gym_mode/gym_mode_test.mocks.dart'; +// import '../test/routine/gym_mode/gym_mode_test.mocks.dart'; import '../test_data/exercises.dart'; import '../test_data/routines.dart'; @@ -68,7 +68,7 @@ Widget createGymModeResultsScreen({String locale = 'en'}) { final key = GlobalKey(); final routine = getTestRoutine(exercises: getScreenshotExercises()); - routine.sessions.first.session.date = clock.now(); + routine.sessions.first.date = clock.now(); final mockRoutinesProvider = MockRoutinesProvider(); final mockExerciseProvider = MockExercisesProvider(); diff --git a/lib/models/workouts/log.dart b/lib/models/workouts/log.dart index 33952e56..53ad6c56 100644 --- a/lib/models/workouts/log.dart +++ b/lib/models/workouts/log.dart @@ -17,8 +17,10 @@ */ import 'package:drift/drift.dart' as drift; +import 'package:flutter/material.dart'; import 'package:wger/database/powersync/database.dart'; import 'package:wger/helpers/consts.dart'; +import 'package:wger/helpers/i18n.dart'; import 'package:wger/helpers/misc.dart'; import 'package:wger/models/exercises/exercise.dart'; import 'package:wger/models/workouts/repetition_unit.dart'; diff --git a/lib/models/workouts/session.dart b/lib/models/workouts/session.dart index 2af41eca..e0115d25 100644 --- a/lib/models/workouts/session.dart +++ b/lib/models/workouts/session.dart @@ -18,11 +18,10 @@ import 'package:drift/drift.dart' as drift; import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; import 'package:wger/database/powersync/database.dart'; -import 'package:wger/models/exercises/exercise.dart'; -import 'package:json_annotation/json_annotation.dart'; -import 'package:wger/helpers/json.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; +import 'package:wger/models/exercises/exercise.dart'; import 'package:wger/models/workouts/log.dart'; const IMPRESSION_MAP = {1: 'bad', 2: 'neutral', 3: 'good'}; @@ -103,7 +102,7 @@ class WorkoutSession { /// Get total volume of the session for metric and imperial units /// (i.e. sets that have "repetitions" as units and weight in kg or lbs). /// Other combinations such as "seconds" are ignored. - Map get volume { + Map get volume { final volumeMetric = logs.fold(0, (sum, log) => sum + log.volume(metric: true)); final volumeImperial = logs.fold(0, (sum, log) => sum + log.volume(metric: false)); diff --git a/lib/providers/gym_state.g.dart b/lib/providers/gym_state.g.dart index 3a858e5e..1ddf6b8b 100644 --- a/lib/providers/gym_state.g.dart +++ b/lib/providers/gym_state.g.dart @@ -40,7 +40,7 @@ final class GymStateNotifierProvider extends $NotifierProvider r'449bd80d3b534f68af4f0dbb8556c7f093f3b918'; +String _$gymStateNotifierHash() => r'8474afce33638bf67570fd64b64e9b5d171804d3'; abstract class _$GymStateNotifier extends $Notifier { GymModeState build(); diff --git a/lib/providers/routines.dart b/lib/providers/routines.dart index f8dba9fa..e16f1f12 100644 --- a/lib/providers/routines.dart +++ b/lib/providers/routines.dart @@ -115,7 +115,7 @@ class RoutinesRiverpod extends _$RoutinesRiverpod { return created; } - Future fetchAndSetRoutineFull(int routineId) async { + Future fetchAndSetRoutineFull(int routineId) async { final repo = ref.read(routinesRepositoryProvider); final exercises = await ref.read(exercisesProvider.future); final repetitionUnits = await ref.read(routineRepetitionUnitProvider.future); @@ -153,6 +153,8 @@ class RoutinesRiverpod extends _$RoutinesRiverpod { updatedRoutines.add(routine); } state = state.copyWith(routines: updatedRoutines); + + return routine; } Future deleteRoutine(int routineId) async { diff --git a/lib/providers/routines.g.dart b/lib/providers/routines.g.dart index 94a3f450..f7173a40 100644 --- a/lib/providers/routines.g.dart +++ b/lib/providers/routines.g.dart @@ -118,7 +118,7 @@ final class RoutinesRiverpodProvider extends $NotifierProvider r'734c6d30a0888420c443932a552058a1f389627a'; +String _$routinesRiverpodHash() => r'7a097555c9718249a21328ac16234ef26e23c453'; abstract class _$RoutinesRiverpod extends $Notifier { RoutinesState build(); diff --git a/lib/screens/gym_mode.dart b/lib/screens/gym_mode.dart index 3d0a9fda..9b54459f 100644 --- a/lib/screens/gym_mode.dart +++ b/lib/screens/gym_mode.dart @@ -19,7 +19,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:wger/core/wide_screen_wrapper.dart'; -import 'package:wger/providers/routines.dart'; import 'package:wger/widgets/routines/gym_mode/gym_mode.dart'; class GymModeArguments { @@ -43,10 +42,7 @@ class GymModeScreen extends ConsumerWidget { // backgroundColor: Theme.of(context).cardColor, // primary: false, body: SafeArea( - child: WidescreenWrapper( - child: GymMode(args), - ), - ), + child: WidescreenWrapper(child: GymMode(args)), ), ); } diff --git a/lib/widgets/dashboard/calendar.dart b/lib/widgets/dashboard/calendar.dart index 762ee221..88ef1396 100644 --- a/lib/widgets/dashboard/calendar.dart +++ b/lib/widgets/dashboard/calendar.dart @@ -155,15 +155,15 @@ class _DashboardCalendarWidgetState extends riverpod.ConsumerState { Future _loadGymState() async { widget._logger.fine('Loading gym state'); - final routine = await context.read().fetchAndSetRoutineFull( - widget._args.routineId, - ); + final routine = await ref + .read(routinesRiverpodProvider.notifier) + .fetchAndSetRoutineFull( + widget._args.routineId, + ); final gymViewModel = ref.read(gymStateProvider.notifier); final initialPage = gymViewModel.initData( routine, diff --git a/lib/widgets/routines/gym_mode/log_page.dart b/lib/widgets/routines/gym_mode/log_page.dart index 8edc8ea0..0e35294d 100644 --- a/lib/widgets/routines/gym_mode/log_page.dart +++ b/lib/widgets/routines/gym_mode/log_page.dart @@ -99,7 +99,7 @@ class _LogPageState extends ConsumerState { return Column( children: [ NavigationHeader( - log.exercise.getTranslation(Localizations.localeOf(context).languageCode).name, + log.exerciseObj.getTranslation(Localizations.localeOf(context).languageCode).name, widget._controller, ), @@ -141,15 +141,15 @@ class _LogPageState extends ConsumerState { ), ), ), - if (log.exercise.showPlateCalculator) const LogsPlatesWidget(), + if (log.exerciseObj.showPlateCalculator) const LogsPlatesWidget(), if (slotEntryPage.setConfigData!.comment.isNotEmpty) Text(slotEntryPage.setConfigData!.comment, textAlign: TextAlign.center), const SizedBox(height: 10), Expanded( - child: (state.routine.filterLogsByExercise(log.exercise.id!).isNotEmpty) + child: (state.routine.filterLogsByExercise(log.exerciseId).isNotEmpty) ? LogsPastLogsWidget( log: log, - pastLogs: state.routine.filterLogsByExercise(log.exercise.id!), + pastLogs: state.routine.filterLogsByExercise(log.exerciseId), onCopy: (pastLog) { _logFormKey.currentState?.copyFromPastLog(pastLog); }, @@ -693,13 +693,12 @@ class _LogFormWidgetState extends ConsumerState { }); _form.currentState!.save(); - try { - final gymState = ref.read(gymStateProvider); - final gymProvider = ref.read(gymStateProvider.notifier); + final gymState = ref.read(gymStateProvider); + final gymProvider = ref.read(gymStateProvider.notifier); - logProvider.addEntry(_log); - final page = gymState.getSlotEntryPageByIndex()!; - gymProvider.markSlotPageAsDone(page.uuid, isDone: true); + logProvider.addEntry(_log); + final page = gymState.getSlotEntryPageByIndex()!; + gymProvider.markSlotPageAsDone(page.uuid, isDone: true); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( diff --git a/lib/widgets/routines/gym_mode/session_page.dart b/lib/widgets/routines/gym_mode/session_page.dart index 51830cb5..b583ba97 100644 --- a/lib/widgets/routines/gym_mode/session_page.dart +++ b/lib/widgets/routines/gym_mode/session_page.dart @@ -35,19 +35,17 @@ class SessionPage extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final state = ref.watch(gymStateProvider); - final session = state.routine.sessions - .map((sessionApi) => sessionApi.session) - .firstWhere( - (session) => session.date.isSameDayAs(clock.now()), - orElse: () => WorkoutSession( - dayId: state.dayId, - routineId: state.routine.id, - impression: DEFAULT_IMPRESSION, - date: clock.now(), - timeStart: state.startTime, - timeEnd: TimeOfDay.fromDateTime(clock.now()), - ), - ); + final session = state.routine.sessions.firstWhere( + (session) => session.date.isSameDayAs(clock.now()), + orElse: () => WorkoutSession( + dayId: state.dayId, + routineId: state.routine.id, + impression: DEFAULT_IMPRESSION, + date: clock.now(), + timeStart: state.startTime, + timeEnd: TimeOfDay.fromDateTime(clock.now()), + ), + ); return Column( children: [ @@ -59,7 +57,7 @@ class SessionPage extends ConsumerWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: SessionForm( - state.routine.id, + state.routine.id!, onSaved: () => _controller.nextPage( duration: DEFAULT_ANIMATION_DURATION, curve: DEFAULT_ANIMATION_CURVE, diff --git a/lib/widgets/routines/gym_mode/summary.dart b/lib/widgets/routines/gym_mode/summary.dart index 439d7a0d..4b021ac3 100644 --- a/lib/widgets/routines/gym_mode/summary.dart +++ b/lib/widgets/routines/gym_mode/summary.dart @@ -21,11 +21,10 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:logging/logging.dart'; -import 'package:provider/provider.dart'; import 'package:wger/helpers/date.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; import 'package:wger/models/workouts/routine.dart'; -import 'package:wger/models/workouts/session_api.dart'; +import 'package:wger/models/workouts/session.dart'; import 'package:wger/providers/gym_state.dart'; import 'package:wger/providers/routines.dart'; import 'package:wger/widgets/core/progress_indicator.dart'; @@ -59,9 +58,11 @@ class _WorkoutSummaryState extends ConsumerState { widget._logger.fine('Loading routine data'); final gymState = ref.read(gymStateProvider); - _routine = await context.read().fetchAndSetRoutineFull( - gymState.routine.id!, - ); + _routine = await ref + .read(routinesRiverpodProvider.notifier) + .fetchAndSetRoutineFull( + gymState.routine.id!, + ); } @override @@ -84,7 +85,7 @@ class _WorkoutSummaryState extends ConsumerState { } else if (snapshot.connectionState == ConnectionState.done) { return WorkoutSessionStats( _routine.sessions.firstWhereOrNull( - (s) => s.session.date.isSameDayAs(clock.now()), + (s) => s.date.isSameDayAs(clock.now()), ), ); } @@ -101,15 +102,15 @@ class _WorkoutSummaryState extends ConsumerState { class WorkoutSessionStats extends ConsumerWidget { final _logger = Logger('WorkoutSessionStats'); - final WorkoutSessionApi? _sessionApi; + final WorkoutSession? _session; - WorkoutSessionStats(this._sessionApi, {super.key}); + WorkoutSessionStats(this._session, {super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final i18n = AppLocalizations.of(context); - if (_sessionApi == null) { + if (_session == null) { return Center( child: Text( 'Nothing logged yet.', @@ -118,9 +119,8 @@ class WorkoutSessionStats extends ConsumerWidget { ); } - final session = _sessionApi.session; - final sessionDuration = session.duration; - final totalVolume = _sessionApi.volume; + final sessionDuration = _session.duration; + final totalVolume = _session.volume; /// We assume that users will do exercises (mostly) either in metric or imperial /// units so we just display the higher one. @@ -166,9 +166,9 @@ class WorkoutSessionStats extends ConsumerWidget { // color: theme.colorScheme.tertiaryContainer, // ), const SizedBox(height: 10), - MuscleGroupsCard(_sessionApi.logs), + MuscleGroupsCard(_session.logs), const SizedBox(height: 10), - ExercisesCard(_sessionApi), + ExercisesCard(_session), FilledButton( onPressed: () { ref.read(gymStateProvider.notifier).clear(); diff --git a/lib/widgets/routines/logs/day_logs_container.dart b/lib/widgets/routines/logs/day_logs_container.dart index 49d829b0..c2881f3d 100644 --- a/lib/widgets/routines/logs/day_logs_container.dart +++ b/lib/widgets/routines/logs/day_logs_container.dart @@ -33,16 +33,16 @@ class DayLogWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final sessionApi = _routine.sessions.firstWhere( - (sessionApi) => sessionApi.session.date.isSameDayAs(_date), + final session = _routine.sessions.firstWhere( + (s) => s.date.isSameDayAs(_date), ); - final exercises = sessionApi.exercises; + final exercises = session.exercises; return Column( spacing: 10, children: [ - Card(child: SessionInfo(sessionApi.session)), - MuscleGroupsCard(sessionApi.logs), + Card(child: SessionInfo(session)), + MuscleGroupsCard(session.logs), Column( spacing: 10, @@ -60,7 +60,7 @@ class DayLogWidget extends StatelessWidget { translation.name, style: Theme.of(context).textTheme.titleLarge, ), - ...sessionApi.logs + ...session.logs .where((l) => l.exerciseId == exercise.id) .map( (log) => Row( @@ -71,7 +71,7 @@ class DayLogWidget extends StatelessWidget { icon: const Icon(Icons.delete), key: ValueKey('delete-log-${log.id}'), onPressed: () { - showDeleteDialog(context, translation.name, log); + showDeleteLogDialog(context, translation.name, log); }, ), ], diff --git a/lib/widgets/routines/logs/exercises_expansion_card.dart b/lib/widgets/routines/logs/exercises_expansion_card.dart index 0286418f..ed33327e 100644 --- a/lib/widgets/routines/logs/exercises_expansion_card.dart +++ b/lib/widgets/routines/logs/exercises_expansion_card.dart @@ -21,10 +21,10 @@ import 'package:wger/helpers/i18n.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; import 'package:wger/models/exercises/exercise.dart'; import 'package:wger/models/workouts/log.dart'; -import 'package:wger/models/workouts/session_api.dart'; +import 'package:wger/models/workouts/session.dart'; class ExercisesCard extends StatelessWidget { - final WorkoutSessionApi session; + final WorkoutSession session; const ExercisesCard(this.session, {super.key}); diff --git a/lib/widgets/routines/logs/muscle_groups.dart b/lib/widgets/routines/logs/muscle_groups.dart index 1ef2b0e9..5b280848 100644 --- a/lib/widgets/routines/logs/muscle_groups.dart +++ b/lib/widgets/routines/logs/muscle_groups.dart @@ -37,7 +37,7 @@ class MuscleGroupsCard extends StatelessWidget { List _getMuscleGroups(BuildContext context) { final allMuscles = logs - .expand((log) => [...log.exercise.muscles, ...log.exercise.musclesSecondary]) + .expand((log) => [...log.exerciseObj.muscles, ...log.exerciseObj.musclesSecondary]) .toList(); if (allMuscles.isEmpty) { return []; diff --git a/lib/widgets/routines/logs/session_info.dart b/lib/widgets/routines/logs/session_info.dart index a8293010..45007538 100644 --- a/lib/widgets/routines/logs/session_info.dart +++ b/lib/widgets/routines/logs/session_info.dart @@ -74,7 +74,9 @@ class _SessionInfoState extends State { ), SessionRow( label: i18n.notes, - value: widget._session.notes.isNotEmpty ? widget._session.notes : '-/-', + value: (widget._session.notes != null && widget._session.notes!.isNotEmpty) + ? widget._session.notes! + : '-/-', ), ], ), diff --git a/pubspec.lock b/pubspec.lock index 8e6954e2..59597dbd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -474,7 +474,7 @@ packages: source: hosted version: "8.4.0" flex_seed_scheme: - dependency: "direct main" + dependency: transitive description: name: flex_seed_scheme sha256: a3183753bbcfc3af106224bff3ab3e1844b73f58062136b7499919f49f3667e7 diff --git a/pubspec.yaml b/pubspec.yaml index 2ed17f4d..8aa5ad8f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -72,6 +72,7 @@ dependencies: stream_transform: ^2.1.1 state_notifier: ^1.0.0 connectivity_plus: ^7.0.0 + powersync: ^1.16.2 dev_dependencies: flutter_test: diff --git a/test/core/validators_test.mocks.dart b/test/core/validators_test.mocks.dart index 463dc87d..717e1334 100644 --- a/test/core/validators_test.mocks.dart +++ b/test/core/validators_test.mocks.dart @@ -920,6 +920,39 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations { ) as String); + @override + String get impressionGood => + (super.noSuchMethod( + Invocation.getter(#impressionGood), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#impressionGood), + ), + ) + as String); + + @override + String get impressionNeutral => + (super.noSuchMethod( + Invocation.getter(#impressionNeutral), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#impressionNeutral), + ), + ) + as String); + + @override + String get impressionBad => + (super.noSuchMethod( + Invocation.getter(#impressionBad), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#impressionBad), + ), + ) + as String); + @override String get impression => (super.noSuchMethod( @@ -1074,6 +1107,127 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations { ) as String); + @override + String get gymModeShowExercises => + (super.noSuchMethod( + Invocation.getter(#gymModeShowExercises), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#gymModeShowExercises), + ), + ) + as String); + + @override + String get gymModeShowTimer => + (super.noSuchMethod( + Invocation.getter(#gymModeShowTimer), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#gymModeShowTimer), + ), + ) + as String); + + @override + String get gymModeTimerType => + (super.noSuchMethod( + Invocation.getter(#gymModeTimerType), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#gymModeTimerType), + ), + ) + as String); + + @override + String get gymModeTimerTypeHelText => + (super.noSuchMethod( + Invocation.getter(#gymModeTimerTypeHelText), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#gymModeTimerTypeHelText), + ), + ) + as String); + + @override + String get countdown => + (super.noSuchMethod( + Invocation.getter(#countdown), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#countdown), + ), + ) + as String); + + @override + String get stopwatch => + (super.noSuchMethod( + Invocation.getter(#stopwatch), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#stopwatch), + ), + ) + as String); + + @override + String get gymModeDefaultCountdownTime => + (super.noSuchMethod( + Invocation.getter(#gymModeDefaultCountdownTime), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#gymModeDefaultCountdownTime), + ), + ) + as String); + + @override + String get gymModeNotifyOnCountdownFinish => + (super.noSuchMethod( + Invocation.getter(#gymModeNotifyOnCountdownFinish), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#gymModeNotifyOnCountdownFinish), + ), + ) + as String); + + @override + String get duration => + (super.noSuchMethod( + Invocation.getter(#duration), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#duration), + ), + ) + as String); + + @override + String get volume => + (super.noSuchMethod( + Invocation.getter(#volume), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#volume), + ), + ) + as String); + + @override + String get workoutCompleted => + (super.noSuchMethod( + Invocation.getter(#workoutCompleted), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#workoutCompleted), + ), + ) + as String); + @override String get plateCalculator => (super.noSuchMethod( @@ -2858,6 +3012,17 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations { ) as String); + @override + String get superset => + (super.noSuchMethod( + Invocation.getter(#superset), + returnValue: _i3.dummyValue( + this, + Invocation.getter(#superset), + ), + ) + as String); + @override String get setHasProgression => (super.noSuchMethod( @@ -3667,6 +3832,17 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations { ) as String); + @override + String durationHoursMinutes(int? hours, int? minutes) => + (super.noSuchMethod( + Invocation.method(#durationHoursMinutes, [hours, minutes]), + returnValue: _i3.dummyValue( + this, + Invocation.method(#durationHoursMinutes, [hours, minutes]), + ), + ) + as String); + @override String chartAllTimeTitle(String? name) => (super.noSuchMethod( @@ -3755,6 +3931,17 @@ class MockAppLocalizations extends _i1.Mock implements _i2.AppLocalizations { ) as String); + @override + String formMinMaxValues(int? min, int? max) => + (super.noSuchMethod( + Invocation.method(#formMinMaxValues, [min, max]), + returnValue: _i3.dummyValue( + this, + Invocation.method(#formMinMaxValues, [min, max]), + ), + ) + as String); + @override String enterMinCharacters(String? min) => (super.noSuchMethod( diff --git a/test/providers/plate_calculator_test.dart b/test/providers/plate_calculator_test.dart index 5025e296..3ebcd333 100644 --- a/test/providers/plate_calculator_test.dart +++ b/test/providers/plate_calculator_test.dart @@ -15,7 +15,6 @@ void main() { late PlateCalculatorNotifier notifier; late ProviderContainer container; late MockSharedPreferencesAsync mockPrefs; - late ProviderContainer container; setUp(() { mockPrefs = MockSharedPreferencesAsync(); diff --git a/test/providers/plate_calculator_test.mocks.dart b/test/providers/plate_calculator_test.mocks.dart index bcba37ab..9b3fed8e 100644 --- a/test/providers/plate_calculator_test.mocks.dart +++ b/test/providers/plate_calculator_test.mocks.dart @@ -21,6 +21,7 @@ import 'package:shared_preferences/src/shared_preferences_async.dart' as _i2; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member /// A class which mocks [SharedPreferencesAsync]. /// diff --git a/test/routine/gym_mode/gym_mode_test.dart b/test/routine/gym_mode/gym_mode_test.dart index 38a3e296..278cf9bd 100644 --- a/test/routine/gym_mode/gym_mode_test.dart +++ b/test/routine/gym_mode/gym_mode_test.dart @@ -20,14 +20,11 @@ import 'package:clock/clock.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart' as riverpod; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:provider/provider.dart'; import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; -import 'package:wger/providers/base_provider.dart'; -import 'package:wger/providers/exercises.dart'; +import 'package:wger/models/exercises/exercise.dart'; +import 'package:wger/providers/exercise_data.dart'; import 'package:wger/providers/routines.dart'; import 'package:wger/screens/gym_mode.dart'; import 'package:wger/screens/routine_screen.dart'; @@ -43,54 +40,38 @@ import 'package:wger/widgets/routines/gym_mode/timer.dart'; import '../../../test_data/exercises.dart'; import '../../../test_data/routines.dart'; -import 'gym_mode_test.mocks.dart'; -@GenerateMocks([WgerBaseProvider, ExercisesProvider, RoutinesProvider]) void main() { final key = GlobalKey(); - final mockRoutinesProvider = MockRoutinesProvider(); - final mockExerciseProvider = MockExercisesProvider(); final testRoutine = getTestRoutine(); final testExercises = getTestExercises(); setUp(() { - when(mockRoutinesProvider.findById(any)).thenReturn(testRoutine); - when(mockRoutinesProvider.items).thenReturn([testRoutine]); - when(mockRoutinesProvider.repetitionUnits).thenReturn(testRepetitionUnits); - when(mockRoutinesProvider.findRepetitionUnitById(1)).thenReturn(testRepetitionUnit1); - when(mockRoutinesProvider.weightUnits).thenReturn(testWeightUnits); - when(mockRoutinesProvider.findWeightUnitById(1)).thenReturn(testWeightUnit1); - when( - mockRoutinesProvider.fetchAndSetRoutineFull(any), - ).thenAnswer((_) => Future.value(testRoutine)); - SharedPreferencesAsyncPlatform.instance = InMemorySharedPreferencesAsync.empty(); }); Widget renderGymMode({locale = 'en'}) { - return ChangeNotifierProvider( - create: (context) => mockRoutinesProvider, - child: ChangeNotifierProvider( - create: (context) => mockExerciseProvider, - child: riverpod.ProviderScope( - child: MaterialApp( - locale: Locale(locale), - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, - navigatorKey: key, - home: TextButton( - onPressed: () => key.currentState!.push( - MaterialPageRoute( - settings: const RouteSettings(arguments: GymModeArguments(1, 1, 1)), - builder: (_) => const GymModeScreen(), - ), - ), - child: const SizedBox(), + return riverpod.ProviderScope( + overrides: [ + routinesRiverpodProvider.overrideWithValue(RoutinesState(routines: [testRoutine])), + exercisesProvider.overrideWith((ref) => Stream>.value([])), + ], + child: MaterialApp( + locale: Locale(locale), + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + navigatorKey: key, + home: TextButton( + onPressed: () => key.currentState!.push( + MaterialPageRoute( + settings: const RouteSettings(arguments: GymModeArguments(1, 1, 1)), + builder: (_) => const GymModeScreen(), ), - routes: {RoutineScreen.routeName: (ctx) => const RoutineScreen()}, ), + child: const SizedBox(), ), + routes: {RoutineScreen.routeName: (ctx) => const RoutineScreen()}, ), ); } @@ -98,15 +79,6 @@ void main() { testWidgets( 'Test the widgets on the gym mode screen', (WidgetTester tester) async { - when(mockExerciseProvider.findExerciseById(1)).thenReturn(testExercises[0]); - when(mockExerciseProvider.findExerciseById(6)).thenReturn(testExercises[5]); - when( - mockExerciseProvider.findExercisesByVariationId( - null, - exerciseIdToExclude: anyNamed('exerciseIdToExclude'), - ), - ).thenReturn([]); - await withClock(Clock.fixed(DateTime(2025, 3, 29, 14, 33)), () async { await tester.pumpWidget(renderGymMode()); diff --git a/test/routine/gym_mode/session_page_test.dart b/test/routine/gym_mode/session_page_test.dart index 273e8700..3939a52c 100644 --- a/test/routine/gym_mode/session_page_test.dart +++ b/test/routine/gym_mode/session_page_test.dart @@ -55,7 +55,7 @@ void main() { ); notifier.calculatePages(); when(mockRoutinesProvider.editSession(any)).thenAnswer( - (_) => Future.value(testRoutine.sessions[0].session), + (_) => Future.value(testRoutine.sessions[0]), ); });