import "@testing-library/jest-dom";
import React from "react";
import { CtaCallout } from "./index";
import { CtaCalloutProps } from "./types";
import { render, screen } from "@testing-library/react";
jest.mock("@shared/components/text", () => ({
Text: ({ children, as, ...props }: any) => {
const Tag = as || "span";
return {children};
},
}));
jest.mock("@shared/contentful/blocks/button", () => ({
Button: (props: any) => (
),
}));
describe("CtaCallout", () => {
const defaultProps: CtaCalloutProps = {
title: "Get Started Today",
subTitle: "Best Internet Plans",
description:
Choose the plan that works for you.
,
button: { buttonLabel: "Shop Now", href: "/shop" },
background: "white",
color: "dark",
contentAlignment: "center",
descriptionAlignment: "center",
};
it("renders the component", () => {
const { container } = render();
expect(container.firstChild).toBeInTheDocument();
});
it("renders title as h2 by default", () => {
render();
const title = screen.getByText("Get Started Today");
expect(title.tagName).toBe("H2");
});
it("renders title as h1 when enableHeading is true", () => {
render();
const title = screen.getByText("Get Started Today");
expect(title.tagName).toBe("H1");
});
it("renders subtitle as h3", () => {
render();
const subtitle = screen.getByText("Best Internet Plans");
expect(subtitle.tagName).toBe("H3");
});
it("renders description", () => {
render();
expect(
screen.getByText("Choose the plan that works for you.")
).toBeInTheDocument();
});
it("renders the button", () => {
render();
expect(screen.getByTestId("cta-button")).toBeInTheDocument();
});
it("does not render title when not provided", () => {
render();
expect(screen.queryByText("Get Started Today")).not.toBeInTheDocument();
});
it("does not render subtitle when not provided", () => {
render();
expect(screen.queryByText("Best Internet Plans")).not.toBeInTheDocument();
});
it("does not render description when not provided", () => {
render();
expect(
screen.queryByText("Choose the plan that works for you.")
).not.toBeInTheDocument();
});
describe("background colors", () => {
it("applies white background class", () => {
const { container } = render(
);
expect(container.firstChild).toHaveClass("bg-bg");
});
it("applies navy background class", () => {
const { container } = render(
);
expect(container.firstChild).toHaveClass("bg-bg-fill-inverse");
});
it("applies blue background class", () => {
const { container } = render(
);
expect(container.firstChild).toHaveClass("bg-bg-fill-brand");
});
it("applies green background class", () => {
const { container } = render(
);
expect(container.firstChild).toHaveClass("bg-bg-fill-success");
});
it("applies purple background class", () => {
const { container } = render(
);
expect(container.firstChild).toHaveClass("bg-bg-fill-brand-tertiary");
});
it("applies yellow background class", () => {
const { container } = render(
);
expect(container.firstChild).toHaveClass("bg-bg-fill-brand-accent");
});
});
describe("text colors", () => {
it("applies dark text color", () => {
const { container } = render(
);
const inner = container.querySelector(".flex.flex-col");
expect(inner?.className).toContain("text-text");
});
it("applies light text color", () => {
const { container } = render(
);
const inner = container.querySelector(".flex.flex-col");
expect(inner?.className).toContain("text-text-inverse");
});
});
describe("alignment", () => {
it("applies content alignment to title", () => {
render();
const title = screen.getByText("Get Started Today");
expect(title.className).toContain("text-left");
});
it("applies content alignment to subtitle", () => {
render();
const subtitle = screen.getByText("Best Internet Plans");
expect(subtitle.className).toContain("text-right");
});
it("applies description alignment", () => {
render();
const descWrapper = screen
.getByText("Choose the plan that works for you.")
.closest("div");
expect(descWrapper?.className).toContain("text-left");
});
});
describe("maxWidth", () => {
it("applies max-w-120 when maxWidth is true (default)", () => {
const { container } = render();
const inner = container.querySelector(".flex.flex-col");
expect(inner?.className).toContain("max-w-120");
expect(inner?.className).toContain("mx-auto");
});
it("does not apply max-w-120 when maxWidth is false", () => {
const { container } = render(
);
const inner = container.querySelector(".flex.flex-col");
expect(inner?.className).not.toContain("max-w-120");
});
});
describe("button props", () => {
it("passes button props to Button component", () => {
render();
const button = screen.getByTestId("cta-button");
expect(button).toHaveAttribute("data-href", "/shop");
});
it("passes size prop with base large", () => {
render();
const button = screen.getByTestId("cta-button");
expect(button.dataset.size).toContain("large");
});
it("passes onModalButtonClick to Button", () => {
const onModalButtonClick = jest.fn();
render(
);
const button = screen.getByTestId("cta-button");
expect(button).toBeInTheDocument();
});
it("passes renderCheckPlans to Button", () => {
const renderCheckPlans = jest.fn();
render(
);
const button = screen.getByTestId("cta-button");
expect(button).toBeInTheDocument();
});
});
describe("section rendering", () => {
it("has component-container class", () => {
const { container } = render();
expect(container.firstChild).toHaveClass("component-container");
});
it("has correct padding classes", () => {
const { container } = render();
expect(container.firstChild).toHaveClass("px-5");
expect(container.firstChild).toHaveClass("py-16");
});
it("button container has flex and justify-center", () => {
render();
const buttonWrapper = screen.getByTestId("cta-button").parentElement;
expect(buttonWrapper?.className).toContain("flex");
expect(buttonWrapper?.className).toContain("justify-center");
});
});
});