import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/i18n/strings.g.dart'; import 'package:plezy/media/media_backend.dart'; import 'package:plezy/media/media_kind.dart'; import 'package:plezy/media/media_library.dart'; import 'package:plezy/navigation/navigation_tabs.dart'; import 'package:plezy/providers/hidden_libraries_provider.dart'; import 'package:plezy/providers/libraries_provider.dart'; import 'package:plezy/providers/multi_server_provider.dart'; import 'package:plezy/services/data_aggregation_service.dart'; import 'package:plezy/services/multi_server_manager.dart'; import 'package:plezy/services/settings_service.dart'; import 'package:plezy/theme/mono_tokens.dart'; import 'package:plezy/widgets/side_navigation_rail.dart'; import 'package:provider/provider.dart'; import '../test_helpers/prefs.dart'; const _testTokens = MonoTokens( radiusSm: 8, radiusMd: 12, space: 8, fast: Duration(milliseconds: 1), normal: Duration(milliseconds: 1), slow: Duration(milliseconds: 1), bg: Colors.black, surface: Colors.black, outline: Colors.white24, text: Colors.white, textMuted: Colors.white70, splashFactory: NoSplash.splashFactory, ); MediaLibrary _library({ required String id, required String title, required String serverId, required String serverName, }) { return MediaLibrary( id: id, backend: MediaBackend.plex, title: title, kind: MediaKind.movie, serverId: serverId, serverName: serverName, ); } Future _press(WidgetTester tester, LogicalKeyboardKey key) async { await tester.sendKeyEvent(key); await tester.pumpAndSettle(); } void main() { TestWidgetsFlutterBinding.ensureInitialized(); setUp(() { resetSharedPreferencesForTest(); SettingsService.resetForTesting(); LocaleSettings.setLocaleSync(AppLocale.en); }); testWidgets('D-pad down from a hidden server header focuses that hidden server library', (tester) async { await SettingsService.getInstance(); final visibleServerALibrary = _library( id: '1', title: 'Visible Server A', serverId: 'server-a', serverName: 'Server A', ); final hiddenServerALibrary = _library( id: '2', title: 'Hidden Server A', serverId: 'server-a', serverName: 'Server A', ); final visibleServerBLibrary = _library( id: '1', title: 'Visible Server B', serverId: 'server-b', serverName: 'Server B', ); final librariesProvider = LibrariesProvider(); await librariesProvider.updateLibraryOrder([visibleServerALibrary, hiddenServerALibrary, visibleServerBLibrary]); addTearDown(librariesProvider.dispose); final hiddenLibrariesProvider = HiddenLibrariesProvider(); await hiddenLibrariesProvider.ensureInitialized(); await hiddenLibrariesProvider.hideLibrary(hiddenServerALibrary.globalKey); addTearDown(hiddenLibrariesProvider.dispose); final manager = MultiServerManager(); final aggregation = DataAggregationService(manager); final multiServerProvider = MultiServerProvider(manager, aggregation); addTearDown(multiServerProvider.dispose); final sideNavKey = GlobalKey(); var selectedLibraryKey = ''; await tester.pumpWidget( TranslationProvider( child: MultiProvider( providers: [ ChangeNotifierProvider.value(value: librariesProvider), ChangeNotifierProvider.value(value: hiddenLibrariesProvider), ChangeNotifierProvider.value(value: multiServerProvider), ], child: MaterialApp( theme: ThemeData(extensions: const [_testTokens]), home: Scaffold( body: SideNavigationRail( key: sideNavKey, selectedTab: NavigationTabId.discover, isSidebarFocused: true, alwaysExpanded: true, onDestinationSelected: (_) {}, onLibrarySelected: (key) => selectedLibraryKey = key, ), ), ), ), ), ); await tester.pumpAndSettle(); sideNavKey.currentState!.focusActiveItem(); await tester.pumpAndSettle(); // Home -> Libraries -> Server A header -> visible A -> Server B header -> visible B -> Hidden Libraries. for (var i = 0; i < 6; i++) { await _press(tester, LogicalKeyboardKey.arrowDown); } await _press(tester, LogicalKeyboardKey.enter); // Hidden Libraries -> hidden Server A header -> hidden Server A library. await _press(tester, LogicalKeyboardKey.arrowDown); await _press(tester, LogicalKeyboardKey.arrowDown); await _press(tester, LogicalKeyboardKey.enter); expect(selectedLibraryKey, hiddenServerALibrary.globalKey); }); }