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.value(value: db), ChangeNotifierProvider.value(value: lib), ChangeNotifierProvider.value(value: playlists), Provider.value(value: handler), ChangeNotifierProvider(create: (_) => CategoryService(db)), ChangeNotifierProvider(create: (_) => AppSettings()), ], child: MaterialApp(home: Scaffold(body: child)), ); } Future _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(); }); }