64 lines
2.6 KiB
TypeScript
64 lines
2.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import type { PlanningCard } from "@/lib/planning/load";
|
|
import { sortPlanningCards } from "@/lib/planning/sort";
|
|
|
|
function card(id: string, number: number, priority: PlanningCard["priority"], start?: string): PlanningCard {
|
|
return {
|
|
id,
|
|
created: `2026-09-${String(number).padStart(2, "0")} 10:00:00.000Z`,
|
|
number,
|
|
title: id,
|
|
description: "",
|
|
priority,
|
|
columnName: "To Do",
|
|
boardTargetDate: "",
|
|
draftRange: start ? { start, end: start } : null,
|
|
approvedRange: null,
|
|
subtaskDone: 0,
|
|
subtaskTotal: 0,
|
|
href: `/cards/${id}`,
|
|
};
|
|
}
|
|
|
|
describe("planning timeline order", () => {
|
|
const cards = [
|
|
card("later", 5, "critical", "2026-10-10"),
|
|
card("newUndated", 9, "medium"),
|
|
card("firstHigh", 2, "high", "2026-10-02"),
|
|
card("firstCritical", 3, "critical", "2026-10-02"),
|
|
card("oldUndated", 1, "medium"),
|
|
card("lowUndated", 4, "low"),
|
|
];
|
|
|
|
it("orders scheduled work by start date and priority, then undated work by priority and creation order", () => {
|
|
expect(sortPlanningCards(cards, "date").map((item) => item.id)).toEqual([
|
|
"firstCritical", "firstHigh", "later", "oldUndated", "newUndated", "lowUndated",
|
|
]);
|
|
});
|
|
|
|
it("can put higher priority scheduled work first while keeping undated work at the end", () => {
|
|
expect(sortPlanningCards(cards, "priority").map((item) => item.id)).toEqual([
|
|
"firstCritical", "later", "firstHigh", "oldUndated", "newUndated", "lowUndated",
|
|
]);
|
|
});
|
|
|
|
it("moves a newly scheduled item into the dated rows without changing the input", () => {
|
|
const changed = cards.map((item) => item.id === "newUndated"
|
|
? { ...item, draftRange: { start: "2026-10-01", end: "2026-10-03" } }
|
|
: item);
|
|
expect(sortPlanningCards(changed, "date").map((item) => item.id)[0]).toBe("newUndated");
|
|
expect(cards.find((item) => item.id === "newUndated")?.draftRange).toBeNull();
|
|
});
|
|
|
|
it("uses approved dates when a draft date is absent", () => {
|
|
const approved = { ...card("approved", 6, "low"), approvedRange: { start: "2026-10-01", end: "2026-10-03" } };
|
|
expect(sortPlanningCards([cards[0], approved], "date").map((item) => item.id)).toEqual(["approved", "later"]);
|
|
});
|
|
|
|
it("keeps later unnumbered board cards after earlier cards of the same priority", () => {
|
|
const first = { ...card("first", 0, "medium"), created: "2026-09-01 10:00:00.000Z" };
|
|
const addedLater = { ...card("addedLater", 0, "medium"), created: "2026-09-20 10:00:00.000Z" };
|
|
expect(sortPlanningCards([addedLater, first], "date").map((item) => item.id)).toEqual(["first", "addedLater"]);
|
|
});
|
|
});
|