Testing Radio Component Selection Behavior in gradio-app
This test suite validates the Radio component functionality in a Svelte application using Vitest and Testing Library. It ensures proper rendering, state management, and event handling for radio button groups.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
gradio-app/gradio
js/radio/Radio.test.ts
import { test, describe, assert, afterEach } from "vitest";
import { cleanup, render } from "@self/tootils";
import event from "@testing-library/user-event";
import Radio from "./Index.svelte";
describe("Radio", () => {
afterEach(() => cleanup());
const choices = [
["dog", "dog"],
["cat", "cat"],
["turtle", "turtle"]
] as [string, string][];
test("renders provided value", async () => {
const { getAllByRole, getByTestId } = await render(Radio, {
choices: choices,
value: "cat",
label: "Radio"
});
const cat_radio = getAllByRole("radio")[1];
expect(cat_radio).toBeChecked();
const radioButtons: HTMLOptionElement[] = getAllByRole(
"radio"
) as HTMLOptionElement[];
assert.equal(radioButtons.length, 3);
radioButtons.forEach((radioButton: HTMLOptionElement, index) => {
assert.equal(radioButton.value === choices[index][1], true);
});
});
test("should update the value when a radio is clicked", async () => {
const { getByDisplayValue, getAllByRole } = await render(Radio, {
choices: choices,
value: "cat",
label: "Radio"
});
const dog_radio = getAllByRole("radio")[0];
await event.click(dog_radio);
expect(dog_radio).toBeChecked();
const cat_radio = getAllByRole("radio")[1];
expect(cat_radio).not.toBeChecked();
await event.click(getByDisplayValue("turtle"));
await event.click(cat_radio);
expect(cat_radio).toBeChecked();
});
test("should dispatch the select event when clicks", async () => {
const { listen, getAllByTestId } = await render(Radio, {
choices: choices,
value: "cat",
label: "Radio"
});
const mock = listen("select");
await event.click(getAllByTestId("dog-radio-label")[0]);
expect(mock.callCount).toBe(1);
expect(mock.calls[0][0].detail.data.value).toEqual("dog");
});
test("when multiple radios are on the screen, they should not conflict", async () => {
const { container } = await render(Radio, {
choices: choices,
value: "cat",
label: "Radio"
});
const { getAllByLabelText } = await render(
Radio,
{
choices: choices,
value: "dog",
label: "Radio"
},
container
);
const items = getAllByLabelText("dog") as HTMLInputElement[];
expect([items[0].checked, items[1].checked]).toEqual([false, true]);
await event.click(items[0]);
expect([items[0].checked, items[1].checked]).toEqual([true, true]);
cleanup();
});
});