import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:melo/services/logger_service.dart'; import 'package:melo/services/navidrome_service.dart'; /// Tests für die Login-Fehlerdiagnose: Lehnt der Server den Login ab /// (status:failed, z. B. „Wrong username or password"), muss die App die /// Server-Meldung festhalten, damit der Login-Dialog sie anzeigen kann — /// ein generisches „Login fehlgeschlagen" verschleiert die Ursache. void main() { late HttpServer server; setUpAll(() async => logger.init()); Future starteServer(String body) async { server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); server.listen((req) { req.response ..statusCode = 200 ..headers.contentType = ContentType.json ..write(body); req.response.close(); }); return Uri.parse('http://127.0.0.1:${server.port}'); } tearDown(() async => server.close(force: true)); test('ping speichert Server-Meldung bei abgelehntem Login', () async { final url = await starteServer( '{"subsonic-response":{"status":"failed","version":"1.16.1",' '"error":{"code":40,"message":"Wrong username or password"}}}'); final svc = NavidromeService(); svc.setCredentials(url.toString(), 'Baka', 'falsch'); expect(await svc.ping(), isFalse); expect(svc.letzterLoginFehler, 'Wrong username or password'); }); test('ping löscht alte Fehlermeldung bei Erfolg', () async { final url = await starteServer( '{"subsonic-response":{"status":"ok","version":"1.16.1"}}'); final svc = NavidromeService(); svc.setCredentials(url.toString(), 'Baka', 'richtig'); expect(await svc.ping(), isTrue); expect(svc.letzterLoginFehler, isNull); }); }