/* eslint-disable max-lines-per-function */
import Toggle, { Props } from "."
import { fireEvent, render, screen } from "tests"
describe("Toggle", () => {
let props: Props
beforeEach(() => {
props = {
checked: false,
disabled: false,
inputId: "toggle-id",
name: "toggle-name",
onChange: jest.fn()
}
})
it("renders with the correct initial state", () => {
render()
expect(screen.getByRole("switch")).toHaveAttribute("aria-checked", "false")
})
it("toggles the checked state when clicked", () => {
render()
fireEvent.click(screen.getByRole("switch"))
expect(props.onChange).toHaveBeenCalled()
})
it("does not trigger onChange when disabled", () => {
const disabledProps = { ...props, disabled: true }
render()
fireEvent.click(screen.getByRole("switch"))
expect(props.onChange).not.toHaveBeenCalled()
})
it("renders with the correct checked state", () => {
const checkedProps = { ...props, checked: true }
render()
expect(screen.getByRole("switch")).toHaveAttribute("aria-checked", "true")
})
it("can be toggled using the keyboard (Space key)", () => {
render()
fireEvent.keyDown(screen.getByRole("switch"), { code: "Space", key: " " })
expect(props.onChange).toHaveBeenCalled()
})
it("can be toggled using the keyboard (Enter key)", () => {
render()
fireEvent.keyDown(screen.getByRole("switch"), {
code: "Enter",
key: "Enter"
})
expect(props.onChange).toHaveBeenCalled()
})
it("does not toggle when pressing other keys", () => {
render()
fireEvent.keyDown(screen.getByRole("switch"), {
code: "ArrowRight",
key: "ArrowRight"
})
expect(props.onChange).not.toHaveBeenCalled()
})
})