Files
TravelMate/test/pages/trip_invitations_page_test.dart
Van Leemput Dayron 3215a990d1 feat: Implement trip invitation functionality and notification handling
- Added TripInvitationRepository for managing trip invitations.
- Created TripInvitation model with serialization methods.
- Implemented notification payload parser for handling FCM notifications.
- Enhanced NotificationService to manage trip invitations and related actions.
- Updated UserRepository to include user search functionality.
- Modified AuthRepository to store multiple FCM tokens.
- Added tests for trip invitation logic and notification payload parsing.
- Updated pubspec.yaml and pubspec.lock for dependency management.
2026-03-13 13:54:47 +01:00

125 lines
3.1 KiB
Dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:travel_mate/models/trip_invitation.dart';
import 'package:travel_mate/pages/trip_invitations_page.dart';
import 'package:travel_mate/repositories/trip_invitation_repository.dart';
class _FakeTripInvitationDataSource implements TripInvitationDataSource {
final StreamController<List<TripInvitation>> _controller =
StreamController<List<TripInvitation>>();
bool acceptedCalled = false;
bool rejectedCalled = false;
void emitInvitations(List<TripInvitation> invitations) {
_controller.add(invitations);
}
@override
Future<void> respondToInvitation({
required String invitationId,
required bool isAccepted,
}) async {
if (isAccepted) {
acceptedCalled = true;
return;
}
rejectedCalled = true;
}
@override
Stream<List<TripInvitation>> watchInvitationsForUser(String userId) {
return _controller.stream;
}
@override
Future<void> createInvitation({
required String tripId,
required String tripTitle,
required String inviterId,
required String inviterName,
required String inviteeId,
required String inviteeEmail,
}) async {}
@override
Future<TripInvitation?> getInvitationById(String invitationId) async {
return null;
}
@override
Future<TripInvitation?> getPendingInvitation({
required String tripId,
required String inviteeId,
}) async {
return null;
}
@override
Stream<List<TripInvitation>> watchPendingInvitationsForUser(String userId) {
return _controller.stream;
}
Future<void> dispose() async {
await _controller.close();
}
}
void main() {
group('TripInvitationsPage', () {
testWidgets('shows invitations in correct tabs', (tester) async {
final fakeRepository = _FakeTripInvitationDataSource();
await tester.pumpWidget(
MaterialApp(
home: TripInvitationsPage(
repository: fakeRepository,
userIdOverride: 'user_1',
),
),
);
final invitations = [
TripInvitation(
id: 'pending_1',
tripId: 'trip_1',
tripTitle: 'Road Trip',
inviterId: 'u2',
inviterName: 'Alice',
inviteeId: 'user_1',
inviteeEmail: 'user@example.com',
status: 'pending',
createdAt: DateTime(2026, 3, 6),
),
TripInvitation(
id: 'accepted_1',
tripId: 'trip_2',
tripTitle: 'Tokyo',
inviterId: 'u3',
inviterName: 'Bob',
inviteeId: 'user_1',
inviteeEmail: 'user@example.com',
status: 'accepted',
createdAt: DateTime(2026, 3, 6),
),
];
fakeRepository.emitInvitations(invitations);
await tester.pump();
expect(find.text('Road Trip'), findsOneWidget);
expect(find.text('Accepter'), findsOneWidget);
await tester.tap(find.text('Acceptées'));
await tester.pumpAndSettle();
expect(find.text('Tokyo'), findsOneWidget);
expect(find.text('Accepter'), findsNothing);
await fakeRepository.dispose();
});
});
}