import 'package:flutter_test/flutter_test.dart'; import 'package:melo/library/song_media.dart'; import 'package:melo/player/audio_handler.dart'; import 'package:melo/services/navidrome_service.dart'; /// Server-Titel wurden bisher an zwei Stellen von Hand zu [MediaItem]s /// gebaut — beide ohne `artUri`. Auf Sperrbildschirm, in der Liste und im /// Player blieb deshalb der Noten-Platzhalter stehen, obwohl der Server das /// Cover unter `getCoverArt.view` bereithält. void main() { late NavidromeService nav; setUp(() { nav = NavidromeService() ..setCredentials('https://musik.example', 'dustin', 'geheim'); }); const mitCover = SubsonicSong( id: 'song-42', titel: 'Roses', kuenstler: 'Neoni', album: 'Trailerpark', dauerSekunden: 221, coverId: 'al-7', ); test('das Cover kommt als Server-Adresse mit', () { final item = subsonicToMediaItem(mitCover, nav); expect(item.artUri, isNotNull); expect(item.artUri!.scheme, 'https'); expect(item.artUri!.path, contains('getCoverArt.view')); expect(item.artUri!.queryParameters['id'], 'al-7'); }); test('ohne coverArt-Tag bleibt die Adresse leer statt zu raten', () { const ohneCover = SubsonicSong(id: 'song-43', titel: 'Ohne Bild'); expect(subsonicToMediaItem(ohneCover, nav).artUri, isNull); }); test('Titel, Künstler, Album und Dauer werden übernommen', () { final item = subsonicToMediaItem(mitCover, nav); expect(item.title, 'Roses'); expect(item.artist, 'Neoni'); expect(item.album, 'Trailerpark'); expect(item.duration, const Duration(seconds: 221)); }); test('die Server-ID bleibt getrennt von der Abspiel-Adresse', () { // Sonst fragt die App den Server nach einem Titel namens "https://…" // — die Wurzel-Ursache von "(0) Source error". final item = subsonicToMediaItem(mitCover, nav); expect(navidromeIdOf(item), 'song-42'); expect(item.id, contains('stream.view')); expect(songIdOf(item), isNull); }); }