import 'package:drift/drift.dart' show Value; import 'package:drift/native.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:melo/library/category_service.dart'; import 'package:melo/library/database.dart'; void main() { late MeloDb db; late CategoryService service; setUp(() => db = MeloDb(NativeDatabase.memory())); tearDown(() async { service.dispose(); await db.close(); }); Future insert(String id, {String? cover}) => db.upsertSongs([ SongsCompanion.insert( id: id, path: '/$id.mp3', title: 'Song $id', coverPath: Value(cover), dateAddedMs: 0, updatedAtMs: 0, ), ]); Future settle() => Future.delayed(const Duration(milliseconds: 50)); test('reicht die Kategorien eines Songs durch', () async { await insert('1'); await db.setCategories('1', ['Rock', 'Pop']); service = CategoryService(db); await settle(); expect(service.of('1'), ['Rock', 'Pop']); expect(service.of('unbekannt'), isEmpty); }); test('Songs derselben Kategorie bekommen dasselbe Cover', () async { await insert('1', cover: null); await insert('2', cover: '/rock.img'); await db.setCategories('1', ['Rock']); await db.setCategories('2', ['Rock']); service = CategoryService(db); await settle(); final ohneCover = (await db.watchSongs().first).firstWhere((s) => s.id == '1'); expect(service.coverFor(ohneCover, groupByCategory: true), '/rock.img'); expect(service.coverFor(ohneCover, groupByCategory: false), isNull); }); test('von Hand gesetzte Kategorien markieren den Song als bearbeitet', () async { await insert('1'); service = CategoryService(db); await settle(); await service.setCategories('1', ['Eigen']); await settle(); expect(service.of('1'), ['Eigen']); expect((await db.watchSongs().first).single.categoriesEdited, isTrue); }); }