import { fireEvent, render, screen } from "@testing-library/react"; import React from "react"; import { describe, expect, test, vi } from "vitest"; import { Checkbox, CheckboxGroup } from "."; const firstArgumentOfFirstCall = (fn: ReturnType) => fn.mock.calls[0][0]; test("checkbox group chains onChange calls", async () => { const onGroupChange = vi.fn(); const onChange = vi.fn(); const value = "Checkbox value"; const label = "My pretty label"; render( {label} , ); fireEvent.click(screen.getByLabelText(label)); expect(onGroupChange).toHaveBeenCalledTimes(1); expect(onGroupChange).toHaveBeenCalledWith([value]); expect(onChange).toHaveBeenCalledTimes(1); expect(firstArgumentOfFirstCall(onChange).target.checked).toBe(true); }); describe("Checkbox handles controlled-state correctly", () => { const CheckboxComponent = ({ onChange = () => null, value }) => ( label1 label2 ); test("Checkbox is still checked after click when controlled", async () => { render(); fireEvent.click(screen.getByLabelText("label1")); fireEvent.click(screen.getByLabelText("label2")); expect((screen.getByLabelText("label1") as HTMLInputElement).checked).toBe( true, ); expect((screen.getByLabelText("label2") as HTMLInputElement).checked).toBe( true, ); }); test("onChange called with expected values", async () => { const onGroupChange = vi.fn(); render( , ); fireEvent.click(screen.getByLabelText("label1")); expect(onGroupChange).toHaveBeenLastCalledWith(["value2"]); fireEvent.click(screen.getByLabelText("label2")); expect(onGroupChange).toHaveBeenLastCalledWith(["value1"]); }); test("Checkboxes updates after value-prop change", () => { const { rerender } = render(); expect((screen.getByLabelText("label1") as HTMLInputElement).checked).toBe( false, ); expect((screen.getByLabelText("label2") as HTMLInputElement).checked).toBe( false, ); rerender(); expect((screen.getByLabelText("label1") as HTMLInputElement).checked).toBe( true, ); expect((screen.getByLabelText("label2") as HTMLInputElement).checked).toBe( true, ); }); });