* Make identifier required * Fallback to null if identifier isn't present * Type fix * Type fixes * Type fix * Create `RoutingFormResponseRepository` * Create `RoutingFormResponseService` * Use repsotiories to find form value * Delete console.logs * Undo change in `ZResponseInputSchema` schema * Type fix * Undo changes * fix: correct import path in RoutingFormResponseService to resolve runtime errors - Change relative import path to use @calcom alias - Prevents import resolution failures that cause app startup issues Co-Authored-By: joe@cal.com <j.auyeung419@gmail.com> * Undo changes * Update type * Update typing * Address feedback * Address feedback * chore: Provide a suggestion for pr 22396, new structure (#22491) * chore: Provide a suggestion for pr 22396, new structure * Refactor to create two create methods with bookingUid and id * Use `createWithBookingUid` * Extract routing form response parser to seperate util * Added more and improved test cases * Fix --------- Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com> * Factory included wrong calls * Fix test for findFieldValueByIdentifier * Add tests * Fix test * Fix test --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Alex van Andel <me@alexvanandel.com>
100 lines
3.0 KiB
TypeScript
100 lines
3.0 KiB
TypeScript
import { describe, it, expect } from "vitest";
|
|
|
|
import { parseRoutingFormResponse } from "./parseRoutingFormResponse";
|
|
|
|
describe("parseRoutingFormResponse", () => {
|
|
const validFields = [
|
|
{ id: "field-123", label: "E-mail", identifier: "email", type: "text" },
|
|
{ id: "field-456", label: "Name", identifier: "name", type: "text" },
|
|
];
|
|
|
|
const validResponse = {
|
|
"field-123": { value: "test@example.com" },
|
|
"field-456": { value: "John Doe" },
|
|
};
|
|
|
|
it("parses valid form response and fields", () => {
|
|
const parsed = parseRoutingFormResponse(validResponse, validFields);
|
|
expect(parsed.response["field-123"].value).toBe("test@example.com");
|
|
expect(parsed.fields.length).toBe(2);
|
|
});
|
|
|
|
it("handles response with optional label", () => {
|
|
const responseWithLabels = {
|
|
"field-123": { value: "test@example.com", label: "E-mail" },
|
|
"field-456": { value: "John Doe", label: "Name" },
|
|
};
|
|
|
|
const parsed = parseRoutingFormResponse(responseWithLabels, validFields);
|
|
expect(parsed.response["field-123"].label).toBe("E-mail");
|
|
expect(parsed.response["field-456"].value).toBe("John Doe");
|
|
});
|
|
|
|
it("handles array value in response", () => {
|
|
const multiSelectResponse = {
|
|
"field-789": { value: ["opt1", "opt2"] },
|
|
};
|
|
|
|
const multiSelectFields = [
|
|
{
|
|
id: "field-789",
|
|
label: "Options",
|
|
identifier: "options",
|
|
type: "select",
|
|
options: [
|
|
{ label: "Option 1", id: "opt1" },
|
|
{ label: "Option 2", id: "opt2" },
|
|
],
|
|
},
|
|
];
|
|
|
|
const parsed = parseRoutingFormResponse(multiSelectResponse, multiSelectFields);
|
|
expect(parsed.response["field-789"].value).toEqual(["opt1", "opt2"]);
|
|
});
|
|
|
|
it("throws if response has unexpected field value type", () => {
|
|
const badResponse = {
|
|
"field-123": { value: { nested: true } }, // invalid type
|
|
};
|
|
|
|
expect(() => parseRoutingFormResponse(badResponse, validFields)).toThrow();
|
|
});
|
|
|
|
it("throws if a field is missing required keys like 'id'", () => {
|
|
const badField = [
|
|
{
|
|
label: "E-mail",
|
|
type: "text",
|
|
},
|
|
];
|
|
|
|
expect(() => parseRoutingFormResponse(validResponse, badField)).toThrow();
|
|
});
|
|
|
|
it("allows optional fields like 'selectText' and 'deleted'", () => {
|
|
const optionalField = [
|
|
{
|
|
id: "field-999",
|
|
label: "Optional",
|
|
identifier: "opt",
|
|
type: "text",
|
|
selectText: "Pick one",
|
|
deleted: true,
|
|
},
|
|
];
|
|
|
|
const optionalResponse = {
|
|
"field-999": { value: "Some value" },
|
|
};
|
|
|
|
const parsed = parseRoutingFormResponse(optionalResponse, optionalField);
|
|
expect(parsed.fields[0].selectText).toBe("Pick one");
|
|
expect(parsed.fields[0].deleted).toBe(true);
|
|
});
|
|
|
|
it("throws if raw inputs are not objects", () => {
|
|
expect(() => parseRoutingFormResponse("not-an-object" as any, validFields)).toThrow();
|
|
expect(() => parseRoutingFormResponse(validResponse, "not-an-array" as any)).toThrow();
|
|
});
|
|
});
|