Merge conflicts

This commit is contained in:
Roland Geider
2025-12-04 13:07:39 +01:00
parent d8a5369519
commit b75ee0dece
23 changed files with 284 additions and 127 deletions

View File

@@ -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<NavigatorState>();
final routine = getTestRoutine(exercises: getScreenshotExercises());
routine.sessions.first.session.date = clock.now();
routine.sessions.first.date = clock.now();
final mockRoutinesProvider = MockRoutinesProvider();
final mockExerciseProvider = MockExercisesProvider();

View File

@@ -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';

View File

@@ -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<String, Object> get volume {
Map<String, num> get volume {
final volumeMetric = logs.fold<double>(0, (sum, log) => sum + log.volume(metric: true));
final volumeImperial = logs.fold<double>(0, (sum, log) => sum + log.volume(metric: false));

View File

@@ -40,7 +40,7 @@ final class GymStateNotifierProvider extends $NotifierProvider<GymStateNotifier,
}
}
String _$gymStateNotifierHash() => r'449bd80d3b534f68af4f0dbb8556c7f093f3b918';
String _$gymStateNotifierHash() => r'8474afce33638bf67570fd64b64e9b5d171804d3';
abstract class _$GymStateNotifier extends $Notifier<GymModeState> {
GymModeState build();

View File

@@ -115,7 +115,7 @@ class RoutinesRiverpod extends _$RoutinesRiverpod {
return created;
}
Future<void> fetchAndSetRoutineFull(int routineId) async {
Future<Routine> 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<void> deleteRoutine(int routineId) async {

View File

@@ -118,7 +118,7 @@ final class RoutinesRiverpodProvider extends $NotifierProvider<RoutinesRiverpod,
}
}
String _$routinesRiverpodHash() => r'734c6d30a0888420c443932a552058a1f389627a';
String _$routinesRiverpodHash() => r'7a097555c9718249a21328ac16234ef26e23c453';
abstract class _$RoutinesRiverpod extends $Notifier<RoutinesState> {
RoutinesState build();

View File

@@ -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)),
),
);
}

View File

@@ -155,15 +155,15 @@ class _DashboardCalendarWidgetState extends riverpod.ConsumerState<DashboardCale
time = '(${timeToString(session.timeStart)} - ${timeToString(session.timeEnd)})';
}
// Add events to lists
// Add events to lists
newEvents[date]?.add(
Event(
EventType.session,
'${i18n.impression}: ${session.impressionAsString(context)} $time',
),
);
}
});
Event(
EventType.session,
'${i18n.impression}: ${session.impressionAsString(context)} $time',
),
);
}
if (!mounted) {
return;
}

View File

@@ -21,9 +21,6 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:logging/logging.dart';
import 'package:wger/models/exercises/exercise.dart';
import 'package:wger/models/workouts/day_data.dart';
import 'package:wger/providers/exercise_state_notifier.dart';
import 'package:wger/providers/gym_state.dart';
import 'package:wger/providers/routines.dart';
import 'package:wger/screens/gym_mode.dart';
@@ -66,9 +63,11 @@ class _GymModeState extends ConsumerState<GymMode> {
Future<int> _loadGymState() async {
widget._logger.fine('Loading gym state');
final routine = await context.read<RoutinesProvider>().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,

View File

@@ -99,7 +99,7 @@ class _LogPageState extends ConsumerState<LogPage> {
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<LogPage> {
),
),
),
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<LogFormWidget> {
});
_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(

View File

@@ -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,

View File

@@ -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<WorkoutSummary> {
widget._logger.fine('Loading routine data');
final gymState = ref.read(gymStateProvider);
_routine = await context.read<RoutinesProvider>().fetchAndSetRoutineFull(
gymState.routine.id!,
);
_routine = await ref
.read(routinesRiverpodProvider.notifier)
.fetchAndSetRoutineFull(
gymState.routine.id!,
);
}
@override
@@ -84,7 +85,7 @@ class _WorkoutSummaryState extends ConsumerState<WorkoutSummary> {
} 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<WorkoutSummary> {
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();

View File

@@ -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);
},
),
],

