import 'package:flutter_test/flutter_test.dart'; import 'package:tasq/models/leave_of_absence.model.dart'; import 'package:tasq/models/pass_slip.model.dart'; import 'package:tasq/utils/app_time.dart'; import 'package:tasq/utils/staff_presence.dart'; void main() { setUpAll(() { AppTime.initialize(); }); group('activeLeaveByUser', () { test('includes approved leave covering now', () { final now = AppTime.now(); final startTime = now.subtract(Duration(hours: 1)); final endTime = now.add(Duration(hours: 1)); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'sick_leave', justification: 'Sick', startTime: startTime, endTime: endTime, status: 'approved', filedBy: 'admin', createdAt: now, ); final result = activeLeaveByUser([leave], now); expect(result, containsPair('user1', leave)); }); test('excludes pending leave', () { final now = AppTime.now(); final startTime = now.subtract(Duration(hours: 1)); final endTime = now.add(Duration(hours: 1)); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'sick_leave', justification: 'Sick', startTime: startTime, endTime: endTime, status: 'pending', filedBy: 'admin', createdAt: now, ); final result = activeLeaveByUser([leave], now); expect(result, isEmpty); }); test('excludes leave that ended before now', () { final now = AppTime.now(); final startTime = now.subtract(Duration(hours: 3)); final endTime = now.subtract(Duration(hours: 1)); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'sick_leave', justification: 'Sick', startTime: startTime, endTime: endTime, status: 'approved', filedBy: 'admin', createdAt: now, ); final result = activeLeaveByUser([leave], now); expect(result, isEmpty); }); test('excludes leave that starts after now', () { final now = AppTime.now(); final startTime = now.add(Duration(hours: 1)); final endTime = now.add(Duration(hours: 3)); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'sick_leave', justification: 'Sick', startTime: startTime, endTime: endTime, status: 'approved', filedBy: 'admin', createdAt: now, ); final result = activeLeaveByUser([leave], now); expect(result, isEmpty); }); }); group('activePassSlipByUser', () { test('includes active pass slip', () { final slip = PassSlip( id: 'slip1', userId: 'user1', dutyScheduleId: 'sched1', reason: 'Test', status: 'approved', requestedAt: AppTime.now(), slipStart: AppTime.now(), slipEnd: null, ); final result = activePassSlipByUser([slip]); expect(result, containsPair('user1', slip)); }); test('excludes pending pass slip', () { final slip = PassSlip( id: 'slip1', userId: 'user1', dutyScheduleId: 'sched1', reason: 'Test', status: 'pending', requestedAt: AppTime.now(), slipStart: null, slipEnd: null, ); final result = activePassSlipByUser([slip]); expect(result, isEmpty); }); test('excludes ended pass slip', () { final slip = PassSlip( id: 'slip1', userId: 'user1', dutyScheduleId: 'sched1', reason: 'Test', status: 'approved', requestedAt: AppTime.now(), slipStart: AppTime.now(), slipEnd: AppTime.now().add(Duration(hours: 1)), ); final result = activePassSlipByUser([slip]); expect(result, isEmpty); }); }); group('approvedLeaveDays', () { test('single day leave returns one day key', () { // Sep 24, 08:00 to Sep 24, 17:00 Manila time → just Sep 24 final start = AppTime.fromComponents(year: 2026, month: 9, day: 24, hour: 8, minute: 0); final end = AppTime.fromComponents(year: 2026, month: 9, day: 24, hour: 17, minute: 0); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'sick_leave', justification: 'Sick', startTime: start, endTime: end, status: 'approved', filedBy: 'admin', createdAt: DateTime.utc(2026, 9, 23), ); final result = approvedLeaveDays([leave], 'user1'); expect(result, contains(DateTime.utc(2026, 9, 24))); expect(result.length, 1); }); test('multi-day leave returns all day keys', () { // Sep 24, 08:00 to Sep 25, 17:00 Manila time → Sep 24 and Sep 25 final start = AppTime.fromComponents(year: 2026, month: 9, day: 24, hour: 8, minute: 0); final end = AppTime.fromComponents(year: 2026, month: 9, day: 25, hour: 17, minute: 0); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'vacation_leave', justification: 'Vacation', startTime: start, endTime: end, status: 'approved', filedBy: 'admin', createdAt: DateTime.utc(2026, 9, 23), ); final result = approvedLeaveDays([leave], 'user1'); expect(result, contains(DateTime.utc(2026, 9, 24))); expect(result, contains(DateTime.utc(2026, 9, 25))); expect(result.length, 2); }); test('excludes pending leaves', () { final start = AppTime.fromComponents(year: 2026, month: 9, day: 24, hour: 8, minute: 0); final end = AppTime.fromComponents(year: 2026, month: 9, day: 25, hour: 17, minute: 0); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'vacation_leave', justification: 'Vacation', startTime: start, endTime: end, status: 'pending', filedBy: 'admin', createdAt: DateTime.utc(2026, 9, 23), ); final result = approvedLeaveDays([leave], 'user1'); expect(result, isEmpty); }); test('filters by userId', () { final start = AppTime.fromComponents(year: 2026, month: 9, day: 24, hour: 8, minute: 0); final end = AppTime.fromComponents(year: 2026, month: 9, day: 25, hour: 17, minute: 0); final leave = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'vacation_leave', justification: 'Vacation', startTime: start, endTime: end, status: 'approved', filedBy: 'admin', createdAt: DateTime.utc(2026, 9, 23), ); final result = approvedLeaveDays([leave], 'user2'); expect(result, isEmpty); }); test('handles multiple approved leaves for same user', () { final leave1 = LeaveOfAbsence( id: 'leave1', userId: 'user1', leaveType: 'sick_leave', justification: 'Sick', startTime: AppTime.fromComponents(year: 2026, month: 9, day: 24, hour: 8, minute: 0), endTime: AppTime.fromComponents(year: 2026, month: 9, day: 24, hour: 17, minute: 0), status: 'approved', filedBy: 'admin', createdAt: AppTime.fromComponents(year: 2026, month: 9, day: 23), ); final leave2 = LeaveOfAbsence( id: 'leave2', userId: 'user1', leaveType: 'vacation_leave', justification: 'Vacation', startTime: AppTime.fromComponents(year: 2026, month: 9, day: 26, hour: 8, minute: 0), endTime: AppTime.fromComponents(year: 2026, month: 9, day: 27, hour: 17, minute: 0), status: 'approved', filedBy: 'admin', createdAt: AppTime.fromComponents(year: 2026, month: 9, day: 23), ); final result = approvedLeaveDays([leave1, leave2], 'user1'); expect(result, contains(DateTime.utc(2026, 9, 24))); expect(result, contains(DateTime.utc(2026, 9, 26))); expect(result, contains(DateTime.utc(2026, 9, 27))); expect(result.length, 3); }); }); }