test(web): cover timeline project row layout
This commit is contained in:
@@ -0,0 +1,110 @@
|
|||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
import { PROJECT_HEADER_HEIGHT, ROW_HEIGHT, SUB_LANE_HEIGHT } from "./timelineConstants.js";
|
||||||
|
import { estimateProjectRowHeight, buildProjectFlatRows } from "./timelineProjectRows.js";
|
||||||
|
|
||||||
|
describe("timelineProjectRows", () => {
|
||||||
|
it("falls back to the default row height when no row is provided", () => {
|
||||||
|
expect(estimateProjectRowHeight(undefined)).toBe(ROW_HEIGHT);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns header and open-demand row heights from the row type", () => {
|
||||||
|
expect(
|
||||||
|
estimateProjectRowHeight({
|
||||||
|
type: "header",
|
||||||
|
key: "header-project_1",
|
||||||
|
project: {} as never,
|
||||||
|
}),
|
||||||
|
).toBe(PROJECT_HEADER_HEIGHT);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
estimateProjectRowHeight({
|
||||||
|
type: "open-demand",
|
||||||
|
key: "open-demand-project_1",
|
||||||
|
projectId: "project_1",
|
||||||
|
openDemandCount: 2,
|
||||||
|
layout: {
|
||||||
|
visibleOpenDemands: [],
|
||||||
|
laneMap: new Map(),
|
||||||
|
laneCount: 2,
|
||||||
|
rowHeight: SUB_LANE_HEIGHT * 2 + 16,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).toBe(SUB_LANE_HEIGHT * 2 + 16);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("skips open-demand rows when a project has no open demands", () => {
|
||||||
|
const rows = buildProjectFlatRows(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
id: "project_1",
|
||||||
|
resourceRows: [
|
||||||
|
{
|
||||||
|
resource: { id: "resource_1" },
|
||||||
|
allocs: [{ id: "alloc_1" }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
] as never,
|
||||||
|
new Map(),
|
||||||
|
new Map(),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(rows.map((row) => row.type)).toEqual(["header", "resource"]);
|
||||||
|
expect(rows[1]).toMatchObject({
|
||||||
|
key: "project_1-resource_1",
|
||||||
|
metricsKey: "project_1:resource_1",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("uses optimistic open-demand overrides when computing lane layout", () => {
|
||||||
|
const rows = buildProjectFlatRows(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
id: "project_1",
|
||||||
|
resourceRows: [],
|
||||||
|
},
|
||||||
|
] as never,
|
||||||
|
new Map([
|
||||||
|
[
|
||||||
|
"project_1",
|
||||||
|
[
|
||||||
|
{
|
||||||
|
id: "demand_1",
|
||||||
|
startDate: "2026-04-10",
|
||||||
|
endDate: "2026-04-10",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "demand_2",
|
||||||
|
startDate: "2026-04-11",
|
||||||
|
endDate: "2026-04-11",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]) as never,
|
||||||
|
new Map([
|
||||||
|
[
|
||||||
|
"demand_2",
|
||||||
|
{
|
||||||
|
startDate: new Date("2026-04-10T00:00:00.000Z"),
|
||||||
|
endDate: new Date("2026-04-12T00:00:00.000Z"),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
const openDemandRow = rows.find((row) => row.type === "open-demand");
|
||||||
|
expect(openDemandRow?.type).toBe("open-demand");
|
||||||
|
|
||||||
|
if (openDemandRow?.type !== "open-demand") {
|
||||||
|
throw new Error("expected open-demand row");
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(openDemandRow.layout.visibleOpenDemands[1]?.startDate).toEqual(
|
||||||
|
new Date("2026-04-10T00:00:00.000Z"),
|
||||||
|
);
|
||||||
|
expect(openDemandRow.layout.laneCount).toBe(2);
|
||||||
|
expect(openDemandRow.layout.laneMap.get("demand_1")).toBe(0);
|
||||||
|
expect(openDemandRow.layout.laneMap.get("demand_2")).toBe(1);
|
||||||
|
expect(openDemandRow.layout.rowHeight).toBe(SUB_LANE_HEIGHT * 2 + 16);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user