Files
boss/tests/settings-state-events.test.ts
2026-04-07 18:43:26 +08:00

63 lines
1.8 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import os from "node:os";
import path from "node:path";
import { mkdtemp, rm } from "node:fs/promises";
let runtimeRoot = "";
let readState: (typeof import("../src/lib/boss-data"))["readState"];
let writeState: (typeof import("../src/lib/boss-data"))["writeState"];
let updateUserSettings: (typeof import("../src/lib/boss-data"))["updateUserSettings"];
let subscribeBossEvents: (typeof import("../src/lib/boss-events"))["subscribeBossEvents"];
async function setup() {
if (runtimeRoot) return;
runtimeRoot = await mkdtemp(path.join(os.tmpdir(), "boss-settings-events-"));
process.env.BOSS_RUNTIME_ROOT = runtimeRoot;
process.env.BOSS_STATE_FILE = path.join(runtimeRoot, "boss-state.json");
const [data, events] = await Promise.all([
import("../src/lib/boss-data.ts"),
import("../src/lib/boss-events.ts"),
]);
readState = data.readState;
writeState = data.writeState;
updateUserSettings = data.updateUserSettings;
subscribeBossEvents = events.subscribeBossEvents;
}
async function resetSettingsState() {
const state = await readState();
state.user.settings = {
liveUpdates: true,
showRiskBadges: true,
confirmDangerousActions: true,
preferredEntryPoint: "conversations",
};
await writeState(state);
}
test.beforeEach(async () => {
await setup();
await resetSettingsState();
});
test.after(async () => {
if (runtimeRoot) {
await rm(runtimeRoot, { recursive: true, force: true });
}
});
test("updateUserSettings publishes settings refresh event", async () => {
const events: Array<{ event: string }> = [];
const unsubscribe = subscribeBossEvents((event) => {
events.push({ event });
});
await updateUserSettings({ liveUpdates: false });
unsubscribe();
assert.equal(events.at(-1)?.event, "settings.updated");
});