Neue Melo-UI Phase 1: 4 Tabs (Meine Musik/Suche/Favoriten/Download) + Sortierung
- Meine Musik als Startbildschirm ohne Topbar: Kopfzeile (Einstellungen, Suche, Musikerkennung), Schnellzugriffe, Shuffle + Sortieren, Liederliste - Sortierung nach Zuletzt hinzugefuegt / Name (A-Z-#) / Wie oft abgespielt, auf- und absteigend, pro Liste gespeichert (SortStore) - Favoriten als eigener Tab mit gleicher Shuffle-/Sortier-Leiste - Download-Tab uebernimmt den Navidrome-Server-Browser - DB-Schema 3: playCount, gezaehlt beim Titelstart - Theme auf #0B0B10 / #c0392b - Scan-Aktionen aus der entfallenen Topbar jetzt in den Einstellungen Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011snPXPafPC5i87o68H14W7
This commit is contained in:
@@ -1,113 +0,0 @@
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:melo/library/database.dart';
|
||||
import 'package:melo/library/library_screen.dart';
|
||||
import 'package:melo/library/library_service.dart';
|
||||
import 'package:melo/library/playlist_service.dart';
|
||||
import 'package:melo/player/audio_handler.dart';
|
||||
|
||||
Widget _wrap(
|
||||
MeloDb db,
|
||||
LibraryService lib,
|
||||
PlaylistService playlists,
|
||||
MeloAudioHandler handler,
|
||||
Widget child,
|
||||
) {
|
||||
return MultiProvider(
|
||||
providers: [
|
||||
Provider<MeloDb>.value(value: db),
|
||||
ChangeNotifierProvider<LibraryService>.value(value: lib),
|
||||
ChangeNotifierProvider<PlaylistService>.value(value: playlists),
|
||||
Provider<MeloAudioHandler>.value(value: handler),
|
||||
],
|
||||
child: MaterialApp(home: child),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _insertSong(
|
||||
MeloDb db, {
|
||||
required String id,
|
||||
required String title,
|
||||
String? artist,
|
||||
String? album,
|
||||
}) {
|
||||
return db.into(db.songs).insert(SongsCompanion.insert(
|
||||
id: id,
|
||||
path: '/$id.mp3',
|
||||
title: title,
|
||||
artist: Value(artist),
|
||||
album: Value(album),
|
||||
dateAddedMs: 0,
|
||||
updatedAtMs: 0,
|
||||
));
|
||||
}
|
||||
|
||||
void main() {
|
||||
testWidgets('zeigt die drei Bibliotheks-Tabs "Alle", "Künstler", "Alben"',
|
||||
(tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final lib = LibraryService(db);
|
||||
final playlists = PlaylistService(db);
|
||||
final handler = MeloAudioHandler(db: db);
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const LibraryScreen()),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Alle'), findsOneWidget);
|
||||
expect(find.text('Künstler'), findsOneWidget);
|
||||
expect(find.text('Alben'), findsOneWidget);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Künstler-Tab zeigt je Künstler eine Zeile', (tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final lib = LibraryService(db);
|
||||
final playlists = PlaylistService(db);
|
||||
final handler = MeloAudioHandler(db: db);
|
||||
await _insertSong(db, id: '1', title: 'Song A', artist: 'Alice');
|
||||
await _insertSong(db, id: '2', title: 'Song B', artist: 'Bob');
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const LibraryScreen()),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.text('Künstler'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Alice'), findsOneWidget);
|
||||
expect(find.text('Bob'), findsOneWidget);
|
||||
expect(find.text('1 Songs'), findsNWidgets(2));
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Alben-Tab zeigt je Album eine Zeile', (tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final lib = LibraryService(db);
|
||||
final playlists = PlaylistService(db);
|
||||
final handler = MeloAudioHandler(db: db);
|
||||
await _insertSong(db, id: '1', title: 'Song A', artist: 'Alice', album: 'Best Of');
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const LibraryScreen()),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.text('Alben'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Best Of'), findsOneWidget);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:melo/library/database.dart';
|
||||
import 'package:melo/library/favorites_screen.dart';
|
||||
import 'package:melo/library/library_service.dart';
|
||||
import 'package:melo/library/my_music_screen.dart';
|
||||
import 'package:melo/library/playlist_service.dart';
|
||||
import 'package:melo/player/audio_handler.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
Widget _wrap(MeloDb db, LibraryService lib, PlaylistService playlists,
|
||||
MeloAudioHandler handler, Widget child) {
|
||||
return MultiProvider(
|
||||
providers: [
|
||||
Provider<MeloDb>.value(value: db),
|
||||
ChangeNotifierProvider<LibraryService>.value(value: lib),
|
||||
ChangeNotifierProvider<PlaylistService>.value(value: playlists),
|
||||
Provider<MeloAudioHandler>.value(value: handler),
|
||||
],
|
||||
child: MaterialApp(home: Scaffold(body: child)),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _insert(
|
||||
MeloDb db, {
|
||||
required String id,
|
||||
required String title,
|
||||
int dateAddedMs = 0,
|
||||
int playCount = 0,
|
||||
}) {
|
||||
return db.into(db.songs).insert(SongsCompanion.insert(
|
||||
id: id,
|
||||
path: '/$id.mp3',
|
||||
title: title,
|
||||
dateAddedMs: dateAddedMs,
|
||||
updatedAtMs: 0,
|
||||
playCount: Value(playCount),
|
||||
));
|
||||
}
|
||||
|
||||
void main() {
|
||||
setUp(() => SharedPreferences.setMockInitialValues({}));
|
||||
|
||||
testWidgets('Meine Musik zeigt Kopfzeile, Schnellzugriffe und Shuffle',
|
||||
(tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final lib = LibraryService(db);
|
||||
final playlists = PlaylistService(db);
|
||||
final handler = MeloAudioHandler(db: db);
|
||||
await _insert(db, id: '1', title: 'Song A');
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const MyMusicScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Titel, Künstler und Alben suchen'), findsOneWidget);
|
||||
expect(find.text('Favoriten'), findsOneWidget);
|
||||
expect(find.text('Wiedergabelisten'), findsOneWidget);
|
||||
expect(find.text('Shuffle-Wiedergabe'), findsOneWidget);
|
||||
expect(find.text('Song A'), findsOneWidget);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Sortier-Menü bietet alle drei Kriterien und sortiert die Liste',
|
||||
(tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final lib = LibraryService(db);
|
||||
final playlists = PlaylistService(db);
|
||||
final handler = MeloAudioHandler(db: db);
|
||||
await _insert(db, id: '1', title: 'Zenit', dateAddedMs: 300, playCount: 9);
|
||||
await _insert(db, id: '2', title: 'Anfang', dateAddedMs: 100, playCount: 1);
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const MyMusicScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Standard: zuletzt hinzugefügt zuerst.
|
||||
var titles = tester.widgetList<Text>(find.byType(Text))
|
||||
.map((t) => t.data)
|
||||
.where((t) => t == 'Zenit' || t == 'Anfang')
|
||||
.toList();
|
||||
expect(titles.first, 'Zenit');
|
||||
|
||||
await tester.tap(find.byIcon(Icons.swap_vert));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Zuletzt hinzugefügt'), findsOneWidget);
|
||||
expect(find.text('Name (A–Z–#)'), findsOneWidget);
|
||||
expect(find.text('Wie oft abgespielt'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.text('Name (A–Z–#)'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Übernehmen'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
titles = tester.widgetList<Text>(find.byType(Text))
|
||||
.map((t) => t.data)
|
||||
.where((t) => t == 'Zenit' || t == 'Anfang')
|
||||
.toList();
|
||||
expect(titles.first, 'Anfang');
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Favoriten-Tab zeigt nur favorisierte Songs mit Shuffle',
|
||||
(tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final lib = LibraryService(db);
|
||||
final playlists = PlaylistService(db);
|
||||
final handler = MeloAudioHandler(db: db);
|
||||
await _insert(db, id: '1', title: 'Geliebt');
|
||||
await _insert(db, id: '2', title: 'Egal');
|
||||
await db.setFavorite('1', true);
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const FavoritesScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Shuffle-Wiedergabe'), findsOneWidget);
|
||||
expect(find.text('Geliebt'), findsOneWidget);
|
||||
expect(find.text('Egal'), findsNothing);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Favoriten-Tab zeigt einen Hinweis, wenn nichts favorisiert ist',
|
||||
(tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final lib = LibraryService(db);
|
||||
final playlists = PlaylistService(db);
|
||||
final handler = MeloAudioHandler(db: db);
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const FavoritesScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Noch keine Favoriten'), findsOneWidget);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
}
|
||||
@@ -17,6 +17,7 @@ Song _song({
|
||||
dateAddedMs: 0,
|
||||
updatedAtMs: 0,
|
||||
deleted: false,
|
||||
playCount: 0,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ void main() {
|
||||
dateAddedMs: 0,
|
||||
updatedAtMs: 0,
|
||||
deleted: false,
|
||||
playCount: 0,
|
||||
);
|
||||
|
||||
final item = songToMediaItem(song);
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:melo/library/database.dart';
|
||||
import 'package:melo/library/song_sort.dart';
|
||||
|
||||
Song _song(
|
||||
String title, {
|
||||
String? id,
|
||||
int dateAddedMs = 0,
|
||||
int playCount = 0,
|
||||
}) {
|
||||
return Song(
|
||||
id: id ?? title,
|
||||
path: '/$title.mp3',
|
||||
title: title,
|
||||
dateAddedMs: dateAddedMs,
|
||||
updatedAtMs: 0,
|
||||
deleted: false,
|
||||
playCount: playCount,
|
||||
);
|
||||
}
|
||||
|
||||
void main() {
|
||||
group('SortMode.name — A-Z, Ziffern/Zeichen unter # ans Ende', () {
|
||||
test('sortiert Buchstaben alphabetisch, Ziffern und Zeichen danach', () {
|
||||
final songs = [
|
||||
_song('9 Lives'),
|
||||
_song('Zenit'),
|
||||
_song('#Hashtag'),
|
||||
_song('Anfang'),
|
||||
];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.name, ascending: true);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['Anfang', 'Zenit', '#Hashtag', '9 Lives']);
|
||||
});
|
||||
|
||||
test('ignoriert Groß-/Kleinschreibung', () {
|
||||
final songs = [_song('beta'), _song('Alpha'), _song('CHARLIE')];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.name, ascending: true);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['Alpha', 'beta', 'CHARLIE']);
|
||||
});
|
||||
|
||||
test('Umlaute sortieren wie ihr Grundbuchstabe', () {
|
||||
final songs = [_song('Zug'), _song('Ärger'), _song('Anfang'), _song('Öl')];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.name, ascending: true);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['Anfang', 'Ärger', 'Öl', 'Zug']);
|
||||
});
|
||||
|
||||
test('absteigend dreht die Reihenfolge um', () {
|
||||
final songs = [_song('Anfang'), _song('9 Lives'), _song('Zenit')];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.name, ascending: false);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['9 Lives', 'Zenit', 'Anfang']);
|
||||
});
|
||||
});
|
||||
|
||||
group('SortMode.dateAdded', () {
|
||||
test('absteigend = zuletzt hinzugefügt zuerst', () {
|
||||
final songs = [
|
||||
_song('Alt', dateAddedMs: 100),
|
||||
_song('Neu', dateAddedMs: 300),
|
||||
_song('Mittel', dateAddedMs: 200),
|
||||
];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.dateAdded, ascending: false);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['Neu', 'Mittel', 'Alt']);
|
||||
});
|
||||
|
||||
test('aufsteigend = ältester zuerst', () {
|
||||
final songs = [
|
||||
_song('Neu', dateAddedMs: 300),
|
||||
_song('Alt', dateAddedMs: 100),
|
||||
];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.dateAdded, ascending: true);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['Alt', 'Neu']);
|
||||
});
|
||||
});
|
||||
|
||||
group('SortMode.playCount', () {
|
||||
test('absteigend = meistgespielt zuerst', () {
|
||||
final songs = [
|
||||
_song('Selten', playCount: 1),
|
||||
_song('Oft', playCount: 42),
|
||||
_song('Nie', playCount: 0),
|
||||
];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.playCount, ascending: false);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['Oft', 'Selten', 'Nie']);
|
||||
});
|
||||
});
|
||||
|
||||
group('Stabilität', () {
|
||||
test('gleiche Sortierwerte werden nach Titel entschieden', () {
|
||||
final songs = [
|
||||
_song('Bravo', id: 'b', dateAddedMs: 5),
|
||||
_song('Alpha', id: 'a', dateAddedMs: 5),
|
||||
];
|
||||
|
||||
final sorted = sortSongs(songs, SortMode.dateAdded, ascending: false);
|
||||
|
||||
expect(sorted.map((s) => s.title), ['Alpha', 'Bravo']);
|
||||
});
|
||||
|
||||
test('verändert die Eingabeliste nicht', () {
|
||||
final songs = [_song('Zenit'), _song('Anfang')];
|
||||
|
||||
sortSongs(songs, SortMode.name, ascending: true);
|
||||
|
||||
expect(songs.map((s) => s.title), ['Zenit', 'Anfang']);
|
||||
});
|
||||
});
|
||||
|
||||
group('Standard-Richtung pro Modus', () {
|
||||
test('Datum und Wiedergaben starten absteigend, Name aufsteigend', () {
|
||||
expect(defaultAscending(SortMode.dateAdded), isFalse);
|
||||
expect(defaultAscending(SortMode.playCount), isFalse);
|
||||
expect(defaultAscending(SortMode.name), isTrue);
|
||||
});
|
||||
});
|
||||
|
||||
group('Beschriftungen', () {
|
||||
test('jeder Modus hat ein deutsches Label', () {
|
||||
expect(SortMode.dateAdded.label, 'Zuletzt hinzugefügt');
|
||||
expect(SortMode.name.label, 'Name (A–Z–#)');
|
||||
expect(SortMode.playCount.label, 'Wie oft abgespielt');
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:melo/library/database.dart';
|
||||
import 'package:melo/player/audio_handler.dart';
|
||||
|
||||
void main() {
|
||||
group('shouldCountPlay', () {
|
||||
test('zählt einen neu gestarteten Titel', () {
|
||||
expect(shouldCountPlay(0, null), isTrue);
|
||||
expect(shouldCountPlay(3, 2), isTrue);
|
||||
});
|
||||
|
||||
test('zählt denselben Titel nicht mehrfach', () {
|
||||
expect(shouldCountPlay(2, 2), isFalse);
|
||||
});
|
||||
|
||||
test('zählt nicht ohne aktuellen Titel', () {
|
||||
expect(shouldCountPlay(null, 1), isFalse);
|
||||
});
|
||||
});
|
||||
|
||||
group('MeloDb.incrementPlayCount', () {
|
||||
late MeloDb db;
|
||||
setUp(() => db = MeloDb(NativeDatabase.memory()));
|
||||
tearDown(() => db.close());
|
||||
|
||||
test('erhöht den Zähler des Songs um eins', () async {
|
||||
await db.upsertSongs([
|
||||
SongsCompanion.insert(
|
||||
id: '1',
|
||||
path: '/a.mp3',
|
||||
title: 'Song A',
|
||||
dateAddedMs: 0,
|
||||
updatedAtMs: 0,
|
||||
),
|
||||
]);
|
||||
|
||||
await db.incrementPlayCount('1');
|
||||
await db.incrementPlayCount('1');
|
||||
|
||||
final song = (await db.watchSongs().first).single;
|
||||
expect(song.playCount, 2);
|
||||
});
|
||||
|
||||
test('lässt andere Songs unberührt', () async {
|
||||
await db.upsertSongs([
|
||||
SongsCompanion.insert(
|
||||
id: '1', path: '/a.mp3', title: 'A', dateAddedMs: 0, updatedAtMs: 0),
|
||||
SongsCompanion.insert(
|
||||
id: '2', path: '/b.mp3', title: 'B', dateAddedMs: 0, updatedAtMs: 0),
|
||||
]);
|
||||
|
||||
await db.incrementPlayCount('1');
|
||||
|
||||
final songs = await db.watchSongs().first;
|
||||
expect(songs.firstWhere((s) => s.id == '1').playCount, 1);
|
||||
expect(songs.firstWhere((s) => s.id == '2').playCount, 0);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -11,6 +11,7 @@ Song _song({required String id, int? durationMs}) {
|
||||
dateAddedMs: 0,
|
||||
updatedAtMs: 0,
|
||||
deleted: false,
|
||||
playCount: 0,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:melo/library/database.dart';
|
||||
import 'package:melo/library/library_service.dart';
|
||||
import 'package:melo/services/offline_mode.dart';
|
||||
import 'package:melo/settings/settings_screen.dart';
|
||||
|
||||
@@ -12,6 +13,7 @@ Widget _wrap(MeloDb db, Widget child) {
|
||||
providers: [
|
||||
Provider<MeloDb>.value(value: db),
|
||||
ChangeNotifierProvider<OfflineMode>.value(value: OfflineMode()),
|
||||
ChangeNotifierProvider<LibraryService>.value(value: LibraryService(db)),
|
||||
],
|
||||
child: MaterialApp(home: child),
|
||||
);
|
||||
@@ -63,6 +65,11 @@ void main() {
|
||||
await tester.pumpWidget(_wrap(db, const SettingsScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Die Sync-Einträge liegen weiter unten in der Liste und müssen erst
|
||||
// in den sichtbaren Bereich gescrollt werden.
|
||||
await tester.scrollUntilVisible(find.text('🌟 Favoriten-Sync'), 200);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('🌟 Favoriten-Sync'), findsOneWidget);
|
||||
expect(find.text('📋 Playlisten-Sync'), findsOneWidget);
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:melo/library/song_sort.dart';
|
||||
import 'package:melo/shared/sort_store.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
void main() {
|
||||
setUp(() => SharedPreferences.setMockInitialValues({}));
|
||||
|
||||
test('ohne gespeicherte Wahl gilt "Zuletzt hinzugefügt", neueste zuerst',
|
||||
() async {
|
||||
final setting = await SortStore.load('meine_musik');
|
||||
|
||||
expect(setting.mode, SortMode.dateAdded);
|
||||
expect(setting.ascending, isFalse);
|
||||
});
|
||||
|
||||
test('gespeicherte Wahl wird zurückgelesen', () async {
|
||||
await SortStore.save(
|
||||
'meine_musik',
|
||||
const SortSetting(SortMode.name, ascending: true),
|
||||
);
|
||||
|
||||
final setting = await SortStore.load('meine_musik');
|
||||
|
||||
expect(setting.mode, SortMode.name);
|
||||
expect(setting.ascending, isTrue);
|
||||
});
|
||||
|
||||
test('Listen speichern getrennt voneinander', () async {
|
||||
await SortStore.save(
|
||||
'meine_musik',
|
||||
const SortSetting(SortMode.playCount, ascending: false),
|
||||
);
|
||||
await SortStore.save(
|
||||
'favoriten',
|
||||
const SortSetting(SortMode.name, ascending: true),
|
||||
);
|
||||
|
||||
expect((await SortStore.load('meine_musik')).mode, SortMode.playCount);
|
||||
expect((await SortStore.load('favoriten')).mode, SortMode.name);
|
||||
});
|
||||
|
||||
test('unbrauchbarer gespeicherter Wert fällt auf den Standard zurück',
|
||||
() async {
|
||||
SharedPreferences.setMockInitialValues({'sort_meine_musik_mode': 99});
|
||||
|
||||
final setting = await SortStore.load('meine_musik');
|
||||
|
||||
expect(setting.mode, SortMode.dateAdded);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user