diff --git a/apps/web/modules/survey/link/lib/metadata-utils.test.ts b/apps/web/modules/survey/link/lib/metadata-utils.test.ts index b4b041b895..8f39c2c348 100644 --- a/apps/web/modules/survey/link/lib/metadata-utils.test.ts +++ b/apps/web/modules/survey/link/lib/metadata-utils.test.ts @@ -32,6 +32,16 @@ vi.mock("@/lib/styling/constants", () => ({ }, })); +// Mock recall utility +vi.mock("@/lib/utils/recall", () => ({ + recallToHeadline: vi.fn((headline) => headline), +})); + +// Mock text content extraction +vi.mock("@formbricks/types/surveys/validation", () => ({ + getTextContent: vi.fn((text) => text), +})); + describe("Metadata Utils", () => { // Reset all mocks before each test beforeEach(() => { @@ -173,6 +183,75 @@ describe("Metadata Utils", () => { WEBAPP_URL: "https://test.formbricks.com", })); }); + + test("handles welcome card headline with HTML content", async () => { + const { getTextContent } = await import("@formbricks/types/surveys/validation"); + + const mockSurvey = { + id: mockSurveyId, + environmentId: mockEnvironmentId, + name: "Test Survey", + metadata: {}, + languages: [], + welcomeCard: { + enabled: true, + timeToFinish: false, + showResponseCount: false, + headline: { + default: "
Welcome Headline
", + }, + html: { + default: "Welcome Description", + }, + } as TSurveyWelcomeCard, + } as TSurvey; + + vi.mocked(getSurvey).mockResolvedValue(mockSurvey); + vi.mocked(getTextContent).mockReturnValue("Welcome Headline"); + + const result = await getBasicSurveyMetadata(mockSurveyId); + + expect(getTextContent).toHaveBeenCalled(); + expect(result.title).toBe("Welcome Headline"); + }); + + test("handles welcome card headline with recall variables", async () => { + const { recallToHeadline } = await import("@/lib/utils/recall"); + + const mockSurvey = { + id: mockSurveyId, + environmentId: mockEnvironmentId, + name: "Test Survey", + metadata: {}, + languages: [], + welcomeCard: { + enabled: true, + timeToFinish: false, + showResponseCount: false, + headline: { + default: "Welcome #recall:name/fallback:User#", + }, + html: { + default: "Welcome Description", + }, + } as TSurveyWelcomeCard, + } as TSurvey; + + vi.mocked(getSurvey).mockResolvedValue(mockSurvey); + vi.mocked(recallToHeadline).mockReturnValue({ + default: "Welcome @User", + }); + + const result = await getBasicSurveyMetadata(mockSurveyId); + + expect(recallToHeadline).toHaveBeenCalledWith( + mockSurvey.welcomeCard.headline, + mockSurvey, + false, + "default" + ); + expect(result.title).toBe("Welcome @User"); + }); }); describe("getSurveyOpenGraphMetadata", () => { diff --git a/apps/web/modules/survey/link/lib/metadata-utils.ts b/apps/web/modules/survey/link/lib/metadata-utils.ts index c1eed2f111..4d9a90eb0a 100644 --- a/apps/web/modules/survey/link/lib/metadata-utils.ts +++ b/apps/web/modules/survey/link/lib/metadata-utils.ts @@ -1,8 +1,10 @@ import { Metadata } from "next"; +import { getTextContent } from "@formbricks/types/surveys/validation"; import { IS_FORMBRICKS_CLOUD } from "@/lib/constants"; import { getPublicDomain } from "@/lib/getPublicUrl"; import { getLocalizedValue } from "@/lib/i18n/utils"; import { COLOR_DEFAULTS } from "@/lib/styling/constants"; +import { recallToHeadline } from "@/lib/utils/recall"; import { getSurvey } from "@/modules/survey/lib/survey"; type TBasicSurveyMetadata = { @@ -48,7 +50,9 @@ export const getBasicSurveyMetadata = async ( const titleFromMetadata = metadata?.title ? getLocalizedValue(metadata.title, langCode) || "" : undefined; const titleFromWelcome = welcomeCard?.enabled && welcomeCard.headline - ? getLocalizedValue(welcomeCard.headline, langCode) || "" + ? getTextContent( + getLocalizedValue(recallToHeadline(welcomeCard.headline, survey, false, langCode), langCode) + ) || "" : undefined; let title = titleFromMetadata || titleFromWelcome || survey.name;