Refresh settings page in realtime
This commit is contained in:
18
tests/settings-page-realtime-refresh.test.ts
Normal file
18
tests/settings-page-realtime-refresh.test.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import { readFile } from "node:fs/promises";
|
||||
|
||||
test("settings page refreshes when user settings change", async () => {
|
||||
const source = await readFile(
|
||||
new URL("../src/app/me/settings/page.tsx", import.meta.url),
|
||||
"utf8",
|
||||
);
|
||||
|
||||
assert.match(source, /import \{ RealtimeRefresh \}/, "expected settings page to import RealtimeRefresh");
|
||||
assert.match(source, /<RealtimeRefresh/, "expected settings page to render RealtimeRefresh");
|
||||
assert.match(
|
||||
source,
|
||||
/events=\{\["settings\.updated"\]\}/,
|
||||
"expected settings page to refresh on settings.updated",
|
||||
);
|
||||
});
|
||||
62
tests/settings-state-events.test.ts
Normal file
62
tests/settings-state-events.test.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
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");
|
||||
});
|
||||
Reference in New Issue
Block a user