mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
This puts this code in sync with the backend and is logically better, since the translations can be displayed when needed and are not hard coded
435 lines
13 KiB
Dart
435 lines
13 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:integration_test/integration_test.dart';
|
|
import 'package:mockito/mockito.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:wger/models/body_weight/weight_entry.dart';
|
|
import 'package:wger/models/exercises/exercise.dart';
|
|
import 'package:wger/models/nutrition/ingredient.dart';
|
|
import 'package:wger/models/nutrition/log.dart';
|
|
import 'package:wger/models/nutrition/meal.dart';
|
|
import 'package:wger/models/nutrition/meal_item.dart';
|
|
import 'package:wger/models/nutrition/nutritional_plan.dart';
|
|
import 'package:wger/models/workouts/day.dart';
|
|
import 'package:wger/models/workouts/set.dart';
|
|
import 'package:wger/models/workouts/setting.dart';
|
|
import 'package:wger/models/workouts/workout_plan.dart';
|
|
import 'package:wger/providers/body_weight.dart';
|
|
import 'package:wger/providers/exercises.dart';
|
|
import 'package:wger/providers/nutrition.dart';
|
|
import 'package:wger/providers/workout_plans.dart';
|
|
import 'package:wger/screens/form_screen.dart';
|
|
import 'package:wger/screens/gym_mode.dart';
|
|
import 'package:wger/screens/nutritional_plan_screen.dart';
|
|
import 'package:wger/screens/weight_screen.dart';
|
|
import 'package:wger/screens/workout_plan_screen.dart';
|
|
import 'package:wger/theme/theme.dart';
|
|
|
|
import '../test/other/base_provider_test.mocks.dart';
|
|
import '../test/utils.dart';
|
|
import '../test/workout/gym_mode_screen_test.mocks.dart';
|
|
import '../test_data/exercises.dart';
|
|
import '../test_data/workouts.dart';
|
|
|
|
Future<void> takeScreenshot(tester, binding, name) async {
|
|
if (Platform.isAndroid) {
|
|
await binding.convertFlutterSurfaceToImage();
|
|
await tester.pumpAndSettle();
|
|
}
|
|
await binding.takeScreenshot(name);
|
|
}
|
|
|
|
// Languages for which the translations are almost complete in weblate
|
|
const languages = ['de', 'en', 'es', 'it', 'jp', 'ca', 'pt', 'ru', 'tr', 'zh', 'fr', 'he'];
|
|
|
|
void main() {
|
|
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
|
|
|
Widget createNutritionalPlanScreen({locale = 'en'}) {
|
|
final key = GlobalKey<NavigatorState>();
|
|
final client = MockClient();
|
|
|
|
final muesli = Ingredient(
|
|
id: 1,
|
|
code: '123456787',
|
|
name: 'Müsli',
|
|
creationDate: DateTime(2021, 5, 1),
|
|
energy: 500,
|
|
carbohydrates: 10,
|
|
carbohydratesSugar: 2,
|
|
protein: 5,
|
|
fat: 20,
|
|
fatSaturated: 7,
|
|
fibres: 12,
|
|
sodium: 0.5,
|
|
);
|
|
final milk = Ingredient(
|
|
id: 1,
|
|
code: '123456787',
|
|
name: 'Milk',
|
|
creationDate: DateTime(2021, 5, 1),
|
|
energy: 500,
|
|
carbohydrates: 10,
|
|
carbohydratesSugar: 2,
|
|
protein: 5,
|
|
fat: 20,
|
|
fatSaturated: 7,
|
|
fibres: 12,
|
|
sodium: 0.5,
|
|
);
|
|
final apple = Ingredient(
|
|
id: 1,
|
|
code: '123456787',
|
|
name: 'Apple',
|
|
creationDate: DateTime(2021, 5, 1),
|
|
energy: 500,
|
|
carbohydrates: 10,
|
|
carbohydratesSugar: 2,
|
|
protein: 5,
|
|
fat: 20,
|
|
fatSaturated: 7,
|
|
fibres: 12,
|
|
sodium: 0.5,
|
|
);
|
|
|
|
final mealItem1 = MealItem(ingredientId: 1, amount: 100, ingredient: muesli);
|
|
final mealItem2 = MealItem(ingredientId: 2, amount: 75, ingredient: milk);
|
|
final mealItem3 = MealItem(ingredientId: 3, amount: 100, ingredient: apple);
|
|
|
|
final meal1 = Meal(
|
|
id: 1,
|
|
plan: 1,
|
|
time: const TimeOfDay(hour: 8, minute: 30),
|
|
name: 'Breakfast',
|
|
mealItems: [mealItem1, mealItem2],
|
|
);
|
|
|
|
final meal2 = Meal(
|
|
id: 2,
|
|
plan: 1,
|
|
time: const TimeOfDay(hour: 11, minute: 0),
|
|
name: 'Snack 1',
|
|
mealItems: [mealItem3],
|
|
);
|
|
|
|
final NutritionalPlan plan = NutritionalPlan(
|
|
id: 1,
|
|
description: 'Mini diet',
|
|
creationDate: DateTime(2021, 5, 23),
|
|
meals: [meal1, meal2],
|
|
);
|
|
|
|
// Add logs
|
|
plan.logs.add(Log.fromMealItem(mealItem1, 1, 1, DateTime(2021, 6, 1)));
|
|
plan.logs.add(Log.fromMealItem(mealItem2, 1, 1, DateTime(2021, 6, 1)));
|
|
plan.logs.add(Log.fromMealItem(mealItem3, 1, 1, DateTime(2021, 6, 10)));
|
|
|
|
return MultiProvider(
|
|
providers: [
|
|
ChangeNotifierProvider<NutritionPlansProvider>(
|
|
create: (context) => NutritionPlansProvider(testAuthProvider, [], client),
|
|
),
|
|
ChangeNotifierProvider<BodyWeightProvider>(
|
|
create: (context) => BodyWeightProvider(testAuthProvider, [], client),
|
|
),
|
|
],
|
|
child: MaterialApp(
|
|
locale: Locale(locale),
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
theme: wgerTheme,
|
|
navigatorKey: key,
|
|
home: TextButton(
|
|
onPressed: () => key.currentState!.push(
|
|
MaterialPageRoute<void>(
|
|
settings: RouteSettings(arguments: plan),
|
|
builder: (_) => NutritionalPlanScreen(),
|
|
),
|
|
),
|
|
child: const SizedBox(),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget createWeightScreen({locale = 'en'}) {
|
|
return ChangeNotifierProvider<BodyWeightProvider>(
|
|
create: (context) => BodyWeightProvider(
|
|
testAuthProvider,
|
|
[
|
|
WeightEntry(id: 1, weight: 86, date: DateTime(2021, 01, 01)),
|
|
WeightEntry(id: 2, weight: 81, date: DateTime(2021, 01, 10)),
|
|
WeightEntry(id: 3, weight: 82, date: DateTime(2021, 01, 20)),
|
|
WeightEntry(id: 4, weight: 83, date: DateTime(2021, 01, 30)),
|
|
WeightEntry(id: 5, weight: 86, date: DateTime(2021, 02, 20)),
|
|
WeightEntry(id: 6, weight: 90, date: DateTime(2021, 02, 28)),
|
|
WeightEntry(id: 7, weight: 91, date: DateTime(2021, 03, 20)),
|
|
WeightEntry(id: 8, weight: 91.1, date: DateTime(2021, 03, 30)),
|
|
WeightEntry(id: 9, weight: 90, date: DateTime(2021, 05, 1)),
|
|
WeightEntry(id: 10, weight: 91, date: DateTime(2021, 6, 5)),
|
|
WeightEntry(id: 11, weight: 89, date: DateTime(2021, 6, 20)),
|
|
WeightEntry(id: 12, weight: 88, date: DateTime(2021, 7, 15)),
|
|
WeightEntry(id: 13, weight: 86, date: DateTime(2021, 7, 20)),
|
|
WeightEntry(id: 14, weight: 83, date: DateTime(2021, 7, 30)),
|
|
WeightEntry(id: 15, weight: 80, date: DateTime(2021, 8, 10))
|
|
],
|
|
MockClient(),
|
|
),
|
|
child: MaterialApp(
|
|
locale: Locale(locale),
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
theme: wgerTheme,
|
|
home: WeightScreen(),
|
|
routes: {
|
|
FormScreen.routeName: (ctx) => FormScreen(),
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget createGymModeScreen({locale = 'en'}) {
|
|
final key = GlobalKey<NavigatorState>();
|
|
final client = MockClient();
|
|
|
|
final squats = Exercise(
|
|
id: 1,
|
|
uuid: 'uuid',
|
|
creationDate: DateTime(2021, 1, 15),
|
|
name: 'Squats',
|
|
description: 'add clever text',
|
|
baseId: tBase1,
|
|
language: tLanguage1,
|
|
);
|
|
|
|
final benchPress = Exercise(
|
|
id: 1,
|
|
uuid: 'uuid',
|
|
creationDate: DateTime(2021, 1, 15),
|
|
name: 'Bench press',
|
|
description: 'add clever text',
|
|
baseId: tBase1,
|
|
language: tLanguage1,
|
|
);
|
|
|
|
final deadLift = Exercise(
|
|
id: 1,
|
|
uuid: 'uuid',
|
|
creationDate: DateTime(2021, 1, 15),
|
|
name: 'deadLift',
|
|
description: 'add clever text',
|
|
baseId: tBase1,
|
|
language: tLanguage1,
|
|
);
|
|
|
|
final crunches = Exercise(
|
|
id: 1,
|
|
uuid: 'uuid',
|
|
creationDate: DateTime(2021, 1, 15),
|
|
name: 'Crunches',
|
|
description: 'add clever text',
|
|
baseId: tBase1,
|
|
language: tLanguage1,
|
|
);
|
|
|
|
final mockExerciseProvider = MockExercisesProvider();
|
|
when(mockExerciseProvider.findExerciseById(1)).thenReturn(squats);
|
|
when(mockExerciseProvider.findExerciseById(2)).thenReturn(benchPress);
|
|
when(mockExerciseProvider.findExerciseById(3)).thenReturn(crunches);
|
|
|
|
final setting1 = Setting(
|
|
setId: 1,
|
|
order: 1,
|
|
exerciseBaseId: 1,
|
|
repetitionUnitId: 1,
|
|
reps: 5,
|
|
weightUnitId: 1,
|
|
comment: 'ddd',
|
|
rir: '2',
|
|
);
|
|
setting1.repetitionUnit = repetitionUnit1;
|
|
setting1.weightUnit = weightUnit1;
|
|
setting1.exerciseBase = squats;
|
|
setting1.weight = 100;
|
|
|
|
final setting2 = Setting(
|
|
setId: 1,
|
|
order: 1,
|
|
exerciseBaseId: 2,
|
|
repetitionUnitId: 1,
|
|
reps: 6,
|
|
weightUnitId: 1,
|
|
comment: 'ddd',
|
|
rir: '1.5',
|
|
);
|
|
setting2.repetitionUnit = repetitionUnit1;
|
|
setting2.weightUnit = weightUnit1;
|
|
setting2.exerciseBase = benchPress;
|
|
setting2.weight = 80;
|
|
|
|
final setting2b = Setting(
|
|
setId: 1,
|
|
order: 1,
|
|
exerciseBaseId: 2,
|
|
repetitionUnitId: 1,
|
|
reps: 8,
|
|
weightUnitId: 1,
|
|
comment: 'ddd',
|
|
rir: '2',
|
|
);
|
|
setting2b.repetitionUnit = repetitionUnit1;
|
|
setting2b.weightUnit = weightUnit1;
|
|
setting2b.exerciseBase = benchPress;
|
|
setting2b.weight = 60;
|
|
|
|
final setting3 = Setting(
|
|
setId: 1,
|
|
order: 1,
|
|
exerciseBaseId: 2,
|
|
repetitionUnitId: 1,
|
|
reps: 20,
|
|
weightUnitId: 1,
|
|
comment: '',
|
|
rir: null,
|
|
);
|
|
setting3.repetitionUnit = repetitionUnit1;
|
|
setting3.weightUnit = weightUnit1;
|
|
setting3.exerciseBase = crunches;
|
|
|
|
final setting4 = Setting(
|
|
setId: 1,
|
|
order: 1,
|
|
exerciseBaseId: 2,
|
|
repetitionUnitId: 1,
|
|
reps: 8,
|
|
weightUnitId: 1,
|
|
comment: '',
|
|
rir: null,
|
|
);
|
|
setting4.repetitionUnit = repetitionUnit1;
|
|
setting4.weightUnit = weightUnit1;
|
|
setting4.exerciseBase = deadLift;
|
|
setting4.weight = 120;
|
|
|
|
final set1 = Set.withData(
|
|
id: 1,
|
|
day: 1,
|
|
sets: 3,
|
|
order: 1,
|
|
);
|
|
set1.addExerciseBase(squats);
|
|
set1.settings.add(setting1);
|
|
set1.settings.add(setting1);
|
|
set1.settings.add(setting1);
|
|
set1.settings.add(setting1);
|
|
|
|
final set2 = Set.withData(
|
|
id: 2,
|
|
day: 1,
|
|
sets: 3,
|
|
order: 1,
|
|
);
|
|
set2.addExerciseBase(benchPress);
|
|
set2.settings.add(setting2);
|
|
set2.settings.add(setting2);
|
|
set2.settings.add(setting2b);
|
|
set2.settings.add(setting2b);
|
|
|
|
final set3 = Set.withData(
|
|
id: 3,
|
|
day: 1,
|
|
sets: 3,
|
|
order: 1,
|
|
);
|
|
set3.addExerciseBase(crunches);
|
|
set3.settings.add(setting3);
|
|
|
|
final set4 = Set.withData(
|
|
id: 4,
|
|
day: 1,
|
|
sets: 3,
|
|
order: 1,
|
|
);
|
|
set4.addExerciseBase(deadLift);
|
|
set4.settings.add(setting4);
|
|
set4.settings.add(setting4);
|
|
set4.settings.add(setting4);
|
|
set4.settings.add(setting4);
|
|
|
|
final day1 = Day()
|
|
..id = 1
|
|
..workoutId = 1
|
|
..description = 'test day 1'
|
|
..daysOfWeek = [1, 2];
|
|
day1.sets.add(set1);
|
|
day1.sets.add(set2);
|
|
day1.sets.add(set4);
|
|
day1.sets.add(set3);
|
|
|
|
final workout = WorkoutPlan(
|
|
id: 1,
|
|
creationDate: DateTime(2021, 01, 01),
|
|
name: 'test workout 1',
|
|
days: [day1],
|
|
);
|
|
|
|
return ChangeNotifierProvider<WorkoutPlansProvider>(
|
|
create: (context) => WorkoutPlansProvider(
|
|
testAuthProvider,
|
|
mockExerciseProvider,
|
|
[workout],
|
|
client,
|
|
),
|
|
child: ChangeNotifierProvider<ExercisesProvider>(
|
|
create: (context) => mockExerciseProvider,
|
|
child: MaterialApp(
|
|
locale: Locale(locale),
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
navigatorKey: key,
|
|
theme: wgerTheme,
|
|
home: TextButton(
|
|
onPressed: () => key.currentState!.push(
|
|
MaterialPageRoute<void>(
|
|
settings: RouteSettings(arguments: workout.days.first),
|
|
builder: (_) => GymModeScreen(),
|
|
),
|
|
),
|
|
child: const SizedBox(),
|
|
),
|
|
routes: {
|
|
WorkoutPlanScreen.routeName: (ctx) => WorkoutPlanScreen(),
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
group('Generate screenshots', () {
|
|
for (final language in languages) {
|
|
testWidgets('nutritional plan detail - $language', (WidgetTester tester) async {
|
|
await tester.pumpWidget(createNutritionalPlanScreen(locale: language));
|
|
await tester.tap(find.byType(TextButton));
|
|
await tester.pumpAndSettle();
|
|
await takeScreenshot(tester, binding, '$language/03-nutritional-plan');
|
|
});
|
|
|
|
testWidgets('body weight screen - $language', (WidgetTester tester) async {
|
|
await tester.pumpWidget(createWeightScreen(locale: language));
|
|
await tester.pumpAndSettle();
|
|
await takeScreenshot(tester, binding, '$language/05-weight');
|
|
});
|
|
|
|
testWidgets('gym mode screen - $language', (WidgetTester tester) async {
|
|
await tester.pumpWidget(createGymModeScreen(locale: language));
|
|
await tester.tap(find.byType(TextButton));
|
|
await tester.pumpAndSettle();
|
|
await takeScreenshot(tester, binding, '$language/05-gym-mode');
|
|
});
|
|
}
|
|
});
|
|
}
|