import { assertEquals } from "jsr:@std/assert"; import { resolveEventStart, expandRecurrences } from "./icalendar.ts"; Deno.test("resolveEventStart - local date with timezone", async () => { const icsEvent = { summary: "Test Event", start: { date: "2025-01-15T12:00:00.000", local: { date: "2025-01-15T07:00:00.000", timezone: "Eastern Standard Time" } } }; const result = await resolveEventStart(icsEvent); assertEquals(result?.toISOString(), "2025-01-15T12:00:00.000Z"); }); Deno.test("resolveEventStart - DST check (Summer)", async () => { const icsEvent = { summary: "Test Event DST", start: { date: "2025-07-15T11:00:00.000", local: { date: "2025-07-15T07:00:00.000", timezone: "Eastern Standard Time" } } }; const result = await resolveEventStart(icsEvent); assertEquals(result?.toISOString(), "2025-07-15T11:00:00.000Z"); }); Deno.test("resolveEventStart - UTC event", async () => { const icsEvent = { summary: "UTC Event", start: { date: "2025-01-15T12:00:00.000Z" } }; const result = await resolveEventStart(icsEvent); assertEquals(result?.toISOString(), "2025-01-15T12:00:00.000Z"); }); Deno.test("expandRecurrences - weekly event", () => { const icsEvent = { summary: "Weekly Meeting", start: "2025-01-01T10:00:00", rrule: "FREQ=WEEKLY;COUNT=3;BYDAY=WE" }; const results = expandRecurrences(icsEvent, 30); assertEquals(results.length, 3); assertEquals(results[0].start, "2025-01-01T10:00:00"); assertEquals(results[1].start, "2025-01-08T10:00:00"); assertEquals(results[2].start, "2025-01-15T10:00:00"); assertEquals(results[1].recurrent, true); }); Deno.test("expandRecurrences - EXDATE exclusion", () => { const icsEvent = { summary: "Weekly Meeting EXDATE", start: "2025-01-01T10:00:00", rrule: "FREQ=WEEKLY;COUNT=3;BYDAY=WE", exdate: ["2025-01-08T10:00:00"] }; const results = expandRecurrences(icsEvent, 30); // Should have 2 occurrences (Jan 1, Jan 15), Jan 8 is excluded assertEquals(results.length, 2); assertEquals(results[0].start, "2025-01-01T10:00:00"); assertEquals(results[1].start, "2025-01-15T10:00:00"); }); Deno.test("fetchAndParseCalendar - filter cancelled events", async () => { // This requires mocking fetch or testing the inner loop logic. }); Deno.test("resolveEventStart - ignore tzShift", async () => { const icsEvent = { summary: "Ignore tzShift", start: { date: "2025-01-15T12:00:00.000", local: { date: "2025-01-15T07:00:00.000", timezone: "Eastern Standard Time" } } }; const result = await resolveEventStart(icsEvent); assertEquals(result?.toISOString(), "2025-01-15T12:00:00.000Z"); }); Deno.test("expandRecurrences - custom windowDays", () => { const icsEvent = { summary: "Daily Meeting", start: "2025-01-01T10:00:00", rrule: "FREQ=DAILY" }; // 7 days window (Jan 1 to Jan 8) should give 8 occurrences if inclusive const results = expandRecurrences(icsEvent, 7); assertEquals(results.length, 8); });