- backend_config: einziges Profil 'prod' (API + Keycloak 192.168.1.9); HL_BACKEND-Weiche/usbReverse entfernt -> kein versehentliches localhost/Dev-Routing - smoke_test_api: BackendConfig.prod statt entferntem .localDev Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
65 lines
2.0 KiB
Dart
65 lines
2.0 KiB
Dart
/// 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<void> 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}');
|
|
}
|
|
}
|