View File

@@ -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});

View File

@@ -37,7 +37,7 @@ class MuscleGroupsCard extends StatelessWidget {
List<MuscleGroup> _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 [];

View File

@@ -74,7 +74,9 @@ class _SessionInfoState extends State<SessionInfo> {
),
SessionRow(
label: i18n.notes,
value: widget._session.notes.isNotEmpty ? widget._session.notes : '-/-',
value: (widget._session.notes != null && widget._session.notes!.isNotEmpty)
? widget._session.notes!
: '-/-',
),
],
),

View File

@@ -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

View File

@@ -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:

View File

@@ -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<String>(
this,
Invocation.getter(#impressionGood),
),
)
as String);
@override
String get impressionNeutral =>
(super.noSuchMethod(
Invocation.getter(#impressionNeutral),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#impressionNeutral),
),
)
as String);
@override
String get impressionBad =>
(super.noSuchMethod(
Invocation.getter(#impressionBad),
returnValue: _i3.dummyValue<String>(
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<String>(
this,
Invocation.getter(#gymModeShowExercises),
),
)
as String);
@override
String get gymModeShowTimer =>
(super.noSuchMethod(
Invocation.getter(#gymModeShowTimer),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#gymModeShowTimer),
),
)
as String);
@override
String get gymModeTimerType =>
(super.noSuchMethod(
Invocation.getter(#gymModeTimerType),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#gymModeTimerType),
),
)
as String);
@override
String get gymModeTimerTypeHelText =>
(super.noSuchMethod(
Invocation.getter(#gymModeTimerTypeHelText),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#gymModeTimerTypeHelText),
),
)
as String);
@override
String get countdown =>
(super.noSuchMethod(
Invocation.getter(#countdown),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#countdown),
),
)
as String);
@override
String get stopwatch =>
(super.noSuchMethod(
Invocation.getter(#stopwatch),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#stopwatch),
),
)
as String);
@override
String get gymModeDefaultCountdownTime =>
(super.noSuchMethod(
Invocation.getter(#gymModeDefaultCountdownTime),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#gymModeDefaultCountdownTime),
),
)
as String);
@override
String get gymModeNotifyOnCountdownFinish =>
(super.noSuchMethod(
Invocation.getter(#gymModeNotifyOnCountdownFinish),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#gymModeNotifyOnCountdownFinish),
),
)
as String);
@override
String get duration =>
(super.noSuchMethod(
Invocation.getter(#duration),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#duration),
),
)
as String);
@override
String get volume =>
(super.noSuchMethod(
Invocation.getter(#volume),
returnValue: _i3.dummyValue<String>(
this,
Invocation.getter(#volume),
),
)
as String);
@override
String get workoutCompleted =>
(super.noSuchMethod(
Invocation.getter(#workoutCompleted),
returnValue: _i3.dummyValue<String>(
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<String>(
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<String>(
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<String>(
this,
Invocation.method(#formMinMaxValues, [min, max]),
),
)
as String);
@override
String enterMinCharacters(String? min) =>
(super.noSuchMethod(

View File

@@ -15,7 +15,6 @@ void main() {
late PlateCalculatorNotifier notifier;
late ProviderContainer container;
late MockSharedPreferencesAsync mockPrefs;
late ProviderContainer container;
setUp(() {
mockPrefs = MockSharedPreferencesAsync();

View File

@@ -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].
///

View File

@@ -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<NavigatorState>();
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<RoutinesProvider>(
create: (context) => mockRoutinesProvider,
child: ChangeNotifierProvider<ExercisesProvider>(
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<void>(
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<List<Exercise>>.value(<Exercise>[])),
],
child: MaterialApp(
locale: Locale(locale),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
navigatorKey: key,
home: TextButton(
onPressed: () => key.currentState!.push(
MaterialPageRoute<void>(
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());

View File

@@ -55,7 +55,7 @@ void main() {
);
notifier.calculatePages();
when(mockRoutinesProvider.editSession(any)).thenAnswer(
(_) => Future.value(testRoutine.sessions[0].session),
(_) => Future.value(testRoutine.sessions[0]),
);
});