/* * Copyright 2023 Palantir Technologies, Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "@blueprintjs/test-commons/vitest"; import { Classes } from "../../common"; import { RadioGroup } from "../forms/radioGroup"; import { CheckboxCard } from "./checkboxCard"; import { RadioCard } from "./radioCard"; import { SwitchCard } from "./switchCard"; describe("ControlCard", () => { describe("SwitchCard", () => { it("should render switch control inside a card", () => { render(); const card = screen.getByRole("checkbox", { name: "Test Switch" }).closest(`.${Classes.CARD}`); expect(card).to.exist; expect(card).toHaveClass(Classes.CONTROL_CARD); }); it("should be end-aligned by default", () => { render(); const control = screen.getByRole("checkbox", { name: "Test Switch" }).closest(`.${Classes.CONTROL}`); expect(control).to.exist; expect(control).toHaveClass(Classes.ALIGN_RIGHT); }); it("should be start-aligned when alignIndicator is start", () => { render(); const control = screen.getByRole("checkbox", { name: "Test Switch" }).closest(`.${Classes.CONTROL}`); expect(control).to.exist; expect(control).toHaveClass(Classes.ALIGN_LEFT); }); it("should toggle switch state when clicked", async () => { const user = userEvent.setup(); const handleChange = vi.fn(); render(); const switchInput = screen.getByRole("checkbox", { name: "Test Switch" }); await user.click(switchInput); expect(handleChange).toHaveBeenCalledOnce(); }); it("should show as selected when checked", () => { render(); const card = screen.getByTestId("test-switch"); expect(card).toHaveClass(Classes.SELECTED); }); it("should not show selected state on card when showAsSelectedWhenChecked is false", () => { render( , ); const card = screen.getByTestId("test-switch"); expect(card).not.toHaveClass(Classes.SELECTED); }); }); describe("CheckboxCard", () => { it("should render checkbox control inside a card", () => { render(); const card = screen.getByRole("checkbox", { name: "Test Checkbox" }).closest(`.${Classes.CARD}`); expect(card).to.exist; expect(card).toHaveClass(Classes.CONTROL_CARD); }); it("should be start-aligned by default", () => { render(); const control = screen.getByRole("checkbox", { name: "Test Checkbox" }).closest(`.${Classes.CONTROL}`); expect(control).to.exist; expect(control).toHaveClass(Classes.ALIGN_LEFT); }); it("should be end-aligned when alignIndicator is end", () => { render(); const control = screen.getByRole("checkbox", { name: "Test Checkbox" }).closest(`.${Classes.CONTROL}`); expect(control).to.exist; expect(control).toHaveClass(Classes.ALIGN_RIGHT); }); it("should show as selected when checked", async () => { render(); const card = screen.getByRole("checkbox", { name: "Test Checkbox" }).closest(`.${Classes.CARD}`); expect(card).to.exist; expect(card).toHaveClass(Classes.SELECTED); }); it("should not show selected state on card when showAsSelectedWhenChecked is false", () => { render(); const card = screen.getByRole("checkbox", { name: "Test Checkbox" }).closest(`.${Classes.CARD}`); expect(card).to.exist; expect(card).not.toHaveClass(Classes.SELECTED); }); }); describe("RadioCard", () => { it("should render radio control inside a card", () => { render(); const card = screen.getByRole("radio", { name: "Test Radio" }).closest(`.${Classes.CARD}`); expect(card).to.exist; expect(card).toHaveClass(Classes.CONTROL_CARD); }); it("should be end-aligned by default", () => { render(); const control = screen.getByRole("radio", { name: "Test Radio" }).closest(`.${Classes.CONTROL}`); expect(control).to.exist; expect(control).toHaveClass(Classes.ALIGN_RIGHT); }); it("should be start-aligned when alignIndicator is start", () => { render(); const control = screen.getByRole("radio", { name: "Test Radio" }).closest(`.${Classes.CONTROL}`); expect(control).to.exist; expect(control).toHaveClass(Classes.ALIGN_LEFT); }); it("should show as selected when checked", () => { const onChange = vi.fn(); render( , ); const cardOne = screen.getByRole("radio", { name: "One" }).closest(`.${Classes.CARD}`); const cardTwo = screen.getByRole("radio", { name: "Two" }).closest(`.${Classes.CARD}`); expect(cardOne).toHaveClass(Classes.SELECTED); expect(cardTwo).not.toHaveClass(Classes.SELECTED); }); it("should not show selected state on card when showAsSelectedWhenChecked is false", () => { render(); const card = screen.getByRole("radio", { name: "Test Radio" }).closest(`.${Classes.CARD}`); expect(card).to.exist; expect(card).not.toHaveClass(Classes.SELECTED); }); it("should work within a RadioGroup", async () => { const user = userEvent.setup(); const changeSpy = vi.fn(); render( , ); const radioOne = screen.getByRole("radio", { name: "One" }); const radioTwo = screen.getByRole("radio", { name: "Two" }); await user.click(radioOne); await user.click(radioTwo); expect(changeSpy).toHaveBeenCalledTimes(2); }); }); });