Files
erika/lib/sse.test.ts
T

40 lines
1.3 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { isSseTopic, sse } from "@/lib/sse";
describe("leaderboard SSE contract", () => {
test("registers the public leaderboards topic", () => {
expect(isSseTopic("leaderboards")).toBeTrue();
expect(sse.leaderboards.adminOnly).toBeFalse();
});
test("accepts only the minimal XP envelope", () => {
expect(sse.leaderboards.parseRedisMessage(
JSON.stringify({ event: "xp", data: {} }),
)).toEqual({ event: "xp", data: {} });
expect(sse.leaderboards.parseRedisMessage(
JSON.stringify({ event: "xp", data: { userId: "1" } }),
)).toBeNull();
expect(sse.leaderboards.parseRedisMessage(
JSON.stringify({ event: "xp", data: {}, extra: true }),
)).toBeNull();
});
test("validates VC channel IDs and rejects malformed messages", () => {
expect(sse.leaderboards.parseRedisMessage(
JSON.stringify({ event: "vc", data: { channelId: "1234567890" } }),
)).toEqual({
event: "vc",
data: { channelId: "1234567890" },
});
expect(sse.leaderboards.parseRedisMessage(
JSON.stringify({ event: "vc", data: { channelId: "voice-one" } }),
)).toBeNull();
expect(sse.leaderboards.parseRedisMessage("{")).toBeNull();
expect(sse.leaderboards.parseRedisMessage(
JSON.stringify({ event: "unknown", data: {} }),
)).toBeNull();
});
});