Flutter-Tests: ApiClient, Offline-Queue, Login-/Objektliste-Widgets
CI / backend-tests (push) Successful in 1m5s
CI / frontend-build (push) Successful in 18s

ApiClient nimmt jetzt einen injizierbaren http.Client entgegen (Testbarkeit,
kein Verhaltensunterschied im Betrieb). Tests mocken ihn mit mocktail statt
echter Netzwerkaufrufe. offline_queue_test.dart nutzt sqflite_common_ffi
(reines Dart) für die Queue-Logik ohne Gerät/Emulator: Erfolg entfernt
Eintrag, Netzwerkfehler bleibt "wartet", 4xx setzt "fehler" ohne Auto-Retry.
Dazu Widget-Tests für Login-Flow und Objektliste-Suchfilter.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
2026-09-04 18:38:17 +02:00
co-authored by Claude Sonnet 5
parent c68d39b45f
commit 0909dacf2b
9 changed files with 347 additions and 10 deletions
+8 -7
View File
@@ -17,9 +17,10 @@ class ApiException implements Exception {
}
class ApiClient {
ApiClient({required this.baseUrl});
ApiClient({required this.baseUrl, http.Client? httpClient}) : _http = httpClient ?? http.Client();
final String baseUrl;
final http.Client _http;
String? _token;
Future<void> ladeToken() async {
@@ -40,7 +41,7 @@ class ApiClient {
bool get istEingeloggt => _token != null;
Future<String> login(String username, String password) async {
final response = await http.post(
final response = await _http.post(
Uri.parse('$baseUrl/auth/login'),
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: {'username': username, 'password': password},
@@ -69,19 +70,19 @@ class ApiClient {
late http.Response response;
switch (method) {
case 'POST':
response = await http.post(uri, headers: headers, body: encodedBody);
response = await _http.post(uri, headers: headers, body: encodedBody);
break;
case 'PUT':
response = await http.put(uri, headers: headers, body: encodedBody);
response = await _http.put(uri, headers: headers, body: encodedBody);
break;
case 'PATCH':
response = await http.patch(uri, headers: headers, body: encodedBody);
response = await _http.patch(uri, headers: headers, body: encodedBody);
break;
case 'DELETE':
response = await http.delete(uri, headers: headers);
response = await _http.delete(uri, headers: headers);
break;
default:
response = await http.get(uri, headers: headers);
response = await _http.get(uri, headers: headers);
}
if (response.statusCode >= 400) {