173 lines
5.4 KiB
Dart
173 lines
5.4 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/group_rides/group_rides_hub_screen.dart';
|
|
import 'package:motorcycle_dash/features/group_rides/create_group_ride_screen.dart';
|
|
import 'package:motorcycle_dash/services/auth/auth_user.dart';
|
|
import 'package:motorcycle_dash/services/auth/auth_providers.dart';
|
|
import 'package:motorcycle_dash/services/group_rides/group_ride_models.dart';
|
|
import 'package:motorcycle_dash/services/group_rides/group_ride_providers.dart';
|
|
import 'package:motorcycle_dash/services/social/rider_profile_models.dart';
|
|
import 'package:motorcycle_dash/services/social/social_providers.dart';
|
|
import 'package:motorcycle_dash/core/router.dart';
|
|
|
|
void main() {
|
|
group('GroupRidesHubScreen Widget Tests', () {
|
|
testWidgets('shows account required notice when signed out',
|
|
(tester) async {
|
|
await tester.pumpWidget(
|
|
ProviderScope(
|
|
overrides: [
|
|
currentUserProvider.overrideWithValue(null),
|
|
],
|
|
child: const MaterialApp(
|
|
home: GroupRidesHubScreen(),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.text('Rider Account Required'), findsOneWidget);
|
|
expect(find.text('SIGN IN / CREATE ACCOUNT'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('tapping sign in button navigates to /account',
|
|
(tester) async {
|
|
appRouter.go('/group-rides');
|
|
await tester.pumpWidget(
|
|
ProviderScope(
|
|
overrides: [
|
|
currentUserProvider.overrideWithValue(null),
|
|
],
|
|
child: MaterialApp.router(
|
|
routerConfig: appRouter,
|
|
),
|
|
),
|
|
);
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('SIGN IN / CREATE ACCOUNT'), findsOneWidget);
|
|
await tester.tap(find.text('SIGN IN / CREATE ACCOUNT'));
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('Account & Cloud Identity'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('renders tabs and empty states when authenticated',
|
|
(tester) async {
|
|
const user = AuthUser(
|
|
uid: 'alice',
|
|
email: 'alice@example.com',
|
|
isAnonymous: false,
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
ProviderScope(
|
|
overrides: [
|
|
currentUserProvider.overrideWithValue(user),
|
|
upcomingGroupRidesProvider.overrideWith(
|
|
(ref) => Stream.value([]),
|
|
),
|
|
],
|
|
child: const MaterialApp(
|
|
home: GroupRidesHubScreen(),
|
|
),
|
|
),
|
|
);
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('UPCOMING RIDES'), findsOneWidget);
|
|
expect(find.text('MY RIDES'), findsOneWidget);
|
|
expect(find.text('No Upcoming Group Rides'), findsOneWidget);
|
|
expect(find.text('NEW RIDE'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('renders upcoming ride card when data present',
|
|
(tester) async {
|
|
const user = AuthUser(
|
|
uid: 'alice',
|
|
email: 'alice@example.com',
|
|
isAnonymous: false,
|
|
);
|
|
|
|
final now = DateTime.now();
|
|
final ride = GroupRide(
|
|
id: 'ride_1',
|
|
organizerUid: 'bob',
|
|
organizerHandle: 'bob_fast',
|
|
organizerDisplayName: 'Bob Fast',
|
|
title: 'Sunday Morning Twisties',
|
|
scheduledStartAt: now.add(const Duration(days: 1)),
|
|
departureAt: now.add(const Duration(days: 1, minutes: 30)),
|
|
participantCount: 3,
|
|
meetingPoint: const GroupRideLocation(
|
|
latitude: 34.0,
|
|
longitude: -84.0,
|
|
displayName: 'Dahlonega Chevron',
|
|
),
|
|
createdAt: now,
|
|
updatedAt: now,
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
ProviderScope(
|
|
overrides: [
|
|
currentUserProvider.overrideWithValue(user),
|
|
upcomingGroupRidesProvider.overrideWith(
|
|
(ref) => Stream.value([ride]),
|
|
),
|
|
],
|
|
child: const MaterialApp(
|
|
home: GroupRidesHubScreen(),
|
|
),
|
|
),
|
|
);
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('Sunday Morning Twisties'), findsOneWidget);
|
|
expect(find.textContaining('Dahlonega Chevron'), findsOneWidget);
|
|
expect(find.text('3'), findsOneWidget);
|
|
});
|
|
});
|
|
|
|
group('CreateGroupRideScreen Widget Tests', () {
|
|
testWidgets('renders form fields and validates title', (tester) async {
|
|
final now = DateTime.now();
|
|
final profile = RiderProfile(
|
|
uid: 'alice',
|
|
handle: 'alice_apex',
|
|
displayName: 'Alice Apex',
|
|
createdAt: now,
|
|
updatedAt: now,
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
ProviderScope(
|
|
overrides: [
|
|
myRiderProfileProvider.overrideWith(
|
|
(ref) => Stream.value(profile),
|
|
),
|
|
],
|
|
child: const MaterialApp(
|
|
home: CreateGroupRideScreen(),
|
|
),
|
|
),
|
|
);
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('CREATE GROUP RIDE'), findsOneWidget);
|
|
expect(find.text('1. RIDE DETAILS'), findsOneWidget);
|
|
expect(find.text('2. DATE & SCHEDULE'), findsOneWidget);
|
|
expect(find.text('3. MEETING LOCATION'), findsOneWidget);
|
|
|
|
// Attempt submit without filling title
|
|
await tester.tap(find.text('PUBLISH'));
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('Title must be at least 3 characters'), findsOneWidget);
|
|
});
|
|
});
|
|
}
|