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