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