import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:tasq/models/leave_of_absence.dart'; import 'package:tasq/models/profile.dart'; import 'package:tasq/screens/attendance/attendance_screen.dart'; import 'package:tasq/providers/leave_provider.dart'; import 'package:tasq/providers/profile_provider.dart'; import 'package:tasq/utils/app_time.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; void main() { testWidgets('Leave tab updates when stream emits new data', ( WidgetTester tester, ) async { AppTime.initialize(); await dotenv.load(); final controller = StreamController>(); final user = Profile( id: 'u1', role: 'it_staff', fullName: 'Staff', avatarUrl: null, allowTracking: false, ); // start with empty list controller.add([]); await tester.pumpWidget( ProviderScope( overrides: [ profilesProvider.overrideWith((ref) => Stream.value([user])), currentProfileProvider.overrideWith((ref) => Stream.value(user)), leavesProvider.overrideWith((ref) => controller.stream), currentUserIdProvider.overrideWithValue(user.id), ], child: const MaterialApp(home: Scaffold(body: AttendanceScreen())), ), ); // go to Leave tab await tester.pumpAndSettle(); await tester.tap(find.text('Leave')); await tester.pumpAndSettle(); // initially no leaves expect(find.text('You have no leave applications.'), findsOneWidget); // push a new pending leave for the user final now = AppTime.now(); final leave = LeaveOfAbsence( id: 'l1', userId: user.id, leaveType: 'sick_leave', justification: 'sick', startTime: now, endTime: now.add(const Duration(hours: 8)), status: 'pending', filedBy: user.id, createdAt: now, ); controller.add([leave]); await tester.pumpAndSettle(); // the leave should now appear in "My Leave Applications" using the // human-readable label expect(find.text('Sick Leave'), findsOneWidget); expect(find.text('PENDING'), findsOneWidget); controller.close(); }); }