Files
tasq/test/staff_presence_test.dart
redz1029 0c99ef270d refactor: extract staff presence helpers
- Extract activeLeaveByUser, activePassSlipByUser, and approvedLeaveDays to staff_presence.dart utility module
- Replace inline indexing loops in dashboard_screen.dart with helper function calls
- Behavior unchanged, tests added covering all functions

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-09-27 22:04:17 +08:00

267 lines
8.0 KiB
Dart

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);
});
});
}