import 'package:cardash_launcher/core/theme/app_theme.dart'; import 'package:cardash_launcher/data/models/jellyfin_library.dart'; import 'package:cardash_launcher/data/services/jellyfin_library_service.dart'; import 'package:cardash_launcher/features/settings/jellyfin_genre_dialog.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'jellyfin_fakes.dart'; void main() { testWidgets('groups genres, caps at five and returns the selection', ( tester, ) async { await tester.binding.setSurfaceSize(const Size(1024, 700)); addTearDown(() => tester.binding.setSurfaceSize(null)); final gateway = FakeJellyfinLibraryGateway() ..genres = const ['Metal', 'Rock', 'Jazz', 'Pop', 'Folk', 'Blues']; final library = JellyfinLibraryService( connectionProvider: () => testJellyfinConnection, gateway: gateway, ); List? result; await tester.pumpWidget( MaterialApp( theme: AppTheme.light(), home: Scaffold( body: Builder( builder: (context) => Center( child: ElevatedButton( onPressed: () async { result = await showJellyfinGenreDialog( context, library: library, selected: const [], ); }, child: const Text('Open genres'), ), ), ), ), ), ); await tester.tap(find.text('Open genres')); await tester.pumpAndSettle(); expect(find.text('Random genres'), findsOneWidget); expect(find.text('0 / 5'), findsOneWidget); expect(find.text('Metal'), findsOneWidget); expect(find.text('Rock'), findsOneWidget); expect(find.text('Jazz'), findsOneWidget); expect(find.text('Pop'), findsOneWidget); expect(find.text('Folk'), findsOneWidget); expect(find.text('Blues'), findsOneWidget); for (var index = 0; index < 5; index++) { await tester.tap(find.byType(Checkbox).at(index)); await tester.pump(); } expect(find.text('5 / 5'), findsOneWidget); expect(find.text('Deselect one to choose another.'), findsOneWidget); final sixth = tester.widget(find.byType(Checkbox).at(5)); expect(sixth.onChanged, isNull); await tester.tap(find.text('Save')); await tester.pumpAndSettle(); expect(result, isNotNull); expect(result!.length, 5); expect(result!.map((entry) => entry.label), [ 'Metal', 'Rock', 'Jazz', 'Pop', 'Folk', ]); }); }