49 lines
2.2 KiB
TypeScript
49 lines
2.2 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { test } from "node:test";
|
|
|
|
process.env.MEETING_SESSION_SECRET = "test-only-meeting-secret";
|
|
|
|
import { berlinParts } from "../lib/calendar/timezone";
|
|
import { combineDateAndTime, getMeetingStatus } from "../lib/meeting/status";
|
|
import { createMeetingToken, verifyMeetingToken } from "../lib/meeting/token";
|
|
|
|
test("meeting tokens round-trip and preserve their role", () => {
|
|
const issued = createMeetingToken({ eventSlug: "beratung", name: "Anna", role: "host", ttlMs: 60_000 });
|
|
const verified = verifyMeetingToken(issued.token);
|
|
|
|
assert.ok(verified);
|
|
assert.equal(verified.eventSlug, "beratung");
|
|
assert.equal(verified.participantId, issued.participantId);
|
|
assert.equal(verified.role, "host");
|
|
});
|
|
|
|
test("tampered and malformed meeting tokens are rejected", () => {
|
|
const issued = createMeetingToken({ eventSlug: "beratung", name: "Guest", role: "participant" });
|
|
|
|
assert.equal(verifyMeetingToken(`${issued.token}x`), null);
|
|
assert.equal(verifyMeetingToken("not-a-token"), null);
|
|
assert.equal(verifyMeetingToken({ token: issued.token }), null);
|
|
});
|
|
|
|
test("date-only and time-only Payload fields combine in Berlin time", () => {
|
|
// 08:00 in Berlin on a July date is 06:00 UTC (CEST).
|
|
const result = combineDateAndTime("2026-07-01T00:00:00.000Z", "2026-01-01T07:00:00.000Z");
|
|
assert.equal(result.toISOString(), "2026-07-01T06:00:00.000Z");
|
|
});
|
|
|
|
test("Berlin DST offsets are applied at both sides of the summer-time boundary", () => {
|
|
assert.equal(berlinParts(new Date("2026-01-15T12:00:00.000Z")).hour, 13);
|
|
assert.equal(berlinParts(new Date("2026-07-15T12:00:00.000Z")).hour, 14);
|
|
});
|
|
|
|
test("meeting status follows the join and close windows", () => {
|
|
const start = new Date("2026-07-01T10:00:00.000Z");
|
|
const end = new Date("2026-07-01T11:00:00.000Z");
|
|
const window = { start, end, joinWindowMinutes: 15, closeAfterMinutes: 10 };
|
|
|
|
assert.equal(getMeetingStatus({ ...window, now: new Date("2026-07-01T09:44:59.000Z") }), "scheduled");
|
|
assert.equal(getMeetingStatus({ ...window, now: new Date("2026-07-01T09:45:00.000Z") }), "open");
|
|
assert.equal(getMeetingStatus({ ...window, now: start }), "live");
|
|
assert.equal(getMeetingStatus({ ...window, now: new Date("2026-07-01T11:10:00.000Z") }), "ended");
|
|
});
|