mirror of
https://github.com/formbricks/formbricks.git
synced 2025-12-30 10:19:51 -06:00
165 lines
5.4 KiB
TypeScript
165 lines
5.4 KiB
TypeScript
import { getLocalizedValue } from "@/lib/i18n/utils";
|
|
import { structuredClone } from "@/lib/pollyfills/structuredClone";
|
|
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
import { TProject } from "@formbricks/types/project";
|
|
import { TSurveyQuestion, TSurveyQuestionTypeEnum } from "@formbricks/types/surveys/types";
|
|
import { TTemplate } from "@formbricks/types/templates";
|
|
import { replacePresetPlaceholders, replaceQuestionPresetPlaceholders } from "./templates";
|
|
|
|
// Mock the imported functions
|
|
vi.mock("@/lib/i18n/utils", () => ({
|
|
getLocalizedValue: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("@/lib/pollyfills/structuredClone", () => ({
|
|
structuredClone: vi.fn((obj) => JSON.parse(JSON.stringify(obj))),
|
|
}));
|
|
|
|
describe("Template Utilities", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe("replaceQuestionPresetPlaceholders", () => {
|
|
test("returns original question when project is not provided", () => {
|
|
const question: TSurveyQuestion = {
|
|
id: "test-id",
|
|
type: TSurveyQuestionTypeEnum.OpenText,
|
|
headline: {
|
|
default: "Test Question $[projectName]",
|
|
},
|
|
} as unknown as TSurveyQuestion;
|
|
|
|
const result = replaceQuestionPresetPlaceholders(question, undefined as unknown as TProject);
|
|
|
|
expect(result).toEqual(question);
|
|
expect(structuredClone).not.toHaveBeenCalled();
|
|
});
|
|
|
|
test("replaces projectName placeholder in subheader", () => {
|
|
const question: TSurveyQuestion = {
|
|
id: "test-id",
|
|
type: TSurveyQuestionTypeEnum.OpenText,
|
|
headline: {
|
|
default: "Test Question",
|
|
},
|
|
subheader: {
|
|
default: "Subheader for $[projectName]",
|
|
},
|
|
} as unknown as TSurveyQuestion;
|
|
|
|
const project: TProject = {
|
|
id: "project-id",
|
|
name: "Test Project",
|
|
organizationId: "org-id",
|
|
} as unknown as TProject;
|
|
|
|
// Mock for headline and subheader with correct return values
|
|
vi.mocked(getLocalizedValue).mockReturnValueOnce("Test Question");
|
|
vi.mocked(getLocalizedValue).mockReturnValueOnce("Subheader for $[projectName]");
|
|
|
|
const result = replaceQuestionPresetPlaceholders(question, project);
|
|
|
|
expect(vi.mocked(getLocalizedValue)).toHaveBeenCalledTimes(2);
|
|
expect(result.subheader?.default).toBe("Subheader for Test Project");
|
|
});
|
|
|
|
test("handles missing headline and subheader", () => {
|
|
const question: TSurveyQuestion = {
|
|
id: "test-id",
|
|
type: TSurveyQuestionTypeEnum.OpenText,
|
|
} as unknown as TSurveyQuestion;
|
|
|
|
const project: TProject = {
|
|
id: "project-id",
|
|
name: "Test Project",
|
|
organizationId: "org-id",
|
|
} as unknown as TProject;
|
|
|
|
const result = replaceQuestionPresetPlaceholders(question, project);
|
|
|
|
expect(structuredClone).toHaveBeenCalledWith(question);
|
|
expect(result).toEqual(question);
|
|
expect(getLocalizedValue).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe("replacePresetPlaceholders", () => {
|
|
test("replaces projectName placeholder in template name and questions", () => {
|
|
const template: TTemplate = {
|
|
id: "template-1",
|
|
name: "Test Template",
|
|
description: "Template Description",
|
|
preset: {
|
|
name: "$[projectName] Feedback",
|
|
questions: [
|
|
{
|
|
id: "q1",
|
|
type: TSurveyQuestionTypeEnum.OpenText,
|
|
headline: {
|
|
default: "How do you like $[projectName]?",
|
|
},
|
|
},
|
|
{
|
|
id: "q2",
|
|
type: TSurveyQuestionTypeEnum.OpenText,
|
|
headline: {
|
|
default: "Another question",
|
|
},
|
|
subheader: {
|
|
default: "About $[projectName]",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
category: "product",
|
|
} as unknown as TTemplate;
|
|
|
|
const project = {
|
|
name: "Awesome App",
|
|
};
|
|
|
|
// Mock getLocalizedValue to return the original strings with placeholders
|
|
vi.mocked(getLocalizedValue)
|
|
.mockReturnValueOnce("How do you like $[projectName]?")
|
|
.mockReturnValueOnce("Another question")
|
|
.mockReturnValueOnce("About $[projectName]");
|
|
|
|
const result = replacePresetPlaceholders(template, project);
|
|
|
|
expect(result.preset.name).toBe("Awesome App Feedback");
|
|
expect(structuredClone).toHaveBeenCalledWith(template.preset);
|
|
|
|
// Verify that replaceQuestionPresetPlaceholders was applied to both questions
|
|
expect(vi.mocked(getLocalizedValue)).toHaveBeenCalledTimes(3);
|
|
expect(result.preset.questions[0].headline?.default).toBe("How do you like Awesome App?");
|
|
expect(result.preset.questions[1].subheader?.default).toBe("About Awesome App");
|
|
});
|
|
|
|
test("maintains other template properties", () => {
|
|
const template: TTemplate = {
|
|
id: "template-1",
|
|
name: "Test Template",
|
|
description: "Template Description",
|
|
preset: {
|
|
name: "$[projectName] Feedback",
|
|
questions: [],
|
|
},
|
|
category: "product",
|
|
} as unknown as TTemplate;
|
|
|
|
const project = {
|
|
name: "Awesome App",
|
|
};
|
|
|
|
const result = replacePresetPlaceholders(template, project) as unknown as {
|
|
name: string;
|
|
description: string;
|
|
};
|
|
|
|
expect(result.name).toBe(template.name);
|
|
expect(result.description).toBe(template.description);
|
|
});
|
|
});
|
|
});
|