import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:motorcycle_dash/features/routes/route_planner_screen.dart'; import 'package:motorcycle_dash/services/auth/auth_providers.dart'; import 'package:motorcycle_dash/services/auth/auth_user.dart'; import 'package:motorcycle_dash/services/entitlements/entitlement_providers.dart'; void main() { testWidgets('RoutePlannerScreen renders title, empty state, and stop controls', (tester) async { await tester.binding.setSurfaceSize(const Size(360, 640)); await tester.pumpWidget( ProviderScope( overrides: [ currentUserProvider.overrideWith((ref) => const AuthUser( uid: 'alice', isAnonymous: false, )), isProSubscriberProvider.overrideWith((ref) => false), ], child: const MaterialApp( home: RoutePlannerScreen(), ), ), ); await tester.pumpAndSettle(); // Verify AppBar title expect(find.text('ROUTE PLANNER'), findsOneWidget); expect(find.text('SAVE'), findsOneWidget); // Verify Empty state message expect(find.text('No stops added yet.'), findsOneWidget); expect(find.text('ADD STOP'), findsOneWidget); expect(find.text('CURRENT GPS'), findsOneWidget); }); testWidgets('RoutePlannerScreen handles adding a stop', (tester) async { await tester.binding.setSurfaceSize(const Size(360, 640)); await tester.pumpWidget( ProviderScope( overrides: [ currentUserProvider.overrideWith((ref) => const AuthUser( uid: 'alice', isAnonymous: false, )), isProSubscriberProvider.overrideWith((ref) => false), ], child: const MaterialApp( home: RoutePlannerScreen(), ), ), ); await tester.pumpAndSettle(); // Tap ADD STOP await tester.tap(find.text('ADD STOP')); await tester.pumpAndSettle(); // Dialog appears expect(find.text('Add Route Stop'), findsOneWidget); // Enter name, lat, lng final dialogTextFields = find.descendant( of: find.byType(AlertDialog), matching: find.byType(TextField), ); await tester.enterText(dialogTextFields.at(0), 'Alice\'s Restaurant'); await tester.enterText(dialogTextFields.at(1), '37.3861'); await tester.enterText(dialogTextFields.at(2), '-122.2641'); // Tap ADD button in dialog await tester.tap(find.text('ADD')); await tester.pumpAndSettle(); // Verify stop is added in list expect(find.text('Alice\'s Restaurant'), findsOneWidget); expect(find.text('1/25 STOPS'), findsOneWidget); }); testWidgets('RoutePlannerScreen responsive layout on narrow 320dp screen', (tester) async { // 320dp narrow device test await tester.binding.setSurfaceSize(const Size(320, 568)); await tester.pumpWidget( ProviderScope( overrides: [ currentUserProvider.overrideWith((ref) => const AuthUser( uid: 'alice', isAnonymous: false, )), isProSubscriberProvider.overrideWith((ref) => false), ], child: const MaterialApp( home: RoutePlannerScreen(), ), ), ); await tester.pumpAndSettle(); // On narrow screen, compact labels 'ADD' and 'GPS' are shown expect(find.text('ADD'), findsOneWidget); expect(find.text('GPS'), findsOneWidget); // No RenderFlex overflow expect(tester.takeException(), isNull); }); }