import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; import 'package:melo_app/services/navidrome_service.dart'; void main() { group('NavidromeService — Salt-Qualität (Security-Regression)', () { test('Salt ist base64-codiert und KEIN vorhersagbarer Timestamp', () { final nav = NavidromeService(); nav.setCredentials('https://musik.example.de', 'user', 'pass'); final salt = nav.saltFuerTests; // Timestamp-Salt (alte, unsichere Variante) wäre rein numerisch expect(RegExp(r'^\d+$').hasMatch(salt), isFalse, reason: 'Salt darf kein reiner Timestamp sein'); // base64-Decodierung muss 16 Zufallsbytes ergeben (128 Bit Entropie) final bytes = base64Decode(salt); expect(bytes.length, 16); }); test('Zwei setCredentials-Aufrufe erzeugen unterschiedliche Salts', () { final nav = NavidromeService(); nav.setCredentials('https://musik.example.de', 'user', 'pass'); final salt1 = nav.saltFuerTests; nav.setCredentials('https://musik.example.de', 'user', 'pass'); final salt2 = nav.saltFuerTests; // Kollisionswahrscheinlichkeit bei Random.secure (16 Byte) ≈ 0 expect(salt1, isNot(equals(salt2))); }); }); }