MotorSignal-App/test/group_rides_widget_test.dart

150 lines
4.7 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';
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('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);
});
});
}