kanban-dev-webapp/src/lib/planning/sort.test.ts

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