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_service.dart'; import 'package:melo/services/baka_auth.dart'; import 'package:melo/services/melo_cloud_service.dart'; import 'package:melo/services/offline_mode.dart'; import 'package:melo/services/sync_service.dart'; import 'package:melo/settings/app_settings.dart'; import 'package:melo/settings/settings_screen.dart'; /// Token-Ablage ohne Plattform-Kanäle — im Test gibt es keinen sicheren /// Gerätespeicher. class _MemorySpeicher implements TokenSpeicher { final Map werte = {}; @override Future lesen(String key) async => werte[key]; @override Future schreiben(String key, String wert) async => werte[key] = wert; @override Future loeschen(String key) async => werte.remove(key); } Widget _wrap(MeloDb db, Widget child) { return MultiProvider( providers: [ Provider.value(value: db), ChangeNotifierProvider.value(value: OfflineMode()), ChangeNotifierProvider.value(value: LibraryService(db)), ChangeNotifierProvider(create: (_) => AppSettings()), ChangeNotifierProvider( create: (_) => BakaAuth(speicher: _MemorySpeicher())), ChangeNotifierProvider( create: (context) => SyncService( db: db, cloud: MeloCloudService(auth: context.read()), )), ], child: MaterialApp(home: child), ); } void main() { testWidgets('zeigt 0 Songs ohne Bibliothek', (tester) async { final db = MeloDb(NativeDatabase.memory()); await tester.pumpWidget(_wrap(db, const SettingsScreen())); await tester.pumpAndSettle(); expect(find.text('0 Songs in der Bibliothek'), findsOneWidget); await db.close(); }); testWidgets('zeigt korrekte Song-Anzahl und Gesamtspieldauer', (tester) async { final db = MeloDb(NativeDatabase.memory()); await db.into(db.songs).insert(SongsCompanion.insert( id: 'song-1', path: '/a.mp3', title: 'Song A', dateAddedMs: 0, updatedAtMs: 0, durationMs: const Value(200000), )); await db.into(db.songs).insert(SongsCompanion.insert( id: 'song-2', path: '/b.mp3', title: 'Song B', dateAddedMs: 0, updatedAtMs: 0, durationMs: const Value(185000), )); await tester.pumpWidget(_wrap(db, const SettingsScreen())); await tester.pumpAndSettle(); expect(find.text('2 Songs in der Bibliothek'), findsOneWidget); expect(find.text('6m Gesamtspieldauer'), findsOneWidget); await db.close(); }); testWidgets('zeigt Favoriten- und Playlisten-Sync', (tester) async { final db = MeloDb(NativeDatabase.memory()); 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); await db.close(); }); }