jellyfin_album_screen_test.dart 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import 'package:cardash_launcher/core/theme/app_theme.dart';
  2. import 'package:cardash_launcher/data/services/jellyfin_library_service.dart';
  3. import 'package:cardash_launcher/features/home/system_controller.dart';
  4. import 'package:cardash_launcher/features/home/widgets/volume_card.dart';
  5. import 'package:cardash_launcher/features/jellyfin/jellyfin_album_screen.dart';
  6. import 'package:cardash_launcher/features/jellyfin/jellyfin_playback_controller.dart';
  7. import 'package:cardash_launcher/features/settings/jellyfin_controller.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:flutter_test/flutter_test.dart';
  10. import 'package:provider/provider.dart';
  11. import 'jellyfin_fakes.dart';
  12. void main() {
  13. testWidgets('shows the album, track list and transport, and changes tracks', (
  14. tester,
  15. ) async {
  16. await tester.binding.setSurfaceSize(const Size(1280, 800));
  17. addTearDown(() => tester.binding.setSurfaceSize(null));
  18. final jellyfin = await configuredJellyfinController();
  19. final gateway = FakeJellyfinLibraryGateway()
  20. ..tracks = {
  21. 'album-1': [
  22. track('t1', albumId: 'album-1', albumName: 'Album 1', index: 1),
  23. track('t2', albumId: 'album-1', albumName: 'Album 1', index: 2),
  24. track('t3', albumId: 'album-1', albumName: 'Album 1', index: 3),
  25. ],
  26. };
  27. final library = JellyfinLibraryService(
  28. connectionProvider: () => jellyfin.connection,
  29. gateway: gateway,
  30. );
  31. final platform = FakeJellyfinPlaybackPlatform();
  32. final playback = JellyfinPlaybackController(
  33. platform,
  34. library,
  35. jellyfin,
  36. pollInterval: const Duration(hours: 1),
  37. );
  38. await playback.playAlbum(album('album-1'));
  39. final system = SystemController(FakeSystemPlatform());
  40. await tester.pumpWidget(
  41. MultiProvider(
  42. providers: [
  43. Provider<JellyfinLibraryService>.value(value: library),
  44. ChangeNotifierProvider<JellyfinController>.value(value: jellyfin),
  45. ChangeNotifierProvider<JellyfinPlaybackController>.value(
  46. value: playback,
  47. ),
  48. ChangeNotifierProvider<SystemController>.value(value: system),
  49. ],
  50. child: MaterialApp(
  51. theme: AppTheme.light(),
  52. home: JellyfinAlbumScreen(album: album('album-1')),
  53. ),
  54. ),
  55. );
  56. await tester.pumpAndSettle();
  57. expect(find.text('Album album-1'), findsOneWidget);
  58. expect(find.text('Tracks'), findsOneWidget);
  59. expect(find.text('Track t1'), findsWidgets);
  60. expect(find.text('Track t2'), findsOneWidget);
  61. expect(find.text('Track t3'), findsOneWidget);
  62. expect(find.text('Now playing'), findsOneWidget);
  63. expect(find.byType(VolumeCard), findsOneWidget);
  64. expect(find.bySemanticsLabel('Previous track'), findsOneWidget);
  65. expect(find.bySemanticsLabel('Next track'), findsOneWidget);
  66. expect(tester.takeException(), isNull);
  67. await tester.tap(find.bySemanticsLabel('Next track'));
  68. await tester.pumpAndSettle();
  69. expect(platform.commands, contains('next'));
  70. expect(playback.currentItem?.trackId, 't2');
  71. expect(find.text('Track t2'), findsWidgets);
  72. await tester.tap(find.text('Track t3'));
  73. await tester.pumpAndSettle();
  74. expect(platform.commands, contains('seekToIndex:2'));
  75. expect(playback.currentItem?.trackId, 't3');
  76. await tester.tap(find.bySemanticsLabel('Previous track'));
  77. await tester.pumpAndSettle();
  78. expect(platform.commands, contains('previous'));
  79. expect(playback.currentItem?.trackId, 't2');
  80. await tester.pumpWidget(const SizedBox.shrink());
  81. playback.dispose();
  82. jellyfin.dispose();
  83. system.dispose();
  84. });
  85. }