import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:motorcycle_dash/core/theme/theme_extensions.dart'; import 'package:motorcycle_dash/features/social/clubs/widgets/club_card.dart'; import 'package:motorcycle_dash/services/clubs/club_models.dart'; void main() { group('ClubCard Widget Tests', () { final sampleClub = Club( id: 'club_test_1', name: 'Pacific Coast Riders', slug: 'pacific-coast-riders', description: 'Cruising the Pacific Coast Highway together.', ownerUid: 'user_1', memberCount: 42, homeRegion: 'NorCal', motorcycleFocus: 'Sport Touring', visibility: ClubVisibility.public, admissionPolicy: ClubAdmissionPolicy.request, createdAt: DateTime(2026, 1, 1), updatedAt: DateTime(2026, 1, 1), ); testWidgets('renders club details, chips, and triggers onTap', (tester) async { bool tapped = false; await tester.pumpWidget( MaterialApp( theme: ThemeData.dark().copyWith( extensions: [MotorSignalThemeColors.dark], ), home: Scaffold( body: ClubCard( club: sampleClub, role: ClubRole.owner, onTap: () => tapped = true, ), ), ), ); expect(find.text('Pacific Coast Riders'), findsOneWidget); expect(find.text('@pacific-coast-riders'), findsOneWidget); expect(find.text('Cruising the Pacific Coast Highway together.'), findsOneWidget); expect(find.text('42 members'), findsOneWidget); expect(find.text('Request to Join'), findsNothing); expect(find.text('NorCal'), findsOneWidget); expect(find.text('Sport Touring'), findsOneWidget); expect(find.text('OWNER'), findsOneWidget); await tester.tap(find.byType(ClubCard)); await tester.pumpAndSettle(); expect(tapped, isTrue); }); testWidgets('renders open admission badge correctly with group_add_outlined icon', (tester) async { final openClub = sampleClub.copyWith(admissionPolicy: ClubAdmissionPolicy.open); await tester.pumpWidget( MaterialApp( theme: ThemeData.dark().copyWith( extensions: [MotorSignalThemeColors.dark], ), home: Scaffold( body: ClubCard(club: openClub), ), ), ); expect(find.text('Open to Join'), findsOneWidget); expect(find.byIcon(Icons.group_add_outlined), findsOneWidget); expect(find.byIcon(Icons.lock_open_outlined), findsNothing); }); for (final role in ClubRole.values) { testWidgets('active ${role.name} has no admission prompt', (tester) async { await tester.pumpWidget(MaterialApp( home: Scaffold(body: ClubCard(club: sampleClub, role: role)), )); expect(find.text('Request to Join'), findsNothing); }); } testWidgets('non-member retains request admission prompt', (tester) async { await tester.pumpWidget(MaterialApp( home: Scaffold(body: ClubCard(club: sampleClub)), )); expect(find.text('Request to Join'), findsOneWidget); }); testWidgets('suppresses role pill for standard members and shows for admin/owner', (tester) async { // Test member role (should NOT be rendered) await tester.pumpWidget( MaterialApp( theme: ThemeData.dark().copyWith( extensions: [MotorSignalThemeColors.dark], ), home: Scaffold( body: ClubCard( club: sampleClub, role: ClubRole.member, ), ), ), ); expect(find.text('MEMBER'), findsNothing); // Test admin role (should be rendered) await tester.pumpWidget( MaterialApp( theme: ThemeData.dark().copyWith( extensions: [MotorSignalThemeColors.dark], ), home: Scaffold( body: ClubCard( club: sampleClub, role: ClubRole.admin, ), ), ), ); expect(find.text('ADMIN'), findsOneWidget); }); }); }