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"); });