Files
Melo/test/library/category_service_test.dart
T
dustinandClaude Opus 5 7aa98864aa 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
2026-08-20 18:29:45 +02:00

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);
});
}