import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:melo/services/media_store.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); const kanal = MethodChannel('de.baka.melo/media_store'); final messenger = TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger; tearDown(() => messenger.setMockMethodCallHandler(kanal, null)); test('veroeffentliche reicht Pfad, Titel und Künstler nach Android durch', () async { MethodCall? gesehen; messenger.setMockMethodCallHandler(kanal, (call) async { gesehen = call; return '/storage/emulated/0/Music/Melo/Roses.mp3'; }); final pfad = await const MediaStore().veroeffentliche( quellPfad: '/tmp/Roses.mp3', titel: 'Roses', kuenstler: 'Neoni', ); expect(pfad, '/storage/emulated/0/Music/Melo/Roses.mp3'); expect(gesehen!.method, 'publishAudio'); expect(gesehen!.arguments, { 'sourcePath': '/tmp/Roses.mp3', 'title': 'Roses', 'artist': 'Neoni', 'volume': null, }); }); test('veroeffentliche reicht den gewählten Speicherort mit durch', () async { MethodCall? gesehen; messenger.setMockMethodCallHandler(kanal, (call) async { gesehen = call; return '/storage/1234-abcd/Music/Melo/Roses.mp3'; }); await const MediaStore().veroeffentliche( quellPfad: '/tmp/Roses.mp3', titel: 'Roses', volume: '1234-abcd', ); expect((gesehen!.arguments as Map)['volume'], '1234-abcd'); }); test('Scheitert die Android-Seite, gibt es null statt einer Ausnahme', () async { messenger.setMockMethodCallHandler( kanal, (_) async => throw PlatformException(code: 'io')); final pfad = await const MediaStore() .veroeffentliche(quellPfad: '/tmp/x.mp3', titel: 'X'); expect(pfad, isNull); }); test('speicherOrte liest die Datenträger von Android', () async { messenger.setMockMethodCallHandler(kanal, (call) async { if (call.method != 'listVolumes') return null; return [ {'name': 'external_primary', 'beschreibung': 'Interner Speicher'}, {'name': '1234-abcd', 'beschreibung': 'SD-Karte (1234-abcd)'}, ]; }); final orte = await const MediaStore().speicherOrte(); expect(orte.length, 2); expect(orte.first.name, 'external_primary'); expect(orte.first.beschreibung, 'Interner Speicher'); expect(orte.last.name, '1234-abcd'); expect(orte.last.beschreibung, 'SD-Karte (1234-abcd)'); }); test('Ohne Android-Seite bleibt nur der interne Speicher übrig', () async { final orte = await const MediaStore().speicherOrte(); expect(orte.length, 1); expect(orte.single.beschreibung, 'Interner Speicher'); }); test('Scheitert die Abfrage, bleibt ebenfalls der interne Speicher', () async { messenger.setMockMethodCallHandler( kanal, (_) async => throw PlatformException(code: 'io')); final orte = await const MediaStore().speicherOrte(); expect(orte.single.beschreibung, 'Interner Speicher'); }); }