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