40 lines
1.3 KiB
TypeScript
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();
|
|
});
|
|
});
|