Files
formbricks/apps/web/lib/utils/templates.test.ts
Anshuman Pandey f888aa8a19 feat: MQP (#6901)
Co-authored-by: Matti Nannt <matti@formbricks.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2025-11-28 12:36:17 +00:00

120 lines
4.0 KiB
TypeScript

import { beforeEach, describe, expect, test, vi } from "vitest";
import { type TProject } from "@formbricks/types/project";
import type { TSurveyElement } from "@formbricks/types/surveys/elements";
import type { TTemplate } from "@formbricks/types/templates";
import * as i18nUtils from "@/lib/i18n/utils";
import { structuredClone } from "@/lib/pollyfills/structuredClone";
import { replaceElementPresetPlaceholders, replacePresetPlaceholders } from "./templates";
vi.mock("@/lib/i18n/utils");
vi.mock("@/lib/pollyfills/structuredClone");
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(structuredClone).mockImplementation((obj) => JSON.parse(JSON.stringify(obj)));
// Mock getLocalizedValue to return the value from the object
vi.mocked(i18nUtils.getLocalizedValue).mockImplementation((obj: any, lang: string) => obj?.[lang] || "");
});
describe("Template Utilities", () => {
describe("replaceElementPresetPlaceholders", () => {
test("returns original element when project is not provided", () => {
const element = {
type: "openText",
headline: { default: "Question about $[projectName]?" },
} as unknown as TSurveyElement;
const result = replaceElementPresetPlaceholders(element, undefined as any);
expect(result).toEqual(element);
});
test("replaces projectName placeholder in headline", () => {
const element = {
type: "openText",
headline: { default: "How do you like $[projectName]?" },
} as unknown as TSurveyElement;
const project = {
name: "TestProject",
} as unknown as TProject;
const result = replaceElementPresetPlaceholders(element, project);
// The function directly replaces without calling getLocalizedValue in the test scenario
expect(result.headline?.default).toBe("How do you like TestProject?");
});
test("replaces projectName placeholder in subheader", () => {
const element = {
type: "openText",
headline: { default: "Question" },
subheader: { default: "Subheader for $[projectName]" },
} as unknown as TSurveyElement;
const project = {
name: "TestProject",
} as unknown as TProject;
const result = replaceElementPresetPlaceholders(element, project);
expect(result.headline?.default).toBe("Question");
expect(result.subheader?.default).toBe("Subheader for TestProject");
});
test("handles missing headline and subheader", () => {
const element = {
type: "openText",
} as unknown as TSurveyElement;
const project = {
name: "TestProject",
} as unknown as TProject;
const result = replaceElementPresetPlaceholders(element, project);
expect(structuredClone).toHaveBeenCalledWith(element);
expect(result).toEqual(element);
});
});
describe("replacePresetPlaceholders", () => {
test("replaces projectName placeholder in template name and blocks", () => {
const mockTemplate = {
name: "Template 1",
preset: {
name: "$[projectName] Feedback",
welcomeCard: { enabled: false, timeToFinish: false, showResponseCount: false },
blocks: [
{
id: "block1",
name: "Block 1",
elements: [
{
id: "elem1",
type: "openText",
headline: { default: "How would you rate $[projectName]?" },
required: true,
inputType: "text",
},
],
},
],
endings: [],
hiddenFields: { enabled: true, fieldIds: [] },
},
} as unknown as TTemplate;
const project = {
name: "TestProject",
} as TProject;
const result = replacePresetPlaceholders(mockTemplate, project);
expect(structuredClone).toHaveBeenCalledWith(mockTemplate.preset);
expect(result.preset.name).toBe("TestProject Feedback");
expect(result.preset.blocks[0].elements[0].headline?.default).toBe("How would you rate TestProject?");
});
});
});