Tab-Struktur nach Referenz-UI: Online-Tab + Unterreiter Songs/Kuenstler/Alben
Untere Navigation folgt jetzt den Referenzbildern: Meine Musik / Online / Suchen / Favoriten. Der bisherige "Download"-Tab heisst "Online" und bekommt als Naechstes den YouTube-Downloader. In "Meine Musik" gibt es Unterreiter (Songs/Kuenstler/Alben) im Pillen-Stil der Referenz. Sie wechseln nur den Inhalt statt einen Bildschirm zu oeffnen; die Schnellzugriff-Kacheln "Kuenstler"/"Alben" entfallen dadurch, ebenso die damit tot gewordenen ArtistsScreen/AlbumsScreen-Huellen. 158 Tests gruen, flutter analyze ohne Befund. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018NLW1q1hzEC9goDQ1dJ98d
This commit is contained in:
co-authored by
Claude Opus 5
parent
4ebd0a8dd4
commit
a625d70da8
@@ -0,0 +1,118 @@
|
||||
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/category_service.dart';
|
||||
import 'package:melo/library/database.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:melo/settings/app_settings.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),
|
||||
ChangeNotifierProvider<CategoryService>(create: (_) => CategoryService(db)),
|
||||
ChangeNotifierProvider<AppSettings>(create: (_) => AppSettings()),
|
||||
],
|
||||
child: MaterialApp(home: Scaffold(body: child)),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _insert(
|
||||
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() {
|
||||
setUp(() => SharedPreferences.setMockInitialValues({}));
|
||||
|
||||
testWidgets('Meine Musik hat die Unterreiter Songs, Künstler und Alben',
|
||||
(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', artist: 'Neoni', album: 'Roses');
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const MyMusicScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Songs'), findsOneWidget);
|
||||
expect(find.text('Künstler'), findsOneWidget);
|
||||
expect(find.text('Alben'), findsOneWidget);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Unterreiter Künstler zeigt die Künstlerliste statt der Songs',
|
||||
(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', artist: 'Neoni', album: 'Roses');
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const MyMusicScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.text('Künstler'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Neoni'), findsOneWidget);
|
||||
// Unterreiter wechseln den Inhalt, sie öffnen keinen neuen Bildschirm —
|
||||
// Suchfeld und Reiter bleiben sichtbar.
|
||||
expect(find.text('Titel, Künstler und Alben suchen'), findsOneWidget);
|
||||
expect(find.text('Songs'), findsOneWidget);
|
||||
expect(find.text('Shuffle-Wiedergabe'), findsNothing);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Unterreiter Alben zeigt die Albenliste', (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', artist: 'Neoni', album: 'Roses');
|
||||
|
||||
await tester.pumpWidget(
|
||||
_wrap(db, lib, playlists, handler, const MyMusicScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.text('Alben'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Roses'), findsOneWidget);
|
||||
expect(find.text('Titel, Künstler und Alben suchen'), findsOneWidget);
|
||||
expect(find.text('Songs'), findsOneWidget);
|
||||
|
||||
handler.dispose();
|
||||
await db.close();
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user