import 'package:flutter_test/flutter_test.dart'; import 'package:melo/services/logger_service.dart'; /// Sicherheits-Tests für die Log-Bereinigung vor dem Server-Upload /// (logs.baka-net.de). Der Logger ist freitextbasiert, daher wird der /// message-/stackTrace-Text zentral maskiert, bevor er das Gerät verlässt. void main() { group('LoggerService.scrubText – sensible Fragmente', () { test('Benutzername (user=) wird redigiert', () { expect(LoggerService.scrubText('Login user=Dustin ok'), 'Login user= ok'); }); test('Server-URL (url=) wird redigiert', () { expect(LoggerService.scrubText('verbinde url=https://musik.baka-net.de'), contains('url=')); }); test('Passwort/Token/Secret werden redigiert', () { expect(LoggerService.scrubText('password=geheim123'), 'password='); expect(LoggerService.scrubText('token=abc.def'), 'token='); expect(LoggerService.scrubText('secret=xyz'), 'secret='); }); test('pwLeer=false (bool-Flag) bleibt erhalten', () { expect(LoggerService.scrubText('Login pwLeer=false'), 'Login pwLeer=false'); }); }); group('LoggerService.scrubText – Pfade/URLs/Token', () { test('Datei-Pfade werden maskiert', () { expect(LoggerService.scrubText('lese /storage/emulated/0/m.mp3 ok'), 'lese ok'); expect(LoggerService.scrubText('crash /home/dustin/secret/x.dart'), 'crash '); }); test('Nackte URLs werden maskiert', () { expect(LoggerService.scrubText('GET https://logs.baka-net.de/api/logs'), 'GET '); }); test('Bearer-Token, JWT und lange Hex-IDs werden maskiert', () { expect(LoggerService.scrubText('Authorization: Bearer abc.def-ghi'), 'Authorization: Bearer '); expect(LoggerService.scrubText('t=eyJhbGciOiJIUzI1NiIsdummydummy'), contains('')); final s = LoggerService.scrubText('id deadbeefdeadbeef12'); expect(s.contains('deadbeefdeadbeef12'), isFalse); expect(s.contains(''), isTrue); }); }); group('LoggerService.capFrames', () { test('kürzt lange Stack-Traces auf wenige Zeilen', () { final viele = List.generate(20, (i) => 'frame $i').join('\n'); final s = LoggerService.capFrames(viele); expect(s.contains('weitere Zeilen entfernt'), isTrue); expect(s.contains('frame 19'), isFalse); }); test('kurze Traces bleiben unverändert', () { const kurz = 'a\nb\nc'; expect(LoggerService.capFrames(kurz), kurz); }); }); }