fix: stabilize hidden library focus traversal
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
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<void> _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<SideNavigationRailState>();
|
||||
var selectedLibraryKey = '';
|
||||
|
||||
await tester.pumpWidget(
|
||||
TranslationProvider(
|
||||
child: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider<LibrariesProvider>.value(value: librariesProvider),
|
||||
ChangeNotifierProvider<HiddenLibrariesProvider>.value(value: hiddenLibrariesProvider),
|
||||
ChangeNotifierProvider<MultiServerProvider>.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);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user