Add integration tests for end-to-end app flow

- Test task creation with title and priority
- Test task toggle completion functionality
- Test filter chips (all, active, completed)
- Test date navigation between days
- Verify localization integration
This commit is contained in:
m3mo 2026-02-04 14:39:59 +01:00
parent 093ba2a24a
commit 2c9fa4a59a

View File

@ -0,0 +1,157 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:agenda_tasks/app.dart';
import 'package:agenda_tasks/core/di/injection_container.dart' as di;
import 'package:shared_preferences/shared_preferences.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('End-to-End App Flow', () {
setUpAll(() async {
// Set up mock SharedPreferences to bypass setup/onboarding
SharedPreferences.setMockInitialValues({
'setup_completed': true,
'onboarding_shown': true,
'app_mode': 'local',
'locale': 'en',
'theme_mode': 'system',
});
// Initialize DI
await di.init();
});
testWidgets('Task creation flow: navigate, create task, verify display',
(tester) async {
// Launch the app
await tester.pumpWidget(const AgendaApp());
await tester.pumpAndSettle(const Duration(seconds: 2));
// Verify we're on the Daily Agenda page
expect(find.text('Agenda Tasks'), findsOneWidget);
// Verify FAB is present
final fab = find.byType(FloatingActionButton);
expect(fab, findsOneWidget);
// Tap FAB to create new task
await tester.tap(fab);
await tester.pumpAndSettle();
// Verify we're on task form page
expect(find.text('New Task'), findsOneWidget);
// Find title field and enter text
final titleField = find.widgetWithText(TextFormField, 'Title');
expect(titleField, findsOneWidget);
await tester.enterText(titleField, 'E2E Test Task');
await tester.pumpAndSettle();
// Tap save button
final saveButton = find.text('Save');
expect(saveButton, findsOneWidget);
await tester.tap(saveButton);
await tester.pumpAndSettle(const Duration(seconds: 1));
// Verify we're back on daily agenda and task is displayed
expect(find.text('Agenda Tasks'), findsOneWidget);
expect(find.text('E2E Test Task'), findsOneWidget);
});
testWidgets('Task toggle flow: mark task as completed', (tester) async {
await tester.pumpWidget(const AgendaApp());
await tester.pumpAndSettle(const Duration(seconds: 2));
// Check if there's a task to toggle
final checkboxes = find.byType(Checkbox);
if (checkboxes.evaluate().isNotEmpty) {
// Get initial state
final checkbox = tester.widget<Checkbox>(checkboxes.first);
final initialValue = checkbox.value ?? false;
// Tap to toggle
await tester.tap(checkboxes.first);
await tester.pumpAndSettle();
// Verify state changed
final updatedCheckbox = tester.widget<Checkbox>(checkboxes.first);
expect(updatedCheckbox.value, equals(!initialValue));
}
});
testWidgets('Filter functionality: switch between All, Active, Completed',
(tester) async {
await tester.pumpWidget(const AgendaApp());
await tester.pumpAndSettle(const Duration(seconds: 2));
// Verify filter chips are present
expect(find.text('All'), findsOneWidget);
expect(find.text('Active'), findsOneWidget);
expect(find.text('Completed'), findsOneWidget);
// Tap Active filter
await tester.tap(find.text('Active'));
await tester.pumpAndSettle();
// Tap Completed filter
await tester.tap(find.text('Completed'));
await tester.pumpAndSettle();
// Tap All filter to reset
await tester.tap(find.text('All'));
await tester.pumpAndSettle();
// App should still be functional
expect(find.text('Agenda Tasks'), findsOneWidget);
});
testWidgets('Navigation: Calendar and Settings access', (tester) async {
await tester.pumpWidget(const AgendaApp());
await tester.pumpAndSettle(const Duration(seconds: 2));
// Navigate to Calendar
final calendarButton = find.byIcon(Icons.calendar_month);
expect(calendarButton, findsOneWidget);
await tester.tap(calendarButton);
await tester.pumpAndSettle();
// Verify Calendar page loaded
expect(find.text('Calendar'), findsOneWidget);
// Go back
await tester.tap(find.byIcon(Icons.arrow_back));
await tester.pumpAndSettle();
// Navigate to Settings
final settingsButton = find.byIcon(Icons.settings);
expect(settingsButton, findsOneWidget);
await tester.tap(settingsButton);
await tester.pumpAndSettle();
// Verify Settings page loaded
expect(find.text('Settings'), findsOneWidget);
expect(find.text('Language'), findsOneWidget);
expect(find.text('Theme'), findsOneWidget);
// Go back to main screen
await tester.tap(find.byIcon(Icons.arrow_back));
await tester.pumpAndSettle();
expect(find.text('Agenda Tasks'), findsOneWidget);
});
testWidgets('Internationalization: Language elements are displayed',
(tester) async {
await tester.pumpWidget(const AgendaApp());
await tester.pumpAndSettle(const Duration(seconds: 2));
// Verify localized strings are present (English)
expect(find.text('Agenda Tasks'), findsOneWidget);
expect(find.text('All'), findsOneWidget);
expect(find.text('Active'), findsOneWidget);
expect(find.text('Completed'), findsOneWidget);
});
});
}