mirror of
https://github.com/formbricks/formbricks.git
synced 2026-02-20 00:55:00 -06:00
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>
120 lines
4.0 KiB
TypeScript
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?");
|
|
});
|
|
});
|
|
});
|