@shopware-ag/meteor-component-library
Version:
The meteor component library is a Vue component library developed by Shopware. It is based on the [Meteor Design System](https://shopware.design/).
162 lines (147 loc) • 4.6 kB
text/typescript
import { render, screen } from "@testing-library/vue";
import { vi } from "vitest";
import MtRadioGroupRoot from "./mt-radio-group-root.vue";
import MtRadioGroupList from "./mt-radio-group-list.vue";
import MtRadioGroupItem from "./mt-radio-group-item.vue";
import { userEvent } from "@testing-library/user-event";
vi.mock("vue-i18n", async () => {
const actual = await vi.importActual("vue-i18n");
return {
...actual,
useI18n: () => ({
t: (key: string) => key,
}),
};
});
describe("mt-radio-group", () => {
it("renders all radio options", async () => {
// ARRANGE
await render(MtRadioGroupRoot, {
props: {
label: "Choose an option",
},
slots: {
default: `
<MtRadioGroupList>
<MtRadioGroupItem id="option-1" value="value1" label="Option 1" />
<MtRadioGroupItem id="option-2" value="value2" label="Option 2" />
<MtRadioGroupItem id="option-3" value="value3" label="Option 3" />
</MtRadioGroupList>
`,
},
global: {
components: { MtRadioGroupList, MtRadioGroupItem },
},
});
// ASSERT
expect(screen.getByRole("radiogroup")).toBeVisible();
expect(screen.getAllByRole("radio")).toHaveLength(3);
});
it("shows the label when provided", async () => {
// ARRANGE
await render(MtRadioGroupRoot, {
props: {
label: "Choose an option",
},
slots: {
default: `
<MtRadioGroupList>
<MtRadioGroupItem id="option-1" value="value1" label="Option 1" />
<MtRadioGroupItem id="option-2" value="value2" label="Option 2" />
<MtRadioGroupItem id="option-3" value="value3" label="Option 3" />
</MtRadioGroupList>
`,
},
global: {
components: { MtRadioGroupList, MtRadioGroupItem },
},
});
// ASSERT
expect(screen.getByText("Choose an option")).toBeVisible();
});
it("clicks on a radio option", async () => {
// ARRANGE
await render(MtRadioGroupRoot, {
props: {
label: "Choose an option",
},
slots: {
default: `
<MtRadioGroupList>
<MtRadioGroupItem id="option-1" value="value1" label="Option 1" />
<MtRadioGroupItem id="option-2" value="value2" label="Option 2" />
<MtRadioGroupItem id="option-3" value="value3" label="Option 3" />
</MtRadioGroupList>
`,
},
global: {
components: { MtRadioGroupList, MtRadioGroupItem },
},
});
// ACT
await userEvent.click(screen.getByRole("radio", { name: "Option 1" }));
// ASSERT
expect(screen.getByLabelText("Option 1")).toBeChecked();
});
it("shows the correct option as checked based on modelValue", async () => {
// ARRANGE
await render(MtRadioGroupRoot, {
props: {
modelValue: "value2",
},
slots: {
default: `
<MtRadioGroupList>
<MtRadioGroupItem id="option-1" value="value1" label="Option 1" />
<MtRadioGroupItem id="option-2" value="value2" label="Option 2" />
<MtRadioGroupItem id="option-3" value="value3" label="Option 3" />
</MtRadioGroupList>
`,
},
global: {
components: { MtRadioGroupList, MtRadioGroupItem },
},
});
// ASSERT
expect(screen.getByLabelText("Option 1")).not.toBeChecked();
expect(screen.getByLabelText("Option 2")).toBeChecked();
expect(screen.getByLabelText("Option 3")).not.toBeChecked();
});
it("can be disabled", async () => {
// ARRANGE
await render(MtRadioGroupRoot, {
props: {
label: "Choose an option",
disabled: true,
},
slots: {
default: `
<MtRadioGroupList>
<MtRadioGroupItem id="option-1" value="value1" label="Option 1" />
<MtRadioGroupItem id="option-2" value="value2" label="Option 2" />
<MtRadioGroupItem id="option-3" value="value3" label="Option 3" />
</MtRadioGroupList>
`,
},
global: {
components: { MtRadioGroupList, MtRadioGroupItem },
},
});
// ASSERT
const radios = screen.getAllByRole("radio");
radios.forEach((radio) => {
expect(radio).toBeDisabled();
});
});
it("displays an error message when provided", async () => {
// ARRANGE
await render(MtRadioGroupRoot, {
props: {
label: "Choose an option",
error: { detail: "Please select an option" },
},
});
// ASSERT
expect(screen.getByText("Please select an option")).toBeVisible();
});
});