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.
This commit is contained in:
124
test/pages/trip_invitations_page_test.dart
Normal file
124
test/pages/trip_invitations_page_test.dart
Normal file
@@ -0,0 +1,124 @@
|
||||
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();
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user