- DB-Schema 4: Tabelle song_categories + Spalte categories_edited - Kategorien kommen aus dem Genre-Tag (Trennung an ; , | /), manuell bearbeitbar; von Hand gesetzte Kategorien ueberlebt der naechste Scan - Songzeile zeigt "Kuenstler | Kategorie1 - Kategorie2" - Einstellung "Gleiche Kategorie = gleiches Coverbild" (Standard an) - Metadaten-Sheet mit ausklappbarem Expertenmodus - Neu: categories.dart, category_service.dart, song_detail_sheet.dart, app_settings.dart Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011snPXPafPC5i87o68H14W7
66 lines
1.9 KiB
Dart
66 lines
1.9 KiB
Dart
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<void> 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<void> settle() => Future<void>.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);
|
|
});
|
|
}
|