diff --git a/tests/experimental/rto-explicit-node-formulation.test.js b/tests/experimental/rto-explicit-node-formulation.test.js new file mode 100644 index 0000000..5e610af --- /dev/null +++ b/tests/experimental/rto-explicit-node-formulation.test.js @@ -0,0 +1,43 @@ +import { describe, expect, it } from "vitest"; + +import fixture from "@/tests/fixtures/live-product-launch-update-response.json"; +import { formulateQuestion } from "@/lib/graph/question-formulator.js"; + +describe("RTO.A5 explicit-node formulation apparatus", () => { + it("formulates directly for nxmeiab without selector invocation or graph mutation", () => { + const graph = structuredClone(fixture.updatedSituationGraph); + const graphBefore = structuredClone(graph); + const capturedSelectedQuestionNodeIdBefore = fixture.selectedQuestion.nodeId; + const activeUnknownNodeIdBefore = graph.activeUnknownNodeId ?? null; + const resolvedNodeIdsBefore = structuredClone(graph.resolvedNodeIds || []); + + const target = graph.nodes.find((node) => node.id === "nxmeiab"); + + expect(target).toBeTruthy(); + expect(target?.kind).toBe("unknown"); + expect(target?.status).not.toBe("resolved"); + + const result = formulateQuestion({ + node: target, + graph, + context: { + selectionState: { + status: "selected", + nodeId: "nxmeiab", + }, + }, + }); + + expect(result).toBeTruthy(); + expect(typeof result.question).toBe("string"); + expect(result.question.length).toBeGreaterThan(0); + expect(result.question.toLowerCase()).toMatch( + /competitor|competitors|similar products|release/, + ); + + expect(fixture.selectedQuestion.nodeId).toBe(capturedSelectedQuestionNodeIdBefore); + expect(graph.activeUnknownNodeId ?? null).toBe(activeUnknownNodeIdBefore); + expect(graph.resolvedNodeIds || []).toEqual(resolvedNodeIdsBefore); + expect(graph).toEqual(graphBefore); + }); +}); \ No newline at end of file