86 lines
3.3 KiB
JavaScript
86 lines
3.3 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { readFile } from "node:fs/promises";
|
|
import test from "node:test";
|
|
|
|
const sources = Promise.all([
|
|
readFile("ui/src/App.tsx", "utf8"),
|
|
readFile("ui/src/workspace/reducer.ts", "utf8"),
|
|
readFile("ui/src/workspace/useWorkspace.ts", "utf8"),
|
|
readFile("ui/src/workspace/persistence.ts", "utf8"),
|
|
readFile("ui/src/App.css", "utf8"),
|
|
]);
|
|
|
|
test("wires the desktop to stable runtime workspace APIs", async () => {
|
|
const [app, reducer, hook] = await sources;
|
|
for (const operation of [
|
|
"create_session_runtime",
|
|
"open_session_runtime",
|
|
"close_session_runtime",
|
|
"list_directory_sessions",
|
|
"get_session_runtime_snapshot",
|
|
"subscribe_workspace",
|
|
])
|
|
assert.match(`${app}\n${hook}`, new RegExp(operation));
|
|
assert.doesNotMatch(app, /switch_session/);
|
|
assert.doesNotMatch(app, /new_session/);
|
|
assert.match(reducer, /WorkspaceState\["runtimesById"\]/);
|
|
assert.match(reducer, /requestGeneration/);
|
|
assert.match(reducer, /loadedThroughSeq/);
|
|
});
|
|
|
|
test("keeps presentation persistence allowlisted and agent IDs ephemeral", async () => {
|
|
const [, , , persistence] = await sources;
|
|
assert.match(persistence, /load_ui_state/);
|
|
assert.match(persistence, /save_ui_state/);
|
|
assert.match(persistence, /directoryOrder/);
|
|
assert.match(persistence, /drafts/);
|
|
assert.doesNotMatch(persistence, /agentId/);
|
|
assert.doesNotMatch(persistence, /messages/);
|
|
assert.doesNotMatch(persistence, /extensions/);
|
|
});
|
|
|
|
test("renders directory sidebar, accessible session tabs, warnings, and reduced motion", async () => {
|
|
const [app, , , , css] = await sources;
|
|
const [sidebar, tabs] = await Promise.all([
|
|
readFile("ui/src/components/DirectorySidebar.tsx", "utf8"),
|
|
readFile("ui/src/components/SessionTabs.tsx", "utf8"),
|
|
]);
|
|
assert.match(sidebar, /aria-label="Directories"/);
|
|
assert.match(tabs, /role="tablist"/);
|
|
assert.match(tabs, /role="tab"/);
|
|
assert.match(tabs, /aria-selected/);
|
|
assert.match(tabs, /ArrowRight/);
|
|
assert.match(app, /Multiple sessions are open in the same directory/);
|
|
assert.match(app, /Many Pi sessions are open/);
|
|
assert.match(css, /prefers-reduced-motion/);
|
|
assert.match(css, /grid-template-columns:\s*178px minmax\(0, 1fr\)/);
|
|
});
|
|
|
|
test("preserves native session naming, compaction, composer, and extension responses", async () => {
|
|
const [app] = await sources;
|
|
const [conversation, extension] = await Promise.all([
|
|
readFile("ui/src/components/ConversationWorkspace.tsx", "utf8"),
|
|
readFile("ui/src/components/ExtensionDialog.tsx", "utf8"),
|
|
]);
|
|
assert.match(app, /set_session_name/);
|
|
assert.match(app, /compact/);
|
|
assert.match(app, /submit_prompt/);
|
|
assert.match(app, /respond_to_extension/);
|
|
assert.match(conversation, /event\.key === "Enter" && !event\.shiftKey/);
|
|
assert.match(conversation, /className="todos-pane"/);
|
|
assert.match(extension, /role="dialog"/);
|
|
assert.match(extension, /aria-modal="true"/);
|
|
});
|
|
|
|
test("configures native window behavior and folder dialog capabilities", async () => {
|
|
const [config, capability, cargo] = await Promise.all([
|
|
readFile("ui/src-tauri/tauri.conf.json", "utf8"),
|
|
readFile("ui/src-tauri/capabilities/default.json", "utf8"),
|
|
readFile("ui/src-tauri/Cargo.toml", "utf8"),
|
|
]);
|
|
assert.match(config, /"width"\s*:\s*1100/);
|
|
assert.match(capability, /core:window:allow-start-dragging/);
|
|
assert.match(cargo, /tauri-plugin-single-instance/);
|
|
assert.match(cargo, /tauri-plugin-dialog/);
|
|
});
|