94 lines
3.0 KiB
TypeScript
94 lines
3.0 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { isSseTopic, sse } from "@/lib/realtime/sse";
|
|
|
|
describe("active SSE contract", () => {
|
|
test("registers public version and refresh events", () => {
|
|
expect(isSseTopic("active")).toBeTrue();
|
|
expect(sse.active.adminOnly).toBeFalse();
|
|
expect(sse.active.parseRedisMessage(
|
|
JSON.stringify({ event: "version", data: "build-a" }),
|
|
)).toEqual({ event: "version", data: "build-a" });
|
|
expect(sse.active.parseRedisMessage(
|
|
JSON.stringify({ event: "refresh", data: "/admin" }),
|
|
)).toEqual({ event: "refresh", data: "/admin" });
|
|
expect(sse.active.parseRedisMessage(
|
|
JSON.stringify({ event: "refresh", data: null }),
|
|
)).toEqual({ event: "refresh", data: null });
|
|
});
|
|
|
|
test("rejects empty active-event values", () => {
|
|
expect(sse.active.parseRedisMessage(
|
|
JSON.stringify({ event: "version", data: "" }),
|
|
)).toBeNull();
|
|
expect(sse.active.parseRedisMessage(
|
|
JSON.stringify({ event: "refresh", data: "" }),
|
|
)).toBeNull();
|
|
});
|
|
});
|
|
|
|
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();
|
|
});
|
|
});
|
|
|
|
describe("upload SSE contract", () => {
|
|
test("registers an admin-only upload topic", () => {
|
|
expect(isSseTopic("uploads")).toBeTrue();
|
|
expect(sse.uploads.adminOnly).toBeTrue();
|
|
});
|
|
|
|
test("validates upload job status events", () => {
|
|
const message = JSON.stringify({
|
|
event: "update",
|
|
data: {
|
|
uploadId: "upload-1",
|
|
jobId: "job-1",
|
|
platform: "youtube",
|
|
status: "completed",
|
|
},
|
|
});
|
|
|
|
expect(sse.uploads.parseRedisMessage(message)).toEqual({
|
|
event: "update",
|
|
data: {
|
|
uploadId: "upload-1",
|
|
jobId: "job-1",
|
|
platform: "youtube",
|
|
status: "completed",
|
|
},
|
|
});
|
|
});
|
|
});
|