Files
CapaKraken/packages/engine/src/__tests__/saturday.test.ts
T

111 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from "vitest";
import { calculateAllocation } from "../allocation/calculator.js";
import { validateAvailability } from "../allocation/availability-validator.js";
// Resource available MonSat (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); // MonFri 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); // MonSat
// 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 (MonFri: 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);
});
});