114 lines
3.5 KiB
Dart
114 lines
3.5 KiB
Dart
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);
|
|
});
|
|
}
|