import groupEvents from "../../Gtd/groupEvents"; import { GtdEvent } from "../../Gtd/types"; function makeEvent(overrides: Partial): GtdEvent { return { id: "id", title: "Event", date: null, isTodo: false, completed: false, bgColour: null, fgColour: null, icon: null, text: null, updatedTime: 0, ...overrides, }; } const TODAY = new Date(2026, 5, 12); // Jun 12 2026 describe("groupEvents — day view", () => { test("one group per calendar day across the span, empty groups included", () => { const events = [ makeEvent({ id: "a", date: "2026-06-10" }), makeEvent({ id: "b", date: "2026-06-14" }), ]; const result = groupEvents(events, "day", TODAY); // Jun 10 .. Jun 14 (today Jun 12 is inside the span) expect(result.groups).toHaveLength(5); expect(result.groups[0].events.map((e) => e.id)).toEqual(["a"]); expect(result.groups[1].events).toHaveLength(0); expect(result.groups[4].events.map((e) => e.id)).toEqual(["b"]); }); test("span always includes today", () => { const events = [makeEvent({ id: "past", date: "2026-06-08" })]; const result = groupEvents(events, "day", TODAY); // Jun 8 .. Jun 12 expect(result.groups).toHaveLength(5); expect(result.groups[4].isCurrent).toBe(true); expect(result.groups[4].dateISO).toBe("2026-06-12"); }); test("first-of-month label is the month name and primary", () => { const events = [ makeEvent({ id: "a", date: "2026-06-30" }), makeEvent({ id: "b", date: "2026-07-02" }), ]; const result = groupEvents(events, "day", new Date(2026, 6, 1)); const firstOfJuly = result.groups.find( (g) => g.dateISO === "2026-07-01" )!; expect(firstOfJuly.labelPrimary).toBe(true); expect(firstOfJuly.label.toLowerCase()).toContain("jul"); expect(firstOfJuly.monthIndex).toBe(6); }); test("multiple events on one day share a group, order preserved", () => { const events = [ makeEvent({ id: "x", date: "2026-06-12" }), makeEvent({ id: "y", date: "2026-06-12" }), ]; const result = groupEvents(events, "day", TODAY); expect(result.groups).toHaveLength(1); expect(result.groups[0].events.map((e) => e.id)).toEqual(["x", "y"]); }); }); describe("groupEvents — week and month views", () => { test("week view groups by calendar week with current-week flag", () => { const events = [ makeEvent({ id: "a", date: "2026-06-01" }), makeEvent({ id: "b", date: "2026-06-19" }), ]; const result = groupEvents(events, "week", TODAY); // Weeks of May 31, Jun 7, Jun 14 → 3 groups expect(result.groups).toHaveLength(3); expect(result.groups[1].isCurrent).toBe(true); // week containing Jun 12 expect(result.groups[0].events.map((e) => e.id)).toEqual(["a"]); expect(result.groups[2].events.map((e) => e.id)).toEqual(["b"]); }); test("month view groups by calendar month", () => { const events = [ makeEvent({ id: "a", date: "2026-04-20" }), makeEvent({ id: "b", date: "2026-08-03" }), ]; const result = groupEvents(events, "month", TODAY); // Apr, May, Jun, Jul, Aug expect(result.groups).toHaveLength(5); expect(result.groups[2].isCurrent).toBe(true); // June expect(result.groups[0].events.map((e) => e.id)).toEqual(["a"]); expect(result.groups[4].events.map((e) => e.id)).toEqual(["b"]); }); test("january month label is the year and primary", () => { const events = [ makeEvent({ id: "a", date: "2025-12-15" }), makeEvent({ id: "b", date: "2026-01-10" }), ]; const result = groupEvents(events, "month", new Date(2026, 0, 5)); const january = result.groups.find((g) => g.monthIndex === 0)!; expect(january.label).toBe("2026"); expect(january.labelPrimary).toBe(true); }); }); describe("groupEvents — unscheduled", () => { test("dateless events pass through in order; no groups without scheduled events", () => { const events = [ makeEvent({ id: "u1" }), makeEvent({ id: "u2" }), ]; const result = groupEvents(events, "day", TODAY); expect(result.groups).toHaveLength(0); expect(result.unscheduled.map((e) => e.id)).toEqual(["u1", "u2"]); }); test("mixed: scheduled grouped, dateless set aside", () => { const events = [ makeEvent({ id: "s", date: "2026-06-12" }), makeEvent({ id: "u" }), ]; const result = groupEvents(events, "day", TODAY); expect(result.groups[0].events.map((e) => e.id)).toEqual(["s"]); expect(result.unscheduled.map((e) => e.id)).toEqual(["u"]); }); });