/* eslint-disable formatjs/no-literal-string-in-jsx */ import { describe, expect, it, vi, afterEach } from "vitest" import { render, screen, cleanup, fireEvent } from "@testing-library/react" import userEvent from "@testing-library/user-event" import { ChipButton } from "./ChipButton" afterEach(() => { cleanup() }) describe("ChipButton", () => { describe("rendering", () => { it("renders as a button element", () => { render(Click me) const button = screen.getByRole("button", { name: "Click me" }) expect(button).toBeTruthy() expect(button.tagName).toBe("BUTTON") }) it("renders children content", () => { render(Button Content) expect(screen.getByText("Button Content")).toBeTruthy() }) it("renders with multiple children", () => { render( Icon Label ) expect(screen.getByText("Icon")).toBeTruthy() expect(screen.getByText("Label")).toBeTruthy() }) }) describe("variants", () => { it("renders Default variant", () => { render(Default) expect(screen.getByRole("button", { name: "Default" })).toBeTruthy() }) it("renders Outlined variant", () => { render(Outlined) expect(screen.getByRole("button", { name: "Outlined" })).toBeTruthy() }) it("renders FilterRounded variant", () => { render(Filter) expect(screen.getByRole("button", { name: "Filter" })).toBeTruthy() }) }) describe("selected state", () => { it("renders with selected=false by default", () => { render(Not Selected) expect(screen.getByRole("button", { name: "Not Selected" })).toBeTruthy() }) it("renders with selected=true", () => { render(Selected) expect(screen.getByRole("button", { name: "Selected" })).toBeTruthy() }) }) describe("sizes", () => { it("renders Medium size", () => { render(Medium) expect(screen.getByRole("button", { name: "Medium" })).toBeTruthy() }) it("renders Large size (default)", () => { render(Large) expect(screen.getByRole("button", { name: "Large" })).toBeTruthy() }) }) describe("props", () => { it("applies custom className", () => { render(Button) const button = screen.getByRole("button", { name: "Button" }) expect(button.className).toContain("custom-class") }) it("can be disabled", () => { render(Disabled) const button = screen.getByRole("button", { name: "Disabled" }) expect(button).toHaveProperty("disabled", true) }) }) describe("interactions", () => { it("calls onPress when clicked", () => { const onPress = vi.fn() render(Click me) // React Aria Components Button uses onPress which listens to click events fireEvent.click(screen.getByRole("button", { name: "Click me" })) expect(onPress).toHaveBeenCalledTimes(1) }) it("does not call onPress when disabled", () => { const onPress = vi.fn() render( Disabled ) fireEvent.click(screen.getByRole("button", { name: "Disabled" })) expect(onPress).not.toHaveBeenCalled() }) }) describe("keyboard navigation", () => { it("is focusable via keyboard", async () => { const user = userEvent.setup() render(Focusable) const button = screen.getByRole("button", { name: "Focusable" }) await user.tab() expect(document.activeElement).toBe(button) }) it("can be activated with Enter key", async () => { const onPress = vi.fn() const user = userEvent.setup() render(Press Enter) screen.getByRole("button", { name: "Press Enter" }) await user.tab() await user.keyboard("{Enter}") expect(onPress).toHaveBeenCalledTimes(1) }) it("can be activated with Space key", async () => { const onPress = vi.fn() const user = userEvent.setup() render(Press Space) screen.getByRole("button", { name: "Press Space" }) await user.tab() await user.keyboard(" ") expect(onPress).toHaveBeenCalledTimes(1) }) }) })