103 lines
3.2 KiB
TypeScript
103 lines
3.2 KiB
TypeScript
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import { describe, expect, test } from "bun:test";
|
|
|
|
import { JsonFileStateStore } from "../src/state.ts";
|
|
|
|
describe("JsonFileStateStore", () => {
|
|
test("loads per-thread grant metadata and older sessions without grants", async () => {
|
|
const dir = await mkdtemp(path.join(os.tmpdir(), "discord-bridge-state-"));
|
|
try {
|
|
const statePath = path.join(dir, "state.json");
|
|
await writeFile(
|
|
statePath,
|
|
`${JSON.stringify({
|
|
version: 1,
|
|
sessions: [
|
|
{
|
|
discordThreadId: "discord-thread-1",
|
|
parentChannelId: "parent-channel",
|
|
sourceMessageId: "message-start-1",
|
|
codexThreadId: "codex-thread-1",
|
|
title: "Granted thread",
|
|
createdAt: "2026-05-11T00:00:00.000Z",
|
|
ownerUserId: "user-1",
|
|
participantUserIds: ["user-2", "", "user-2", "user-3"],
|
|
cwd: "/workspace/project",
|
|
mode: "resumed",
|
|
statusMessageId: "message-status-1",
|
|
},
|
|
{
|
|
discordThreadId: "discord-thread-2",
|
|
parentChannelId: "parent-channel",
|
|
codexThreadId: "codex-thread-2",
|
|
title: "Older thread",
|
|
createdAt: "2026-05-11T00:00:00.000Z",
|
|
},
|
|
],
|
|
queue: [],
|
|
activeTurns: [
|
|
{
|
|
turnId: "turn-active-1",
|
|
discordThreadId: "discord-thread-1",
|
|
codexThreadId: "codex-thread-1",
|
|
origin: "external",
|
|
startedAt: "2026-05-11T00:00:01.000Z",
|
|
observedAt: "2026-05-11T00:00:02.000Z",
|
|
},
|
|
{
|
|
turnId: "turn-active-2",
|
|
discordThreadId: "discord-thread-2",
|
|
codexThreadId: "codex-thread-2",
|
|
origin: "unknown",
|
|
queueItemId: "queue-1",
|
|
observedAt: "2026-05-11T00:00:03.000Z",
|
|
},
|
|
],
|
|
processedMessageIds: [],
|
|
deliveries: [],
|
|
})}\n`,
|
|
);
|
|
|
|
const state = await new JsonFileStateStore(statePath).load();
|
|
|
|
expect(state.sessions).toHaveLength(2);
|
|
expect(state.sessions[0]?.ownerUserId).toBe("user-1");
|
|
expect(state.sessions[0]?.sourceMessageId).toBe("message-start-1");
|
|
expect(state.sessions[0]?.participantUserIds).toEqual([
|
|
"user-2",
|
|
"user-3",
|
|
]);
|
|
expect(state.sessions[0]?.cwd).toBe("/workspace/project");
|
|
expect(state.sessions[0]?.mode).toBe("resumed");
|
|
expect(state.sessions[0]?.statusMessageId).toBe("message-status-1");
|
|
expect(state.sessions[1]?.ownerUserId).toBeUndefined();
|
|
expect(state.sessions[1]?.sourceMessageId).toBeUndefined();
|
|
expect(state.sessions[1]?.participantUserIds).toBeUndefined();
|
|
expect(state.sessions[1]?.cwd).toBeUndefined();
|
|
expect(state.sessions[1]?.mode).toBeUndefined();
|
|
expect(state.sessions[1]?.statusMessageId).toBeUndefined();
|
|
expect(state.activeTurns).toEqual([
|
|
{
|
|
turnId: "turn-active-1",
|
|
discordThreadId: "discord-thread-1",
|
|
codexThreadId: "codex-thread-1",
|
|
origin: "external",
|
|
startedAt: "2026-05-11T00:00:01.000Z",
|
|
observedAt: "2026-05-11T00:00:02.000Z",
|
|
},
|
|
{
|
|
turnId: "turn-active-2",
|
|
discordThreadId: "discord-thread-2",
|
|
codexThreadId: "codex-thread-2",
|
|
origin: "external",
|
|
queueItemId: "queue-1",
|
|
observedAt: "2026-05-11T00:00:03.000Z",
|
|
},
|
|
]);
|
|
} finally {
|
|
await rm(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
});
|