import 'dart:convert'; import 'package:drift/native.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:http/http.dart' as http; import 'package:http/testing.dart'; import 'package:melo/library/category_service.dart'; import 'package:melo/library/database.dart'; import 'package:melo/library/song_detail_sheet.dart'; import 'package:melo/settings/app_settings.dart'; import 'package:provider/provider.dart'; /// MusicBrainz-Antwort mit genau einem Vorschlag. String _antwortJson() => jsonEncode({ 'recordings': [ { 'id': 'rec-1', 'score': 100, 'title': 'Nachtpuls (korrigiert)', 'artist-credit': [ {'name': 'Rotklang'} ], 'releases': [ {'id': 'rel-1', 'title': 'Schwarz'} ], } ], }); void main() { // ÜBERSPRUNGEN: dieser Widget-Test bleibt beim Öffnen des Modal-Sheets // hängen und kommt nie zurück — er blockiert damit den gesamten Testlauf. // Ursache liegt im Zusammenspiel von showModalBottomSheet und den // Providern im Test, nicht im geprüften Verhalten. Was er absichern // sollte, prüft jetzt metadaten_uebernahme_test.dart ohne Widgets. // TODO(melo): Widget-Test wieder zum Laufen bringen — Stand der // Eingrenzung und nächster Schritt stehen in BACKLOG.md. testWidgets('Übernahme eines Online-Vorschlags setzt metadataEdited', skip: true, (tester) async { final db = MeloDb(NativeDatabase.memory()); addTearDown(db.close); await db.upsertSongs([ SongsCompanion.insert( id: '1', path: '/1.mp3', title: 'Nachtpuls', dateAddedMs: 0, updatedAtMs: 0, ), ]); final song = (await db.watchSongs().first).single; expect(song.metadataEdited, isFalse); await http.runWithClient(() async { await tester.pumpWidget(MultiProvider( providers: [ Provider.value(value: db), ChangeNotifierProvider( create: (_) => CategoryService(db)), ChangeNotifierProvider(create: (_) => AppSettings()), ], child: MaterialApp( home: Scaffold( body: Builder( builder: (context) => TextButton( onPressed: () => SongDetailSheet.show(context, song), child: const Text('Details öffnen'), ), ), ), ), )); await tester.tap(find.text('Details öffnen')); await tester.pumpAndSettle(); await tester.tap(find.text('Expertenmodus')); await tester.pumpAndSettle(); await tester.ensureVisible(find.text('Online nachschlagen')); await tester.tap(find.text('Online nachschlagen')); await tester.pumpAndSettle(); await tester.ensureVisible(find.text('Nachtpuls (korrigiert)')); await tester.tap(find.text('Nachtpuls (korrigiert)')); await tester.pumpAndSettle(); }, () => MockClient((request) async => http.Response(_antwortJson(), 200, headers: {'content-type': 'application/json; charset=utf-8'}))); final gespeichert = (await db.watchSongs().first).single; expect(gespeichert.title, 'Nachtpuls (korrigiert)'); expect(gespeichert.artist, 'Rotklang'); expect(gespeichert.album, 'Schwarz'); expect(gespeichert.metadataEdited, isTrue); }); }