Files
TORCH/test/fleet/dashboard-demo.test.mjs
T

88 lines
5.0 KiB
JavaScript

import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { runInNewContext } from 'node:vm';
import test from 'node:test';
const source = readFileSync(new URL('../../site/demo.js', import.meta.url), 'utf8');
function workspace() {
const context = { URLSearchParams };
runInNewContext(source, context);
assert.equal(context.TorchConsoleDemo, undefined, 'live Console does not acquire demo state');
return context.TorchDemo.createWorkspace({ clock: () => new Date('2026-09-29T12:00:00Z') });
}
const confirm = (demo, path, payload, preview) => demo.request(path, {
...payload, token: preview.token, planHash: preview.planHash,
});
test('SCN-dashboard-demo: pilot conclusions block unsupported adoption and reverse only after sample confirmation', async () => {
const demo = workspace();
const path = '/api/organization-proposals/hierarchy-conclusion/sample-coordination-pilot';
const blocked = await demo.request(path + '/preview', { action: 'adopt', reason: 'Try adoption.' });
assert.equal(blocked.plan.canProceed, false);
assert.equal(blocked.token, null);
const payload = { action: 'reverse', reason: 'Restore direct reporting.' };
const preview = await demo.request(path + '/preview', payload);
assert.equal(demo.snapshot().hierarchyProposals[0].state, 'piloting');
const before = demo.snapshot();
await assert.rejects(confirm(demo, path, { ...payload, action: 'adopt' }, preview), /Review/);
const result = await confirm(demo, path, payload, preview);
assert.equal(result.proposal.state, 'reversed');
assert.equal(demo.snapshot().organization.graph.revision, before.organization.graph.revision + 1);
assert.equal(demo.snapshot().agents.length, before.agents.length);
assert.equal(JSON.stringify(demo.snapshot().backlog), JSON.stringify(before.backlog));
assert.equal((await confirm(demo, path, payload, preview)).proposal.state, 'reversed');
});
test('SCN-dashboard-demo: owner actions use isolated sample state with preview and confirmation', async () => {
const demo = workspace();
const other = workspace();
const path = '/api/backlog/tasks/API-08/priority';
const payload = { priority: 'urgent', reason: 'Needed for the beta', expectedRevision: 1 };
const preview = await demo.request(path + '/preview', payload);
assert.equal(demo.snapshot().backlog.find((task) => task.id === 'API-08').priority, 'high');
await assert.rejects(confirm(demo, path, { ...payload, priority: 'low' }, preview), /Review/);
const result = await confirm(demo, path, payload, preview);
assert.equal(result.task.priority, 'urgent');
assert.equal(result.task.owner, 'services');
assert.equal(result.task.state, 'in_progress');
await confirm(demo, path, payload, preview);
assert.equal(demo.snapshot().backlog.find((task) => task.id === 'API-08').revision, 2);
assert.equal(other.snapshot().backlog.find((task) => task.id === 'API-08').priority, 'high');
demo.reset();
assert.equal(demo.snapshot().backlog.find((task) => task.id === 'API-08').priority, 'high');
});
test('SCN-dashboard-demo: feedback, requests, approvals and profiles update the same sample project', async () => {
const demo = workspace();
const feedbackPath = '/api/artifacts/home-wireframe/feedback';
const payload = { body: 'Give active work more room.' };
const review = await demo.request(feedbackPath + '/preview', payload);
assert.equal(review.preview.recipient, 'interface');
assert.equal(demo.snapshot().artifacts.items[0].feedback.length, 1);
await confirm(demo, feedbackPath, payload, review);
assert.equal(demo.snapshot().artifacts.items[0].feedback.length, 2);
assert.equal(demo.snapshot().messages.recent[0].body, payload.body);
const requestPath = '/api/owner-requests';
const request = { recipient: 'qa', body: 'Review the home layout.', taskId: 'APP-12' };
const requestPreview = await demo.request(requestPath + '/preview', request);
await confirm(demo, requestPath, { taskId: request.taskId, recipient: request.recipient, body: request.body }, requestPreview);
assert.equal(demo.snapshot().messages.recent[0].recipient, 'qa');
const approvalPath = '/api/approvals/review-home/decision';
const decision = { decision: 'approved', note: 'Proceed with the layout.' };
await confirm(demo, approvalPath, decision, await demo.request(approvalPath + '/preview', decision));
assert.equal(demo.snapshot().approvalRequests.pendingCount, 0);
assert.equal(demo.snapshot().approvalRequests.items[0].status, 'approved');
const profilePath = '/api/runtime-profiles';
const profile = { areaId: 'interface', runtime: 'claude', model: '', reasoning: '' };
await confirm(demo, profilePath, profile, await demo.request(profilePath + '/preview', profile));
const agent = demo.snapshot().agents.find((item) => item.areaId === 'interface');
assert.equal(agent.runtime, 'claude');
assert.equal(agent.model, 'sonnet');
assert.equal(agent.reasoning, null);
assert.equal(agent.state, 'waiting');
await assert.rejects(demo.request('/api/schedule-launcher/preview', { action: 'install' }), /unavailable/);
});