111 lines
3.4 KiB
TypeScript
111 lines
3.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
||
import { calculateAllocation } from "../allocation/calculator.js";
|
||
import { validateAvailability } from "../allocation/availability-validator.js";
|
||
|
||
// Resource available Mon–Sat (6h Saturday)
|
||
const satAvailability = {
|
||
monday: 8,
|
||
tuesday: 8,
|
||
wednesday: 8,
|
||
thursday: 8,
|
||
friday: 8,
|
||
saturday: 6,
|
||
};
|
||
|
||
// Week Mon 2025-01-06 to Sat 2025-01-11
|
||
const MON = new Date("2025-01-06");
|
||
const SAT = new Date("2025-01-11");
|
||
|
||
describe("calculateAllocation — includeSaturday", () => {
|
||
it("excludes Saturday by default when resource has saturday availability", () => {
|
||
const result = calculateAllocation({
|
||
lcrCents: 10000,
|
||
hoursPerDay: 8,
|
||
startDate: MON,
|
||
endDate: SAT,
|
||
availability: satAvailability,
|
||
// includeSaturday not set → defaults to false
|
||
});
|
||
|
||
expect(result.workingDays).toBe(5); // Mon–Fri only
|
||
expect(result.totalHours).toBe(40);
|
||
});
|
||
|
||
it("includes Saturday when includeSaturday is true", () => {
|
||
const result = calculateAllocation({
|
||
lcrCents: 10000,
|
||
hoursPerDay: 8,
|
||
startDate: MON,
|
||
endDate: SAT,
|
||
availability: satAvailability,
|
||
includeSaturday: true,
|
||
});
|
||
|
||
expect(result.workingDays).toBe(6); // Mon–Sat
|
||
// Saturday capped at 6h (resource availability)
|
||
expect(result.totalHours).toBe(46); // 5×8 + 6
|
||
expect(result.totalCostCents).toBe(460000); // 46h × 10000 cents/h
|
||
});
|
||
|
||
it("includeSaturday: false explicitly still excludes Saturday", () => {
|
||
const result = calculateAllocation({
|
||
lcrCents: 10000,
|
||
hoursPerDay: 8,
|
||
startDate: MON,
|
||
endDate: SAT,
|
||
availability: satAvailability,
|
||
includeSaturday: false,
|
||
});
|
||
|
||
expect(result.workingDays).toBe(5);
|
||
});
|
||
|
||
it("does not add Saturday if resource has no saturday availability", () => {
|
||
const noSatAvailability = { monday: 8, tuesday: 8, wednesday: 8, thursday: 8, friday: 8 };
|
||
const result = calculateAllocation({
|
||
lcrCents: 10000,
|
||
hoursPerDay: 8,
|
||
startDate: MON,
|
||
endDate: SAT,
|
||
availability: noSatAvailability,
|
||
includeSaturday: true,
|
||
});
|
||
|
||
expect(result.workingDays).toBe(5); // Saturday still 0 because resource unavailable
|
||
});
|
||
});
|
||
|
||
describe("validateAvailability — includeSaturday", () => {
|
||
it("skips Saturday conflicts when includeSaturday is false", () => {
|
||
// Resource available only on Saturday (Mon–Fri: 0)
|
||
const satOnlyAvail = { monday: 0, tuesday: 0, wednesday: 0, thursday: 0, friday: 0, saturday: 8 };
|
||
const result = validateAvailability(SAT, SAT, 8, satOnlyAvail, [], false);
|
||
|
||
// Saturday is excluded, so no conflicts (day treated as non-working)
|
||
expect(result.valid).toBe(true);
|
||
expect(result.totalConflictDays).toBe(0);
|
||
});
|
||
|
||
it("detects conflict on Saturday when includeSaturday is true", () => {
|
||
const result = validateAvailability(
|
||
SAT,
|
||
SAT,
|
||
8, // request 8h
|
||
satAvailability, // Saturday: 6h available
|
||
[],
|
||
true,
|
||
);
|
||
|
||
// 8h requested > 6h available → conflict
|
||
expect(result.valid).toBe(false);
|
||
expect(result.totalConflictDays).toBe(1);
|
||
expect(result.conflicts[0]?.overageHours).toBe(2);
|
||
});
|
||
|
||
it("no conflict on Saturday within availability when includeSaturday true", () => {
|
||
const result = validateAvailability(SAT, SAT, 4, satAvailability, [], true);
|
||
|
||
expect(result.valid).toBe(true);
|
||
});
|
||
});
|