214 lines
7.1 KiB
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);
|
|
});
|
|
});
|
|
}
|