- 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.
125 lines
3.1 KiB
Dart
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();
|
|
});
|
|
});
|
|
}
|