forked from GitHubMirrors/silverbullet-icalendar
108 lines
3.1 KiB
TypeScript
108 lines
3.1 KiB
TypeScript
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);
|
|
});
|