import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:http/http.dart' as http; import 'package:mocktail/mocktail.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:mabea_app/api/api_client.dart'; import 'package:mabea_app/screens/login_screen.dart'; class _MockClient extends Mock implements http.Client {} void main() { setUpAll(() { registerFallbackValue(Uri.parse('http://test.local')); }); late _MockClient httpClient; late ApiClient apiClient; setUp(() { SharedPreferences.setMockInitialValues({}); httpClient = _MockClient(); apiClient = ApiClient(baseUrl: 'http://test.local/api/v1', httpClient: httpClient); }); testWidgets('erfolgreicher Login navigiert zur Objektliste', (tester) async { when(() => httpClient.post(any(), headers: any(named: 'headers'), body: any(named: 'body'))) .thenAnswer((_) async => http.Response(jsonEncode({'access_token': 'abc-token'}), 200)); when(() => httpClient.get(any(), headers: any(named: 'headers'))) .thenAnswer((_) async => http.Response(jsonEncode([]), 200)); await tester.pumpWidget(MaterialApp(home: LoginScreen(apiClient: apiClient))); await tester.enterText(find.widgetWithText(TextField, 'Login'), 'mitarbeiter1'); await tester.enterText(find.widgetWithText(TextField, 'Passwort'), 'test-passwort-123'); await tester.tap(find.widgetWithText(FilledButton, 'Anmelden')); await tester.pumpAndSettle(); expect(find.text('Objekte'), findsOneWidget); }); testWidgets('falsches Passwort zeigt Fehlermeldung, bleibt auf Login', (tester) async { when(() => httpClient.post(any(), headers: any(named: 'headers'), body: any(named: 'body'))) .thenAnswer((_) async => http.Response(jsonEncode({'detail': 'falsch'}), 401)); await tester.pumpWidget(MaterialApp(home: LoginScreen(apiClient: apiClient))); await tester.enterText(find.widgetWithText(TextField, 'Login'), 'mitarbeiter1'); await tester.enterText(find.widgetWithText(TextField, 'Passwort'), 'falsch'); await tester.tap(find.widgetWithText(FilledButton, 'Anmelden')); await tester.pumpAndSettle(); expect(find.text('Login oder Passwort falsch'), findsOneWidget); }); }