jellyfin_genre_dialog_test.dart 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:cardash_launcher/core/theme/app_theme.dart';
  2. import 'package:cardash_launcher/data/models/jellyfin_library.dart';
  3. import 'package:cardash_launcher/data/services/jellyfin_library_service.dart';
  4. import 'package:cardash_launcher/features/settings/jellyfin_genre_dialog.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:flutter_test/flutter_test.dart';
  7. import 'jellyfin_fakes.dart';
  8. void main() {
  9. testWidgets('groups genres, caps at five and returns the selection', (
  10. tester,
  11. ) async {
  12. await tester.binding.setSurfaceSize(const Size(1024, 700));
  13. addTearDown(() => tester.binding.setSurfaceSize(null));
  14. final gateway = FakeJellyfinLibraryGateway()
  15. ..genres = const ['Metal', 'Rock', 'Jazz', 'Pop', 'Folk', 'Blues'];
  16. final library = JellyfinLibraryService(
  17. connectionProvider: () => testJellyfinConnection,
  18. gateway: gateway,
  19. );
  20. List<JellyfinGenreSelection>? result;
  21. await tester.pumpWidget(
  22. MaterialApp(
  23. theme: AppTheme.light(),
  24. home: Scaffold(
  25. body: Builder(
  26. builder: (context) => Center(
  27. child: ElevatedButton(
  28. onPressed: () async {
  29. result = await showJellyfinGenreDialog(
  30. context,
  31. library: library,
  32. selected: const [],
  33. );
  34. },
  35. child: const Text('Open genres'),
  36. ),
  37. ),
  38. ),
  39. ),
  40. ),
  41. );
  42. await tester.tap(find.text('Open genres'));
  43. await tester.pumpAndSettle();
  44. expect(find.text('Random genres'), findsOneWidget);
  45. expect(find.text('0 / 5'), findsOneWidget);
  46. expect(find.text('Metal'), findsOneWidget);
  47. expect(find.text('Rock'), findsOneWidget);
  48. expect(find.text('Jazz'), findsOneWidget);
  49. expect(find.text('Pop'), findsOneWidget);
  50. expect(find.text('Folk'), findsOneWidget);
  51. expect(find.text('Blues'), findsOneWidget);
  52. for (var index = 0; index < 5; index++) {
  53. await tester.tap(find.byType(Checkbox).at(index));
  54. await tester.pump();
  55. }
  56. expect(find.text('5 / 5'), findsOneWidget);
  57. expect(find.text('Deselect one to choose another.'), findsOneWidget);
  58. final sixth = tester.widget<Checkbox>(find.byType(Checkbox).at(5));
  59. expect(sixth.onChanged, isNull);
  60. await tester.tap(find.text('Save'));
  61. await tester.pumpAndSettle();
  62. expect(result, isNotNull);
  63. expect(result!.length, 5);
  64. expect(result!.map((entry) => entry.label), [
  65. 'Metal',
  66. 'Rock',
  67. 'Jazz',
  68. 'Pop',
  69. 'Folk',
  70. ]);
  71. });
  72. }