Files
Jyotisha/frontend/tests/consultation-workflow-request.test.ts
T
Jesse_Chen 2bf7472645
Independent Staging Quality Gate / validate (push) Successful in 10m59s
Independent Staging Quality Gate / publish (push) Successful in 9m7s
fix(consult): run the local skill's full technique spectrum on the web path
Web answers were thinner than a local Agent calling yinduzhanxing-skill:
theme-subset vargas, no visible audit table, and a prompt that dropped the
invocation contract. Bind the commercial method, compute D1–D60 plus Western
layers, and deliver the same Full-Spectrum checklist.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 23:30:36 +08:00

107 lines
4.1 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import { createConsultationPlan } from "../src/lib/consultation-plan.ts";
import { projectConsultationWorkflowRequest } from "../src/lib/consultation-workflow-request.ts";
import { runConsultationWorkflow } from "../src/mastra/index.ts";
import type { ConsultationInput } from "../src/mastra/index.ts";
test("timing questions declare their route instead of steering it through the question text", () => {
// Given: a public timing consultation question.
const question = "未来哪些阶段值得把握?";
// When: its workflow request is projected for the Python service.
const plan = createConsultationPlan({
userIntent: question,
theme: "timing",
consultationMode: "unverified_birth_time",
});
const request = projectConsultationWorkflowRequest(question, "timing", plan);
// Then: the question reaches the server verbatim and the route travels as plan metadata.
assert.equal(request.question, question);
assert.deepEqual(request.themes, ["timing"]);
assert.equal(request.strictWorkflowRoute, "timing");
assert.ok(request.requiredLayers.includes("Narayana"));
assert.ok(request.requiredLayers.includes("negative holdout gate"));
assert.equal(request.claimBoundary, "candidate_day_month_window_only_until_holdout_passes");
assert.equal(request.plan_version, "consultation-plan-v2");
assert.equal(request.precision_boundary, "server_evidence_required");
assert.equal(request.timing_horizon, "next_12_months");
});
test("consultation workflow allows a cold engine run to finish", async () => {
const source = await import("node:fs/promises").then(({ readFile }) =>
readFile(new URL("../src/mastra/consultation-workflow.ts", import.meta.url), "utf8")
);
assert.match(source, /AbortSignal\.timeout\(90_000\)/);
});
test("timing input projects only legal private workflow fields", async () => {
// Given: a public timing input and a Python workflow response.
const input: ConsultationInput = {
year: 1990,
month: 1,
day: 1,
hour: 12,
minute: 0,
lat: 25,
lon: 121,
tz: 8,
city: "台北",
question: "未来哪些阶段值得把握?",
theme: "timing",
entryMode: "direct_chart",
};
let requestBody = "";
const originalFetch = globalThis.fetch;
globalThis.fetch = async (_input, init) => {
requestBody = typeof init?.body === "string" ? init.body : "";
return new Response(JSON.stringify({
success: true,
chart: {},
routing: {},
consumer_context: {
route: "career",
core_status: "ready",
available_layers: [],
missing_route_layers: [],
hard_blockers: [],
answer_policy: {
can_answer_direction: true,
can_answer_precise_timing: false,
},
},
}), { status: 200 });
};
try {
// When: the adapter invokes the Python workflow.
await runConsultationWorkflow(input, {
plan: createConsultationPlan({
userIntent: input.question,
theme: input.theme,
consultationMode: "unverified_birth_time",
}),
});
} finally {
globalThis.fetch = originalFetch;
}
// Then: private workflow fields are projected without mutating public input.
const body = JSON.parse(requestBody);
assert.equal(body.question, "未来哪些阶段值得把握?");
assert.equal(body.question_text, "未来哪些阶段值得把握?");
assert.deepEqual(body.theme, ["timing"]);
assert.match(requestBody, /"timing"/);
assert.equal(body.plan_version, "consultation-plan-v2");
assert.equal(body.strict_workflow_route, "timing");
assert.ok(body.required_layers.includes("negative holdout gate"));
assert.equal(body.claim_boundary, "candidate_day_month_window_only_until_holdout_passes");
assert.equal(body.precision_boundary, "server_evidence_required");
assert.deepEqual(body.requested_domains, ["timing"]);
assert.deepEqual(body.required_evidence_categories, ["natal_foundation", "domain", "timing", "validation"]);
assert.equal(input.question, "未来哪些阶段值得把握?");
assert.equal(input.theme, "timing");
});