130 lines
4.1 KiB
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);
|
|
});
|
|
});
|
|
}
|