/* 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)
})
})
})