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