diff --git a/lib/widgets/routines/forms/session.dart b/lib/widgets/routines/forms/session.dart index 79d0006e..1c6ab5cc 100644 --- a/lib/widgets/routines/forms/session.dart +++ b/lib/widgets/routines/forms/session.dart @@ -21,8 +21,8 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:wger/exceptions/http_exception.dart'; import 'package:wger/helpers/consts.dart'; +import 'package:wger/helpers/errors.dart'; import 'package:wger/helpers/json.dart'; -import 'package:wger/helpers/ui.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; import 'package:wger/models/workouts/session.dart'; import 'package:wger/providers/routines.dart'; @@ -51,6 +51,7 @@ class SessionForm extends StatefulWidget { } class _SessionFormState extends State { + Widget errorMessage = const SizedBox.shrink(); final _form = GlobalKey(); final impressionController = TextEditingController(); @@ -90,6 +91,7 @@ class _SessionFormState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ + errorMessage, ToggleButtons( renderBorder: false, onPressed: (int index) { @@ -219,16 +221,18 @@ class _SessionFormState extends State { await routinesProvider.editSession(widget._session); } + setState(() { + errorMessage = const SizedBox.shrink(); + }); + if (context.mounted && widget._onSaved != null) { widget._onSaved!(); } } on WgerHttpException catch (error) { if (context.mounted) { - showHttpExceptionErrorDialog(error, context); - } - } catch (error) { - if (context.mounted) { - showErrorDialog(error, context); + setState(() { + errorMessage = FormHttpErrorsWidget(error); + }); } } }, diff --git a/test/workout/forms/session_form_test.dart b/test/workout/forms/session_form_test.dart index d10af65e..01a90524 100644 --- a/test/workout/forms/session_form_test.dart +++ b/test/workout/forms/session_form_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'package:provider/provider.dart'; +import 'package:wger/exceptions/http_exception.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; import 'package:wger/models/workouts/session.dart'; import 'package:wger/providers/routines.dart'; @@ -126,5 +127,20 @@ void main() { expect(captured.notes, 'Updated notes'); expect(onSavedCalled, isTrue); }); + + testWidgets('shows server side error messages', (WidgetTester tester) async { + // Arrange + await pumpSessionForm(tester); + when(mockRoutinesProvider.addSession(any, any)).thenThrow(WgerHttpException.fromMap({ + 'name': ['The name is not valid'], + })); + + // Act + await tester.tap(find.byKey(const ValueKey('save-button'))); + await tester.pumpAndSettle(); + + // Assert + expect(find.text('The name is not valid'), findsOneWidget, reason: 'Error message is shown'); + }); }); }