import { render, screen } from "@testing-library/react";
import { describe, it, expect } from "vitest";
import Logo from "../../app/components/Logo";
describe("Logo Component", () => {
it("renders the logo with default props", () => {
render();
const logo = screen.getByRole("link", { name: /communityrule logo/i });
expect(logo).toBeInTheDocument();
expect(screen.getByText("CommunityRule")).toBeInTheDocument();
expect(screen.getByAltText("CommunityRule Logo Icon")).toBeInTheDocument();
});
it("renders with custom size variant", () => {
const { rerender } = render();
let logoDiv = screen.getByRole("link").querySelector("div");
expect(logoDiv).toHaveClass("h-[20.85px]");
rerender();
logoDiv = screen.getByRole("link").querySelector("div");
expect(logoDiv).toHaveClass("h-[28px]");
rerender();
logoDiv = screen.getByRole("link").querySelector("div");
expect(logoDiv).toHaveClass("h-[calc(40px*1.37)]");
});
it("renders without text when showText is false", () => {
render();
expect(screen.queryByText("CommunityRule")).not.toBeInTheDocument();
expect(screen.getByAltText("CommunityRule Logo Icon")).toBeInTheDocument();
});
it("applies proper hover effects", () => {
render();
const logoDiv = screen.getByRole("link").querySelector("div");
expect(logoDiv).toHaveClass("hover:scale-[1.02]", "transition-all");
});
it("applies proper accessibility attributes", () => {
render();
const logo = screen.getByRole("link");
expect(logo).toHaveAttribute("aria-label", "CommunityRule Logo");
expect(logo).toHaveAttribute("href", "/");
});
it("applies proper text styling for different sizes", () => {
const { rerender } = render();
let textElement = screen.getByText("CommunityRule");
expect(textElement).toHaveClass(
"text-[var(--color-content-inverse-primary)]"
);
rerender();
textElement = screen.getByText("CommunityRule");
expect(textElement).toHaveClass(
"text-[var(--color-content-default-primary)]"
);
});
it("applies proper icon sizing for different variants", () => {
const { rerender } = render();
let icon = screen.getByAltText("CommunityRule Logo Icon");
expect(icon).toHaveClass("w-[14.39px]", "h-[14.39px]");
rerender();
icon = screen.getByAltText("CommunityRule Logo Icon");
expect(icon).toHaveClass("w-[33.81px]", "h-[33.81px]");
});
it("applies brightness filter for home header variants", () => {
render();
const icon = screen.getByAltText("CommunityRule Logo Icon");
expect(icon).toHaveClass("filter", "brightness-0");
});
it("maintains proper spacing when text is hidden", () => {
render();
const logo = screen.getByRole("link");
// Should not have gap class when text is hidden
expect(logo.className).not.toContain("gap-[8.28px]");
});
it("applies proper font classes to text", () => {
render();
const textElement = screen.getByText("CommunityRule");
expect(textElement).toHaveClass("font-bricolage-grotesque", "font-normal");
});
it("applies proper icon attributes", () => {
render();
const icon = screen.getByAltText("CommunityRule Logo Icon");
expect(icon).toHaveAttribute("src", "/assets/Logo.svg");
expect(icon).toHaveAttribute("aria-hidden", "true");
});
it("handles all size variants correctly", () => {
const sizes = [
"default",
"homeHeaderXsmall",
"homeHeaderSm",
"homeHeaderMd",
"homeHeaderLg",
"homeHeaderXl",
"header",
"headerMd",
"headerLg",
"headerXl",
"footer",
"footerLg",
];
sizes.forEach((size) => {
const { unmount } = render();
const logo = screen.getByRole("link");
expect(logo).toBeInTheDocument();
unmount();
});
});
});