BMAD-METHOD/jus-ia-start-kit/src/services/__tests__/prompt-builder.test.ts

87 lines
2.6 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { buildPrompt } from "../prompt-builder.js";
import type { FlowConfig, FlowState } from "../../flows/types.js";
const mockFlow: FlowConfig = {
area: "trabalhista",
areaLabel: "Trabalhista",
subtipo: "horas-extras",
subtipoLabel: "Horas Extras",
tipoTarefa: "peticao-inicial",
steps: [],
promptTemplate: "Regime: {{regime}}, Jornada: {{jornada_contratual}}, Extra: {{horas_extras_semana}}",
legalReferences: ["art. 59 CLT"],
};
const mockState: FlowState = {
area: "trabalhista",
subtipo: "horas-extras",
tipoTarefa: "peticao-inicial",
currentStep: 2,
totalSteps: 5,
responses: {
regime: "CLT",
jornada_contratual: "44h semanais",
horas_extras_semana: "5 a 10 horas",
},
};
describe("buildPrompt", () => {
it("interpolates template variables", () => {
const result = buildPrompt(mockFlow, mockState);
expect(result.text).toContain("CLT");
expect(result.text).toContain("44h semanais");
expect(result.text).toContain("5 a 10 horas");
expect(result.text).not.toContain("{{");
});
it("returns legal references", () => {
const result = buildPrompt(mockFlow, mockState);
expect(result.legalReferences).toEqual(["art. 59 CLT"]);
});
it("calculates char count", () => {
const result = buildPrompt(mockFlow, mockState);
expect(result.charCount).toBe(result.text.length);
});
it("determines fitsInUrl correctly for short prompt", () => {
const result = buildPrompt(mockFlow, mockState);
expect(result.fitsInUrl).toBe(true);
expect(result.encodedUrl).toBeDefined();
});
it("determines fitsInUrl correctly for long prompt", () => {
const longFlow = {
...mockFlow,
promptTemplate: "A".repeat(2000),
};
const result = buildPrompt(longFlow, mockState);
expect(result.fitsInUrl).toBe(false);
expect(result.encodedUrl).toBeUndefined();
});
it("removes unreplaced variables", () => {
const flowWithExtra = {
...mockFlow,
promptTemplate: "{{regime}} - {{campo_inexistente}}",
};
const result = buildPrompt(flowWithExtra, mockState);
expect(result.text).not.toContain("{{campo_inexistente}}");
expect(result.text).toContain("CLT");
});
it("handles array responses by joining with comma", () => {
const stateWithArray = {
...mockState,
responses: { ...mockState.responses, provas: ["Doc1", "Doc2"] },
};
const flowWithArray = {
...mockFlow,
promptTemplate: "Provas: {{provas}}",
};
const result = buildPrompt(flowWithArray, stateWithArray);
expect(result.text).toContain("Doc1, Doc2");
});
});