mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-14 18:01:06 +00:00
As identified in #2131, `focus` and `blur` events should be forwarded to the underlying `RadioButton` element.
127 lines
3.7 KiB
TypeScript
127 lines
3.7 KiB
TypeScript
import { render, screen } from "@testing-library/svelte";
|
|
import { user } from "../setup-tests";
|
|
import RadioButton from "./RadioButton.test.svelte";
|
|
import RadioButtonCustom from "./RadioButtonCustom.test.svelte";
|
|
|
|
describe("RadioButton", () => {
|
|
it("should render with default props", () => {
|
|
render(RadioButton);
|
|
|
|
const input = screen.getByRole("radio");
|
|
expect(input).toBeInTheDocument();
|
|
expect(input).toHaveAttribute("name", "test-group");
|
|
expect(input).toHaveAttribute("value", "");
|
|
expect(input).not.toBeChecked();
|
|
expect(screen.getByText("Option 1")).toBeInTheDocument();
|
|
});
|
|
|
|
it("should handle checked state", () => {
|
|
render(RadioButton, { props: { checked: true } });
|
|
|
|
expect(screen.getByRole("radio")).toBeChecked();
|
|
});
|
|
|
|
it("should handle disabled state", () => {
|
|
render(RadioButton, { props: { disabled: true } });
|
|
|
|
expect(screen.getByRole("radio")).toBeDisabled();
|
|
});
|
|
|
|
it("should handle required state", () => {
|
|
render(RadioButton, { props: { required: true } });
|
|
|
|
expect(screen.getByRole("radio")).toHaveAttribute("required");
|
|
});
|
|
|
|
it("should handle label position", () => {
|
|
render(RadioButton, { props: { labelPosition: "left" } });
|
|
|
|
expect(
|
|
screen.getByText("Option 1").closest(".bx--radio-button-wrapper"),
|
|
).toHaveClass("bx--radio-button-wrapper--label-left");
|
|
});
|
|
|
|
it("should handle hidden label", () => {
|
|
render(RadioButton, { props: { hideLabel: true } });
|
|
|
|
expect(screen.getByText("Option 1")).toHaveClass("bx--visually-hidden");
|
|
});
|
|
|
|
it("should handle custom id", () => {
|
|
render(RadioButton, { props: { id: "custom-id" } });
|
|
|
|
expect(screen.getByRole("radio")).toHaveAttribute("id", "custom-id");
|
|
|
|
const radioButton = screen
|
|
.getByText("Option 1")
|
|
.closest(".bx--radio-button-wrapper");
|
|
assert(radioButton);
|
|
expect(radioButton.querySelector("label")).toHaveAttribute(
|
|
"for",
|
|
"custom-id",
|
|
);
|
|
});
|
|
|
|
it("should handle custom name", () => {
|
|
render(RadioButton, { props: { name: "custom-name" } });
|
|
|
|
expect(screen.getByRole("radio")).toHaveAttribute("name", "custom-name");
|
|
});
|
|
|
|
it("should handle custom value", () => {
|
|
render(RadioButton, { props: { value: "custom-value" } });
|
|
|
|
expect(screen.getByRole("radio")).toHaveAttribute("value", "custom-value");
|
|
});
|
|
|
|
it("should handle custom slots", () => {
|
|
render(RadioButtonCustom);
|
|
|
|
expect(screen.getByText("Custom Label Text")).toBeInTheDocument();
|
|
});
|
|
|
|
it("should handle change event", async () => {
|
|
const consoleLog = vi.spyOn(console, "log");
|
|
render(RadioButton);
|
|
|
|
const input = screen.getByRole("radio");
|
|
await user.click(input);
|
|
|
|
expect(input).toBeChecked();
|
|
expect(consoleLog).toHaveBeenCalledWith("change");
|
|
});
|
|
|
|
it("should handle focus and blur events", async () => {
|
|
const consoleLog = vi.spyOn(console, "log");
|
|
render(RadioButton);
|
|
|
|
const input = screen.getByRole("radio");
|
|
await user.tab();
|
|
expect(input).toHaveFocus();
|
|
expect(consoleLog).toHaveBeenCalledWith("focus");
|
|
|
|
await user.tab();
|
|
expect(input).not.toHaveFocus();
|
|
expect(consoleLog).toHaveBeenCalledWith("blur");
|
|
});
|
|
|
|
it("should handle disabled state with events", async () => {
|
|
render(RadioButton, { props: { disabled: true } });
|
|
|
|
const input = screen.getByRole("radio");
|
|
await user.click(input);
|
|
expect(input).not.toBeChecked();
|
|
});
|
|
|
|
it("should handle required state with form validation", () => {
|
|
render(RadioButton, { props: { required: true } });
|
|
|
|
expect(screen.getByRole("radio")).toHaveAttribute("required");
|
|
});
|
|
|
|
it("should handle label text slot", () => {
|
|
render(RadioButtonCustom);
|
|
|
|
expect(screen.getByText("Custom Label Text").tagName).toBe("SPAN");
|
|
});
|
|
});
|