From 77de7cdbf3b0dfeeb7a57c340471eeffd46c2ab9 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Mon, 16 Mar 2026 15:07:26 +0100 Subject: [PATCH] feat(04-02): add widget tests for notification settings UI - 5 tests for Benachrichtigungen section: header rendering, toggle OFF default, time picker visibility on/off with AnimatedSize, formatted time display - Uses notificationSettingsProvider.overrideWithValue for test isolation - Uses themeProvider.overrideWithValue to avoid SharedPreferences dependency - UncontrolledProviderScope + ProviderContainer follows home_screen_test pattern - All 89 tests pass (84 existing + 5 new) --- .../settings/settings_screen_test.dart | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 test/features/settings/settings_screen_test.dart diff --git a/test/features/settings/settings_screen_test.dart b/test/features/settings/settings_screen_test.dart new file mode 100644 index 0000000..67a5fc6 --- /dev/null +++ b/test/features/settings/settings_screen_test.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:household_keeper/core/notifications/notification_settings_notifier.dart'; +import 'package:household_keeper/core/theme/theme_provider.dart'; +import 'package:household_keeper/features/settings/presentation/settings_screen.dart'; +import 'package:household_keeper/l10n/app_localizations.dart'; + +/// Build a standalone SettingsScreen with provider overrides for test isolation. +Widget _buildSettings(NotificationSettings notifSettings) { + final container = ProviderContainer(overrides: [ + notificationSettingsProvider.overrideWithValue(notifSettings), + themeProvider.overrideWithValue(ThemeMode.system), + ]); + + return UncontrolledProviderScope( + container: container, + child: const MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: [Locale('de')], + locale: Locale('de'), + home: Scaffold(body: SettingsScreen()), + ), + ); +} + +void main() { + setUp(() { + SharedPreferences.setMockInitialValues({}); + }); + + group('SettingsScreen Benachrichtigungen section', () { + testWidgets('renders Benachrichtigungen section header', (tester) async { + await tester.pumpWidget(_buildSettings(const NotificationSettings( + enabled: false, + time: TimeOfDay(hour: 7, minute: 0), + ))); + await tester.pumpAndSettle(); + + expect(find.text('Benachrichtigungen'), findsOneWidget); + }); + + testWidgets( + 'notification toggle displays with correct label and defaults to OFF', + (tester) async { + await tester.pumpWidget(_buildSettings(const NotificationSettings( + enabled: false, + time: TimeOfDay(hour: 7, minute: 0), + ))); + await tester.pumpAndSettle(); + + // Label matches ARB notificationsEnabledLabel + expect(find.text('Tägliche Erinnerung'), findsOneWidget); + + // SwitchListTile with value=false + final switchTile = tester.widget( + find.byType(SwitchListTile), + ); + expect(switchTile.value, isFalse); + }, + ); + + testWidgets( + 'time picker row is visible when notifications are enabled', + (tester) async { + await tester.pumpWidget(_buildSettings(const NotificationSettings( + enabled: true, + time: TimeOfDay(hour: 9, minute: 30), + ))); + await tester.pumpAndSettle(); + + // notificationsTimeLabel should be visible + expect(find.text('Uhrzeit'), findsOneWidget); + // Formatted time should be shown (09:30) + expect(find.text('09:30'), findsOneWidget); + }, + ); + + testWidgets( + 'time picker row is hidden when notifications are disabled', + (tester) async { + await tester.pumpWidget(_buildSettings(const NotificationSettings( + enabled: false, + time: TimeOfDay(hour: 9, minute: 30), + ))); + await tester.pumpAndSettle(); + + // notificationsTimeLabel should NOT be visible + expect(find.text('Uhrzeit'), findsNothing); + }, + ); + + testWidgets( + 'time picker row displays correctly formatted time when enabled', + (tester) async { + await tester.pumpWidget(_buildSettings(const NotificationSettings( + enabled: true, + time: TimeOfDay(hour: 7, minute: 0), + ))); + await tester.pumpAndSettle(); + + // Default time 07:00 should display as formatted string + expect(find.text('07:00'), findsOneWidget); + }, + ); + }); +}