Kategorien (mehrere je Song), Metadaten-Ansicht mit Expertenmodus
- 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
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user