import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:spotiflac_android/screens/now_playing_screen.dart'; import 'package:spotiflac_android/services/app_orientation.dart'; class _PlayerRoute extends NowPlayingRoute { @override Widget buildPage( BuildContext context, Animation animation, Animation secondaryAnimation, ) => const SizedBox.expand(); } void main() { TestWidgetsFlutterBinding.ensureInitialized(); const portrait = ['DeviceOrientation.portraitUp']; const player = [ 'DeviceOrientation.portraitUp', 'DeviceOrientation.landscapeLeft', 'DeviceOrientation.landscapeRight', ]; final requests = >[]; final messenger = TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger; setUp(() { requests.clear(); messenger.setMockMethodCallHandler(SystemChannels.platform, (call) async { if (call.method == 'SystemChrome.setPreferredOrientations') { requests.add((call.arguments as List).cast()); } return null; }); }); tearDown( () => messenger.setMockMethodCallHandler(SystemChannels.platform, null), ); Future pumpApp(WidgetTester tester) async { final key = GlobalKey(); await tester.pumpWidget( MaterialApp( navigatorKey: key, navigatorObservers: [AppOrientationObserver()], home: const Scaffold(body: Text('Library')), ), ); await tester.pumpAndSettle(); expect(requests, [portrait]); return key.currentState!; } test('startup requests portrait before the first route is built', () async { await setAppOrientation(); expect(requests, [portrait]); }); testWidgets('only the full player enables landscape; sheets inherit it', ( tester, ) async { final navigator = await pumpApp(tester); navigator.push(_PlayerRoute()); await tester.pumpAndSettle(); expect(requests, [portrait, player]); showModalBottomSheet( context: navigator.context, builder: (_) => const SizedBox(height: 100, child: Text('Player options')), ); await tester.pumpAndSettle(); expect(requests, [portrait, player]); navigator.pop(); await tester.pumpAndSettle(); expect(requests, [portrait, player]); navigator.push( MaterialPageRoute( builder: (_) => const Scaffold(body: Text('Album')), ), ); await tester.pumpAndSettle(); expect(requests, [portrait, player, portrait]); navigator.pop(); await tester.pumpAndSettle(); expect(requests, [portrait, player, portrait, player]); await tester.binding.handlePopRoute(); await tester.pumpAndSettle(); expect(requests, [portrait, player, portrait, player, portrait]); expect(tester.takeException(), isNull); }); testWidgets('cancelled dismissal keeps rotation; completed drag locks it', ( tester, ) async { final navigator = await pumpApp(tester); final route = _PlayerRoute(); navigator.push(route); await tester.pumpAndSettle(); route.startDrag(); route.updateDrag( DragUpdateDetails( globalPosition: const Offset(0, 240), delta: const Offset(0, 240), primaryDelta: 240, ), 600, ); await tester.pump(); route.cancelDrag(); await tester.pumpAndSettle(); expect(requests, [portrait, player]); route.startDrag(); route.endDrag( DragEndDetails( primaryVelocity: 1200, velocity: const Velocity(pixelsPerSecond: Offset(0, 1200)), ), 600, ); await tester.pumpAndSettle(); expect(requests, [portrait, player, portrait]); expect(tester.takeException(), isNull); }); testWidgets('removing and replacing routes cannot leave landscape enabled', ( tester, ) async { final navigator = await pumpApp(tester); final firstPlayer = _PlayerRoute(); navigator.push(firstPlayer); await tester.pumpAndSettle(); final secondPlayer = _PlayerRoute(); navigator.push(secondPlayer); await tester.pumpAndSettle(); navigator.removeRoute(firstPlayer); await tester.pumpAndSettle(); expect(requests, [portrait, player]); navigator.pushReplacement( MaterialPageRoute( builder: (_) => const Scaffold(body: Text('Settings')), ), ); await tester.pumpAndSettle(); expect(requests, [portrait, player, portrait]); final thirdPlayer = _PlayerRoute(); navigator.push(thirdPlayer); await tester.pumpAndSettle(); navigator.removeRoute(thirdPlayer); await tester.pumpAndSettle(); expect(requests, [portrait, player, portrait, player, portrait]); expect(tester.takeException(), isNull); }); }