From 6cf54b231e4d89e5b7d0d026f90274aa0f672cfe Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Fri, 23 Apr 2021 13:48:02 +0200 Subject: [PATCH] Add tests for MealForm --- lib/widgets/nutrition/forms.dart | 2 + test/nutritional_meal_form_test.dart | 117 +++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 test/nutritional_meal_form_test.dart diff --git a/lib/widgets/nutrition/forms.dart b/lib/widgets/nutrition/forms.dart index b3dd13cb..baa90e9f 100644 --- a/lib/widgets/nutrition/forms.dart +++ b/lib/widgets/nutrition/forms.dart @@ -51,6 +51,7 @@ class MealForm extends StatelessWidget { child: Column( children: [ TextFormField( + key: Key('field-time'), decoration: InputDecoration(labelText: AppLocalizations.of(context)!.time), controller: _timeController, onTap: () async { @@ -71,6 +72,7 @@ class MealForm extends StatelessWidget { onFieldSubmitted: (_) {}, ), ElevatedButton( + key: Key(SUBMIT_BUTTON_KEY_NAME), child: Text(AppLocalizations.of(context)!.save), onPressed: () async { if (!_form.currentState!.validate()) { diff --git a/test/nutritional_meal_form_test.dart b/test/nutritional_meal_form_test.dart new file mode 100644 index 00000000..49d242a5 --- /dev/null +++ b/test/nutritional_meal_form_test.dart @@ -0,0 +1,117 @@ +/* + * This file is part of wger Workout Manager . + * Copyright (C) 2020, 2021 wger Team + * + * wger Workout Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wger Workout Manager is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:provider/provider.dart'; +import 'package:wger/helpers/consts.dart'; +import 'package:wger/helpers/json.dart'; +import 'package:wger/models/nutrition/meal.dart'; +import 'package:wger/models/nutrition/nutritional_plan.dart'; +import 'package:wger/providers/nutrition.dart'; +import 'package:wger/screens/nutritional_plan_screen.dart'; +import 'package:wger/widgets/nutrition/forms.dart'; + +import '../test_data/nutritional_plans.dart'; +import 'nutritional_plan_form_test.mocks.dart'; + +void main() { + var mockNutrition = MockNutrition(); + + var plan1 = NutritionalPlan.empty(); + var meal1 = Meal(); + var meal2 = Meal(); + + when(mockNutrition.editMeal(any)).thenAnswer((_) => Future.value(Meal())); + when(mockNutrition.addMeal(any, any)).thenAnswer((_) => Future.value(Meal())); + + setUp(() { + plan1 = getNutritionalPlan(); + meal1 = plan1.meals.first; + mockNutrition = MockNutrition(); + }); + + Widget createHomeScreen(Meal meal, {locale = 'en'}) { + final key = GlobalKey(); + + return ChangeNotifierProvider( + create: (context) => mockNutrition, + child: MaterialApp( + locale: Locale(locale), + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + navigatorKey: key, + home: Scaffold( + body: MealForm(1, meal), + ), + routes: { + NutritionalPlanScreen.routeName: (ctx) => NutritionalPlanScreen(), + }, + ), + ); + } + + testWidgets('Test the widgets on the meal form', (WidgetTester tester) async { + await tester.pumpWidget(createHomeScreen(meal1)); + await tester.pumpAndSettle(); + + expect(find.byType(TextFormField), findsOneWidget); + expect(find.byType(ElevatedButton), findsOneWidget); + expect(find.byKey(Key(SUBMIT_BUTTON_KEY_NAME)), findsOneWidget); + }); + + testWidgets('Test editing an existing meal', (WidgetTester tester) async { + await tester.pumpWidget(createHomeScreen(meal1)); + await tester.pumpAndSettle(); + + expect( + find.text(('17:00')), + findsOneWidget, + reason: 'Time of existing meal is filled in', + ); + await tester.enterText(find.byKey(Key('field-time')), '12:34'); + await tester.tap(find.byKey(Key(SUBMIT_BUTTON_KEY_NAME))); + + // Correct method was called + verify(mockNutrition.editMeal(any)); + verifyNever(mockNutrition.addMeal(any, any)); + }); + + testWidgets('Test creating a new nutritional plan', (WidgetTester tester) async { + await tester.pumpWidget(createHomeScreen(meal2)); + await tester.pumpAndSettle(); + + expect( + find.text(timeToString(TimeOfDay.now())!), + findsOneWidget, + reason: 'Current time is filled in', + ); + + await tester.enterText(find.byKey(Key('field-time')), '08:00'); + await tester.tap(find.byKey(Key(SUBMIT_BUTTON_KEY_NAME))); + + // Correct method was called + verifyNever(mockNutrition.editMeal(any)); + verify(mockNutrition.addMeal(any, any)); + + // Detail page + // ... + }); +}