87 lines
2.6 KiB
TypeScript
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");
|
|
});
|
|
});
|