import 'dart:io'; import 'package:drift/drift.dart'; import 'package:drift/native.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:melo/library/database.dart'; import 'package:melo/library/scan_service.dart'; import 'package:path/path.dart' as p; void main() { final fixtures = p.join(Directory.current.path, 'test', 'fixtures', 'audio'); late MeloDb db; late Directory coverDir; setUp(() async { db = MeloDb(NativeDatabase.memory()); coverDir = await Directory.systemTemp.createTemp('melo_covers'); }); tearDown(() async { await db.close(); await coverDir.delete(recursive: true); }); test('Re-Scan lässt Titel/Künstler/Album mit metadataEdited in Ruhe', () async { await scanFolders(db, [fixtures], coverDir: coverDir); final nacht = (await db.watchSongs().first).firstWhere((s) => s.title == 'Nachtpuls'); // Übernommene Korrektur — derselbe Schreibweg wie im Detail-Sheet. await db.upsertSongs([ SongsCompanion.insert( id: nacht.id, path: nacht.path, title: 'Nachtpuls (korrigiert)', artist: const Value('Rotklang feat. Blau'), album: const Value('Schwarz Deluxe'), dateAddedMs: nacht.dateAddedMs, updatedAtMs: DateTime.now().millisecondsSinceEpoch, metadataEdited: const Value(true), ), ]); await scanFolders(db, [fixtures], coverDir: coverDir); final danach = (await db.watchSongs().first).firstWhere((s) => s.id == nacht.id); expect(danach.title, 'Nachtpuls (korrigiert)'); expect(danach.artist, 'Rotklang feat. Blau'); expect(danach.album, 'Schwarz Deluxe'); expect(danach.metadataEdited, isTrue); }); test('Re-Scan überschreibt Metadaten ohne metadataEdited wie bisher', () async { await scanFolders(db, [fixtures], coverDir: coverDir); final nacht = (await db.watchSongs().first).firstWhere((s) => s.title == 'Nachtpuls'); // Änderung ohne gesetztes Flag — der Scan darf die Tags wiederherstellen. await db.upsertSongs([ SongsCompanion.insert( id: nacht.id, path: nacht.path, title: 'Falscher Titel', dateAddedMs: nacht.dateAddedMs, updatedAtMs: DateTime.now().millisecondsSinceEpoch, ), ]); await scanFolders(db, [fixtures], coverDir: coverDir); final danach = (await db.watchSongs().first).firstWhere((s) => s.id == nacht.id); expect(danach.title, 'Nachtpuls'); expect(danach.artist, 'Rotklang'); expect(danach.album, 'Schwarz'); expect(danach.metadataEdited, isFalse); }); }