import { describe, expect, it } from "vitest"; import { parseApiEvent, parseApiEvents } from "@/lib/events"; import type { ApiEvent } from "@/lib/types"; const row = (overrides: Partial = {}): ApiEvent => ({ eventId: 7, calendarId: 5, uuid: "u-7", name: "Anna", description: null, startDateTime: "1990-10-02T22:00:00.000Z", endDateTime: "1990-10-03T21:59:00.000Z", createdDate: "2024-01-01T10:00:00.000Z", lastModifiedDate: "2024-02-01T10:00:00.000Z", location: null, createdBy: null, lastModifiedBy: "Paula", url: null, wholeDay: 1, repeatFrequency: "YEARLY", status: "DRAFT", ...overrides, }); describe("parseApiEvent", () => { it("coerces the raw row: 1 → true, nulls → empty strings, ISO → Date", () => { const event = parseApiEvent(row()); expect(event).toMatchObject({ eventId: 7, wholeDay: true, description: "", location: "", url: "", createdBy: "", lastModifiedBy: "Paula", repeatFrequency: "YEARLY", status: "DRAFT", }); expect(event?.start.toISOString()).toBe("1990-10-02T22:00:00.000Z"); }); it("drops deleted events", () => { expect(parseApiEvent(row({ status: "DELETED" }))).toBeNull(); }); it("drops a row without a usable start or end - what a deleted version looks like", () => { expect(parseApiEvent(row({ status: null, startDateTime: null }))).toBeNull(); expect(parseApiEvent(row({ endDateTime: "not a date" }))).toBeNull(); }); it("reads a missing status as PUBLIC (the public listing omits it)", () => { const withoutStatus = row(); delete withoutStatus.status; expect(parseApiEvent(withoutStatus)?.status).toBe("PUBLIC"); }); it("never promotes an unknown status to PUBLIC", () => { expect(parseApiEvent(row({ status: "ARCHIVED" }))?.status).toBe("PRIVATE"); }); it("reads 0 and null as not whole-day", () => { expect(parseApiEvent(row({ wholeDay: 0 }))?.wholeDay).toBe(false); expect(parseApiEvent(row({ wholeDay: null }))?.wholeDay).toBe(false); }); }); describe("parseApiEvents", () => { it("keeps only the rows worth showing", () => { const events = parseApiEvents([row({ eventId: 1 }), row({ eventId: 2, status: "DELETED" }), row({ eventId: 3 })]); expect(events.map((e) => e.eventId)).toEqual([1, 3]); }); });