/// Smoke-Test für den generierten Holzleitner-API-Client. /// /// Läuft als reines Dart-Script (kein Flutter-Engine nötig): /// /// dart run tool/smoke_test_api.dart /// /// Voraussetzungen: /// * Backend läuft unter http://127.0.0.1:3000 /// * Keycloak läuft unter http://127.0.0.1:8080 /// * Testfahrer (PN 1001) ist im Keycloak-Realm angelegt /// /// Was getestet wird: /// 1. /health (ohne Auth) /// 2. /me/cars (mit Auth via DevPasswordGrantTokenProvider) library; import 'package:dio/dio.dart'; import 'package:hl_lieferservice/data/network/backend_config.dart'; import 'package:hl_lieferservice/data/network/dev_password_grant_token_provider.dart'; import 'package:hl_lieferservice/data/network/holzleitner_api_factory.dart'; Future main() async { const config = BackendConfig.prod; // Health geht ohne Auth — wir nutzen die generierte API-Klasse trotzdem, // um zu zeigen, dass der Aufruf-Pfad funktioniert. print('---- 1) GET /health ----'); final tokenProvider = DevPasswordGrantTokenProvider( tokenEndpoint: config.keycloakTokenEndpoint, clientId: config.keycloakClientId, username: 'testfahrer', password: 'test', ); final api = buildHolzleitnerApi( config: config, tokenProvider: tokenProvider, ); try { final health = await api.getHealthApi().health(); print(' OK: ${health.data?.length ?? 0} bytes → ${health.data}'); } on DioException catch (e) { print(' FEHLER: ${e.message}'); print(' Response: ${e.response?.data}'); return; } print('\n---- 2) GET /me/cars (mit Bearer-Token) ----'); try { final response = await api.getCarsApi().listMyCars(); final cars = response.data?.cars; if (cars == null) { print(' OK: leerer Body'); return; } print(' OK: ${cars.length} Fahrzeug(e)'); for (final c in cars) { print(' • ${c.id} ${c.plate} active=${c.active}'); } } on DioException catch (e) { print(' FEHLER: ${e.message}'); print(' Response: ${e.response?.data}'); } }