MotorSignal-App/test/club_card_test.dart

130 lines
4.1 KiB
Dart

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