import React from "react";
import { FullImageCard } from "./index";
import { render, screen } from "@testing-library/react";
jest.mock("@shared/components/next-image", () => ({
NextImage: ({ src, alt, width, height, className }: any) => (
),
}));
jest.mock("@shared/components/text", () => ({
Text: ({ as: Tag = "span", children, className }: any) => (
{children}
),
}));
jest.mock("@shared/components/link", () => ({
Link: ({ children, href, className, tabIndex, target, ...rest }: any) => (
{children}
),
}));
jest.mock("../../button", () => ({
Button: ({ children, linkClassName, buttonLabel }: any) => (
),
}));
jest.mock("@shared/utils", () => ({
cx: (...args: any[]) => args.filter(Boolean).join(" "),
}));
describe("FullImageCard", () => {
const defaultCard = {
title: "Card Title",
description: "Card description",
image: { href: "/image.jpg", title: "Card Image", width: 400, height: 280 },
};
describe("Rendering", () => {
it("renders the section element", () => {
const { container } = render();
expect(container.querySelector("section")).toBeInTheDocument();
});
it("renders title", () => {
render();
expect(screen.getByText("Card Title")).toBeInTheDocument();
});
it("renders description", () => {
render();
expect(screen.getByText("Card description")).toBeInTheDocument();
});
it("renders image when provided", () => {
render();
const img = screen.getByTestId("next-image");
expect(img).toHaveAttribute("src", "/image.jpg");
});
it("does not render image when not provided", () => {
render();
expect(screen.queryByTestId("next-image")).not.toBeInTheDocument();
});
it("does not render title when not provided", () => {
render();
expect(screen.queryByRole("heading")).not.toBeInTheDocument();
});
it("does not render description when not provided", () => {
render();
expect(screen.queryByText("Card description")).not.toBeInTheDocument();
});
});
describe("Caption", () => {
it("renders caption when provided", () => {
const card = { ...defaultCard, caption: "A note" };
render();
expect(screen.getByText("A note")).toBeInTheDocument();
});
it("does not render caption when not provided", () => {
render();
expect(screen.queryByText("A note")).not.toBeInTheDocument();
});
});
describe("CTA", () => {
it("renders CTA button when cta is provided", () => {
const card = {
...defaultCard,
cta: { buttonLabel: "Learn More", href: "/learn" },
};
render();
expect(screen.getByTestId("cta-button")).toBeInTheDocument();
});
it("does not render CTA when not provided", () => {
render();
expect(screen.queryByTestId("cta-button")).not.toBeInTheDocument();
});
it("wraps title in link when cta href is present", () => {
const card = {
...defaultCard,
cta: { buttonLabel: "Click", href: "/click" },
};
render();
const titleLink = screen.getByText("Card Title").closest("a");
expect(titleLink).toHaveAttribute("href", "/click");
});
it("wraps image in link when cta href is present", () => {
const card = {
...defaultCard,
cta: { buttonLabel: "Click", href: "/click" },
};
render();
const imgLink = screen.getByTestId("next-image").closest("a");
expect(imgLink).toHaveAttribute("href", "/click");
});
});
describe("Link prop", () => {
it("uses link href for image and title when no cta", () => {
const card = {
...defaultCard,
link: { href: "/link-target", target: "_blank" as const },
};
render();
const imgLink = screen.getByTestId("next-image").closest("a");
expect(imgLink).toHaveAttribute("href", "/link-target");
});
});
describe("Layout props", () => {
it("applies lgWidth class", () => {
const { container } = render(
);
expect(container.querySelector("section")?.className).toContain(
"lg:w-1/3"
);
});
it("applies mdWidth class", () => {
const { container } = render(
);
expect(container.querySelector("section")?.className).toContain(
"md:w-1/2"
);
});
it("applies shadow by default", () => {
const { container } = render();
expect(container.querySelector("section")?.className).toContain(
"shadow-card"
);
});
it("does not apply shadow when shadow is false", () => {
const card = { ...defaultCard, shadow: false };
const { container } = render();
expect(container.querySelector("section")?.className).not.toContain(
"shadow-card"
);
});
it("applies custom className", () => {
const card = { ...defaultCard, className: "my-class" };
const { container } = render();
expect(container.querySelector("section")?.className).toContain(
"my-class"
);
});
it("applies anchorId as section id", () => {
const card = { ...defaultCard, anchorId: "my-card" };
const { container } = render();
expect(container.querySelector("section")).toHaveAttribute(
"id",
"my-card"
);
});
it("uses default anchorId FullImageCard", () => {
const { container } = render();
expect(container.querySelector("section")).toHaveAttribute(
"id",
"FullImageCard"
);
});
});
});