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> _controller = StreamController>(); bool acceptedCalled = false; bool rejectedCalled = false; void emitInvitations(List invitations) { _controller.add(invitations); } @override Future respondToInvitation({ required String invitationId, required bool isAccepted, }) async { if (isAccepted) { acceptedCalled = true; return; } rejectedCalled = true; } @override Stream> watchInvitationsForUser(String userId) { return _controller.stream; } @override Future createInvitation({ required String tripId, required String tripTitle, required String inviterId, required String inviterName, required String inviteeId, required String inviteeEmail, }) async {} @override Future getInvitationById(String invitationId) async { return null; } @override Future getPendingInvitation({ required String tripId, required String inviteeId, }) async { return null; } @override Stream> watchPendingInvitationsForUser(String userId) { return _controller.stream; } Future 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(); }); }); }