Files
Jyotisha/frontend/tests/fixtures/birth-time-dynamic-question-fixture.ts
T
2026-07-19 03:44:36 +08:00

87 lines
3.2 KiB
TypeScript

import { readFileSync } from "node:fs";
import { parseCandidateDifferenceBuild } from "../../src/lib/birth-time-journey-dynamic-adapters.ts";
import { createBirthTimeGuideService } from "../../src/lib/birth-time-guide-service.ts";
import type { BirthTimeGuideGenerator } from "../../src/lib/birth-time-guide-agent.ts";
import type { CandidateDifferenceBuild, PersistedDynamicChoiceQuestion } from "../../src/lib/birth-time-dynamic-choice-internal.ts";
import type {
DynamicQuestionGenerationCommand,
DynamicQuestionGenerationCommit,
} from "../../src/lib/birth-time-guide-service.ts";
export const caseId = "7299894c-10a8-4b45-91d1-339007282c50";
export const actionId = "c70ea014-f8b4-41f2-9305-e4ae60c0d4d1";
const task2ApiPacket: unknown = JSON.parse(readFileSync(
new URL("./task2-dynamic-rectification-packet.json", import.meta.url),
"utf8",
));
export const differenceBuild = parseCandidateDifferenceBuild(task2ApiPacket);
export const dynamicPacket = differenceBuild.packet;
const opportunity = dynamicPacket.opportunities[0];
const firstPartition = opportunity?.partitions[0];
const secondPartition = opportunity?.partitions[1];
if (!opportunity || !firstPartition || !secondPartition) {
throw new Error("Task2 fixture requires one opportunity with two partitions");
}
export const opportunityId = opportunity.opportunityId;
export const firstPartitionId = firstPartition.partitionId;
export const secondPartitionId = secondPartition.partitionId;
export const validDynamicSelection = {
kind: "question",
opportunityId,
} as const;
export const generationCommand: DynamicQuestionGenerationCommand = {
caseId,
actionId,
turnVersion: 4,
unmatchedNote: null,
};
export function deterministicIds(onCreate?: () => void): () => string {
const values = [
"00000000-0000-4000-8000-000000000001",
"00000000-0000-4000-8000-000000000002",
"00000000-0000-4000-8000-000000000003",
"00000000-0000-4000-8000-000000000004",
"00000000-0000-4000-8000-000000000005",
];
let index = 0;
return () => {
onCreate?.();
const value = values[index];
index += 1;
if (value === undefined) throw new Error("test id supply exhausted");
return value;
};
}
export function generatorFrom(
generate: (prompt: string) => string | Promise<string>,
): BirthTimeGuideGenerator {
return { async generate(prompt) { return { text: await generate(prompt) }; } };
}
export function dynamicService(input?: {
readonly build?: CandidateDifferenceBuild;
readonly generator?: BirthTimeGuideGenerator | null;
readonly createId?: () => string;
readonly onCommit?: (
question: PersistedDynamicChoiceQuestion | null,
commit: DynamicQuestionGenerationCommit,
) => void;
}) {
return createBirthTimeGuideService({
generator: input?.generator ?? null,
timeoutMs: 20,
async loadCase() { return null; },
async proposeEvidenceDraft() { throw new Error("legacy draft is outside this harness"); },
async loadDynamicQuestionBuild() { return input?.build ?? differenceBuild; },
async commitDynamicQuestion(_userId, _command, question, commit) {
input?.onCommit?.(question, commit);
return commit;
},
createDynamicId: input?.createId ?? deterministicIds(),
});
}