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/playlist_service.dart'; import 'package:melo/shared/favorite_button.dart'; /// Ein Titel, der nur am Server liegt, hat keine UUID in der Bibliothek. /// Früher kam an dieser Stelle der leere String an: das Herz füllte sich, /// in den Favoriten (INNER JOIN auf songs) tauchte aber nie etwas auf. void main() { Future pumpe(WidgetTester tester, MeloDb db, String songId) { return tester.pumpWidget( MultiProvider( providers: [ Provider.value(value: db), ChangeNotifierProvider.value( value: PlaylistService(db)), ], child: MaterialApp( home: Scaffold(body: FavoriteButton(songId: songId)), ), ), ); } testWidgets('ohne Song-ID ist das Herz nicht bedienbar', (tester) async { final db = MeloDb(NativeDatabase.memory()); await pumpe(tester, db, ''); await tester.pumpAndSettle(); final knopf = tester.widget(find.byType(IconButton)); expect(knopf.onPressed, isNull); await tester.pumpWidget(const SizedBox()); await tester.pump(const Duration(milliseconds: 1)); }); testWidgets('ohne Song-ID entsteht kein Favoriten-Eintrag', (tester) async { final db = MeloDb(NativeDatabase.memory()); await pumpe(tester, db, ''); await tester.pumpAndSettle(); await tester.tap(find.byType(IconButton)); await tester.pumpAndSettle(); expect(await db.select(db.favorites).get(), isEmpty); await tester.pumpWidget(const SizedBox()); await tester.pump(const Duration(milliseconds: 1)); }); testWidgets('mit Song-ID bleibt das Herz bedienbar', (tester) async { final db = MeloDb(NativeDatabase.memory()); await db.into(db.songs).insert(SongsCompanion.insert( id: 'song-1', path: '/a.mp3', title: 'A', dateAddedMs: 0, updatedAtMs: 0, )); await pumpe(tester, db, 'song-1'); await tester.pumpAndSettle(); final knopf = tester.widget(find.byType(IconButton)); expect(knopf.onPressed, isNotNull); await tester.pumpWidget(const SizedBox()); await tester.pump(const Duration(milliseconds: 1)); }); }