const test = require("node:test"); const assert = require("node:assert"); const { createFakePi } = require("./fake_pi_runtime.js"); const { emitAndWait } = require("../../tht-gate.js"); test("emitAndWait trasporta il descriptor come JSON nel title e ritorna la ui_response parsata", async () => { const { ctx, enqueueUi } = createFakePi(); const descriptor = { id: "u1", widget: "select", options: [{ id: "a", label: "A" }] }; enqueueUi(JSON.stringify({ id: "u1", choices: ["a"] })); const resp = await emitAndWait(ctx, descriptor); assert.deepEqual(resp, { id: "u1", choices: ["a"] }); assert.equal(ctx.uiCalls[0].method, "input"); assert.equal(ctx.uiCalls[0].title, JSON.stringify(descriptor)); }); test("no-limbo: undefined (cancel) ri-presenta lo stesso widget", async () => { const { ctx, enqueueUi } = createFakePi(); const descriptor = { id: "u1", widget: "select", options: [] }; enqueueUi(undefined); // 1° giro: cancel enqueueUi(JSON.stringify({ id: "u1", choices: ["a"] })); // 2° giro: risposta valida const resp = await emitAndWait(ctx, descriptor); assert.deepEqual(resp, { id: "u1", choices: ["a"] }); assert.equal(ctx.uiCalls.length, 2); // ri-presentato una volta assert.ok(ctx.notifications.some((n) => /Esc non chiude/.test(n.message))); });