102 lines
3.2 KiB
TypeScript
102 lines
3.2 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { buildPersonalizedRoleplayConfigurePayload } from "../src/routes/services.js";
|
|
import { toQscoreUserId } from "../src/services/qscore-proxy.js";
|
|
|
|
const clerkUserId = "user_3GTcs6PBFcUrXUP6bH6U8dcwXBq";
|
|
const originalFetch = globalThis.fetch;
|
|
const requests: Request[] = [];
|
|
|
|
globalThis.fetch = (async (input, init) => {
|
|
const request = new Request(input, init);
|
|
requests.push(request);
|
|
return new Response(
|
|
JSON.stringify({
|
|
org_id: "growqr",
|
|
user_id: toQscoreUserId(clerkUserId),
|
|
rq_score: 61,
|
|
iq_score: 60,
|
|
eq_score: 62,
|
|
sq_score: 61,
|
|
profession: "General",
|
|
formula_version: "v1",
|
|
formula_id: "default",
|
|
calculated_at: "2026-07-14T00:00:00Z",
|
|
quotients: {},
|
|
breakdown: {},
|
|
ledger_seq_from: null,
|
|
ledger_seq_to: null,
|
|
}),
|
|
{ status: 200, headers: { "content-type": "application/json" } },
|
|
);
|
|
}) as typeof fetch;
|
|
|
|
try {
|
|
const payload = await buildPersonalizedRoleplayConfigurePayload(
|
|
new Request("http://backend.test/roleplay/preview"),
|
|
{
|
|
scenario_type: "salary-negotiation",
|
|
metadata: { difficulty: "medium" },
|
|
},
|
|
clerkUserId,
|
|
{
|
|
resolveUserContext: async () => ({ clerk_id: clerkUserId }),
|
|
},
|
|
);
|
|
|
|
assert.equal(requests.length, 1);
|
|
const qscoreUrl = new URL(requests[0]!.url);
|
|
assert.equal(qscoreUrl.pathname, `/v1/qscore/${toQscoreUserId(clerkUserId)}`);
|
|
assert.equal(qscoreUrl.searchParams.get("org_id"), "growqr");
|
|
assert.equal((payload.qscore as Record<string, unknown>).rq_score, 61);
|
|
assert.equal(payload.user_id, clerkUserId);
|
|
|
|
requests.length = 0;
|
|
const suppliedPayload = await buildPersonalizedRoleplayConfigurePayload(
|
|
new Request("http://backend.test/roleplay/preview"),
|
|
{
|
|
qscore: { rq_score: 74, source: "caller" },
|
|
metadata: {},
|
|
},
|
|
clerkUserId,
|
|
{
|
|
resolveUserContext: async () => ({
|
|
clerk_id: clerkUserId,
|
|
qscore: { rq_score: 68, source: "context" },
|
|
}),
|
|
},
|
|
);
|
|
assert.equal(requests.length, 0);
|
|
assert.deepEqual(suppliedPayload.qscore, { rq_score: 74, source: "caller" });
|
|
|
|
const curatorTaskId = "curator-sprint:icp-v10-static:2026-07-14:day-2:practice:roleplay";
|
|
const correlatedPayload = await buildPersonalizedRoleplayConfigurePayload(
|
|
new Request("http://backend.test/roleplay/preview"),
|
|
{
|
|
qscore: { rq_score: 74 },
|
|
metadata: {},
|
|
curatorTaskId,
|
|
taskId: curatorTaskId,
|
|
mission: {
|
|
source: "curator-v1",
|
|
missionId: "curator-sprint",
|
|
missionInstanceId: "curator-sprint:icp-v10-static:2026-07-14",
|
|
stageId: "wk-1:day-2:practice:roleplay",
|
|
},
|
|
},
|
|
clerkUserId,
|
|
{ resolveUserContext: async () => ({ clerk_id: clerkUserId }) },
|
|
);
|
|
assert.deepEqual(correlatedPayload.mission, {
|
|
source: "curator-v1",
|
|
missionId: "curator-sprint",
|
|
missionInstanceId: "curator-sprint:icp-v10-static:2026-07-14",
|
|
stageId: "wk-1:day-2:practice:roleplay",
|
|
});
|
|
assert.equal(correlatedPayload.curatorTaskId, curatorTaskId);
|
|
assert.equal(correlatedPayload.taskId, curatorTaskId);
|
|
|
|
console.log("roleplay QScore identity: all assertions passed");
|
|
} finally {
|
|
globalThis.fetch = originalFetch;
|
|
}
|