MotorSignal-App/test/club_preview_screen_test.dart

214 lines
7.1 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/core/theme/theme_extensions.dart';
import 'package:motorcycle_dash/features/social/clubs/club_preview_screen.dart';
import 'package:motorcycle_dash/services/clubs/club_models.dart';
import 'package:motorcycle_dash/services/clubs/club_providers.dart';
void main() {
group('ClubPreviewScreen Widget Tests', () {
final activeClub = Club(
id: 'club_active_1',
name: 'NorCal Adventurers',
slug: 'norcal-adv',
description: 'Northern California backroads and trails.',
ownerUid: 'user_owner',
memberCount: 24,
homeRegion: 'NorCal',
motorcycleFocus: 'Adventure Touring',
visibility: ClubVisibility.public,
admissionPolicy: ClubAdmissionPolicy.request,
createdAt: DateTime(2026, 1, 15),
updatedAt: DateTime(2026, 1, 15),
);
testWidgets('renders active club preview with clean title and no phase notice', (tester) async {
await tester.pumpWidget(
ProviderScope(
overrides: [
clubDetailProvider('club_active_1').overrideWith(
(ref) => Stream.value(activeClub),
),
currentMemberProvider('club_active_1').overrideWith(
(ref) => Stream.value(null),
),
],
child: MaterialApp(
theme: ThemeData.dark().copyWith(
extensions: [MotorSignalThemeColors.dark],
),
home: const ClubPreviewScreen(clubId: 'club_active_1'),
),
),
);
await tester.pumpAndSettle();
// Title must be 'Club' (not 'Club Preview')
expect(find.text('Club'), findsOneWidget);
expect(find.text('Club Preview'), findsNothing);
// Hero info
expect(find.text('NorCal Adventurers'), findsOneWidget);
expect(find.text('@norcal-adv'), findsOneWidget);
expect(find.text('24 members'), findsOneWidget);
// Club Details (not Chapter Details)
expect(find.text('Club Details'), findsOneWidget);
expect(find.text('Chapter Details'), findsNothing);
expect(find.text('About the Club'), findsOneWidget);
// Phase notice must NOT exist
expect(find.textContaining('CLUB-2C'), findsNothing);
expect(find.textContaining('Read-only preview'), findsNothing);
});
testWidgets('suppresses role pill for regular member', (tester) async {
final regularMember = ClubMember(
clubId: 'club_active_1',
uid: 'user_member',
role: ClubRole.member,
status: ClubMemberStatus.active,
joinedAt: DateTime(2026, 2, 1),
updatedAt: DateTime(2026, 2, 1),
);
await tester.pumpWidget(
ProviderScope(
overrides: [
clubDetailProvider('club_active_1').overrideWith(
(ref) => Stream.value(activeClub),
),
currentMemberProvider('club_active_1').overrideWith(
(ref) => Stream.value(regularMember),
),
],
child: MaterialApp(
theme: ThemeData.dark().copyWith(
extensions: [MotorSignalThemeColors.dark],
),
home: const ClubPreviewScreen(clubId: 'club_active_1'),
),
),
);
await tester.pumpAndSettle();
expect(find.textContaining('ROLE: MEMBER'), findsNothing);
});
testWidgets('renders role pill for owner', (tester) async {
final ownerMember = ClubMember(
clubId: 'club_active_1',
uid: 'user_owner',
role: ClubRole.owner,
status: ClubMemberStatus.active,
joinedAt: DateTime(2026, 2, 1),
updatedAt: DateTime(2026, 2, 1),
);
await tester.pumpWidget(
ProviderScope(
overrides: [
clubDetailProvider('club_active_1').overrideWith(
(ref) => Stream.value(activeClub),
),
currentMemberProvider('club_active_1').overrideWith(
(ref) => Stream.value(ownerMember),
),
],
child: MaterialApp(
theme: ThemeData.dark().copyWith(
extensions: [MotorSignalThemeColors.dark],
),
home: const ClubPreviewScreen(clubId: 'club_active_1'),
),
),
);
await tester.pumpAndSettle();
expect(find.text('ROLE: OWNER'), findsOneWidget);
});
testWidgets('renders Club Not Found when club is null', (tester) async {
await tester.pumpWidget(
ProviderScope(
overrides: [
clubDetailProvider('missing_id').overrideWith(
(ref) => Stream.value(null),
),
currentMemberProvider('missing_id').overrideWith(
(ref) => Stream.value(null),
),
],
child: MaterialApp(
theme: ThemeData.dark().copyWith(
extensions: [MotorSignalThemeColors.dark],
),
home: const ClubPreviewScreen(clubId: 'missing_id'),
),
),
);
await tester.pumpAndSettle();
expect(find.text('Club Not Found'), findsOneWidget);
expect(find.text('This club may have been archived or does not exist.'), findsOneWidget);
});
testWidgets('renders Club Archived state when club is archived', (tester) async {
final archivedClub = activeClub.copyWith(archivedAt: DateTime(2026, 3, 1));
await tester.pumpWidget(
ProviderScope(
overrides: [
clubDetailProvider('club_active_1').overrideWith(
(ref) => Stream.value(archivedClub),
),
currentMemberProvider('club_active_1').overrideWith(
(ref) => Stream.value(null),
),
],
child: MaterialApp(
theme: ThemeData.dark().copyWith(
extensions: [MotorSignalThemeColors.dark],
),
home: const ClubPreviewScreen(clubId: 'club_active_1'),
),
),
);
await tester.pumpAndSettle();
expect(find.text('Club Archived'), findsOneWidget);
expect(
find.text('This club has been archived by leadership and is no longer active.'),
findsOneWidget,
);
});
testWidgets('renders Club Unavailable on stream error', (tester) async {
await tester.pumpWidget(
ProviderScope(
overrides: [
clubDetailProvider('error_id').overrideWith(
(ref) => Stream.error(Exception('Permission denied')),
),
currentMemberProvider('error_id').overrideWith(
(ref) => Stream.value(null),
),
],
child: MaterialApp(
theme: ThemeData.dark().copyWith(
extensions: [MotorSignalThemeColors.dark],
),
home: const ClubPreviewScreen(clubId: 'error_id'),
),
),
);
await tester.pumpAndSettle();
expect(find.text('Club Unavailable'), findsOneWidget);
expect(find.text('Unable to display this club at this time.'), findsOneWidget);
});
});
}