Files
HouseHoldKeaper/test/features/settings/settings_screen_test.dart
Jean-Luc Makiola 77de7cdbf3 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)
2026-03-16 15:07:26 +01:00

110 lines
3.6 KiB
Dart

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