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); }); }); }