import { render, waitFor } from "@testing-library/react";
import type { NextSeoProps } from "next-seo";
import type { OpenGraph } from "next/dist/lib/metadata/types/opengraph-types";
import { vi } from "vitest";
import type { HeadSeoProps } from "./HeadSeo";
import HeadSeo from "./HeadSeo";
vi.mock("next-seo", () => {
return {
NextSeo: (props: NextSeoProps) => {
const { images, ...restOpenGraph } = props.openGraph as OpenGraph & { images: Array<{ url: string }> };
const mockedProps = {
...restOpenGraph,
canonical: props.canonical,
image: images[0].url,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
} as any;
return
;
},
};
});
vi.mock("@calcom/lib/OgImages", async () => {
return {
constructAppImage() {
return "constructAppImage";
},
constructGenericImage() {
return "constructGenericImage";
},
constructMeetingImage() {
return "constructMeetingImage";
},
};
});
const basicProps = {
image: "image.png",
siteName: "calcomsite",
url: "calcom.com",
canonical: "test canonical",
title: "Test Title",
description: "Test Description",
};
describe("Tests for HeadSeo component", () => {
test("Should render mocked NextSeo", async () => {
const { container } = render();
await waitFor(async () => {
const titleEl = container.querySelector("title");
expect(titleEl?.getAttribute("canonical")).toEqual(basicProps.canonical);
expect(titleEl?.getAttribute("description")).toEqual(basicProps.description);
expect(titleEl?.getAttribute("site_name")).toEqual(basicProps.siteName);
expect(titleEl?.getAttribute("image")).toContain("constructGenericImage");
});
});
test("Should render title with brand", async () => {
const { container } = render();
await waitFor(async () => {
const titleEl = container.querySelector("title");
expect(titleEl?.getAttribute("title")).toEqual(`${basicProps.title} | Cal.com`);
});
});
test("Should render title without brand", async () => {
const { container } = render();
await waitFor(async () => {
const titleEl = container.querySelector("title");
expect(titleEl?.getAttribute("title")).toEqual(`${basicProps.title}`);
});
});
test("Should render with app props", async () => {
const { container } = render();
await waitFor(async () => {
const titleEl = container.querySelector("title");
expect(titleEl?.getAttribute("image")).toContain("constructAppImage");
});
});
test("Should render with meeting props", async () => {
const { container } = render();
await waitFor(async () => {
const titleEl = container.querySelector("title");
expect(titleEl?.getAttribute("image")).toContain("constructMeetingImage");
});
});
});