feat: expand intelligent investigation workspace
This commit is contained in:
@@ -15,11 +15,11 @@ beforeEach(() => {
|
||||
describe("SCADA frontend actions", () => {
|
||||
it("accepts registered view actions and rejects unknown action names", () => {
|
||||
expect(parseFrontendActionRegistry({
|
||||
schema_version: "frontend-action-registry@1",
|
||||
schema_version: "frontend-action-registry@2",
|
||||
actions: [
|
||||
{ id: "render_scada_analysis", version: "frontend-action@1" },
|
||||
{ id: "clear_scada_analysis", version: "frontend-action@1" },
|
||||
{ id: "zoom_to_map", version: "frontend-action@1" }
|
||||
{ id: "render_scada_analysis", version: "frontend-action@2" },
|
||||
{ id: "clear_scada_analysis", version: "frontend-action@2" },
|
||||
{ id: "zoom_to_map", version: "frontend-action@2" }
|
||||
]
|
||||
})?.actions.map((action) => action.id)).toEqual([
|
||||
"render_scada_analysis",
|
||||
@@ -49,6 +49,7 @@ describe("SCADA frontend actions", () => {
|
||||
expect(execute).toHaveBeenCalledTimes(1);
|
||||
expect(submit).toHaveBeenCalledTimes(2);
|
||||
expect(submit.mock.calls[0][2]).toMatchObject({
|
||||
version: "frontend-action-result@2",
|
||||
status: "succeeded",
|
||||
output: { rendered_ids: ["MP01"], fitted: true }
|
||||
});
|
||||
@@ -58,13 +59,37 @@ describe("SCADA frontend actions", () => {
|
||||
|
||||
function createRequest(name: string) {
|
||||
return {
|
||||
version: "frontend-action@1",
|
||||
version: "frontend-action@2",
|
||||
actionId: "action-1",
|
||||
toolCallId: "call-1",
|
||||
sessionId: "session-1",
|
||||
name,
|
||||
params: { items: [{ device_id: "MP01", level: "high" }] },
|
||||
command: { action: name, items: [{ device_id: "MP01", level: "high" }] },
|
||||
issuedAt: Date.now(),
|
||||
expiresAt: Date.now() + 15_000
|
||||
};
|
||||
}
|
||||
|
||||
describe("ordered v2 actions", () => {
|
||||
it("rejects v1 envelopes, legacy name/params and malformed canonical commands", () => {
|
||||
const request = createRequest("render_scada_analysis");
|
||||
expect(parseFrontendActionRequest({ ...request, version: "frontend-action@1" })).toBeNull();
|
||||
expect(parseFrontendActionRequest({ ...request, name: "render_scada_analysis", params: {} })).toBeNull();
|
||||
expect(parseFrontendActionRequest({ ...request, command: { action: "zoom_to_map", center: [181, 31], zoom: 14 } })).toBeNull();
|
||||
});
|
||||
it("keeps commands in stream order and cancels queued work when a session changes", async () => {
|
||||
let release!: () => void;
|
||||
const first = new Promise<void>((resolve) => { release = resolve; });
|
||||
const execute = vi.fn(async (request, signal) => { await first; signal.throwIfAborted(); return { action: request.command.action }; });
|
||||
const submit = vi.fn(async () => {});
|
||||
const executor = new FrontendActionExecutor(execute, submit);
|
||||
const one = executor.handle(createRequest("render_scada_analysis"), "session-1");
|
||||
const two = executor.handle({ ...createRequest("render_scada_analysis"), actionId: "action-2" }, "session-1");
|
||||
await Promise.resolve();
|
||||
expect(execute).toHaveBeenCalledTimes(1);
|
||||
executor.cancelAll(); release(); await Promise.all([one, two]);
|
||||
expect(execute).toHaveBeenCalledTimes(1);
|
||||
expect(submit.mock.calls.map((call) => (call as unknown[])[2])).toEqual([
|
||||
expect.objectContaining({ status: "cancelled" }), expect.objectContaining({ status: "cancelled" })
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user