@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/).
175 lines (145 loc) • 3.83 kB
text/typescript
import { render, screen } from "@testing-library/vue";
import MtLink from "./mt-link.vue";
import { userEvent } from "@testing-library/user-event";
describe("mt-link", () => {
it("renders a link", async () => {
// ARRANGE
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
},
});
// ASSERT
expect(screen.getByRole("link")).toBeVisible();
expect(screen.getByRole("link")).toHaveAttribute("href", "https://www.shopware.com");
expect(screen.getByRole("link")).toHaveRole("link");
});
it("renders the correct slot content", async () => {
// ARRANGE
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
},
slots: {
default: "Shopware",
},
});
// ASSERT
expect(screen.getByRole("link")).toHaveTextContent("Shopware");
});
it("does not redirect when clicking on a disabled link", async () => {
// ARRANGE
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
disabled: true,
},
});
// ASSERT
expect(screen.getByRole("link")).not.toHaveAttribute("href", "https://www.shopware.com");
});
it("does not emit a click event when clicking on a disabled link", async () => {
// ARRANGE
const handler = vi.fn();
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
disabled: true,
onClick: handler,
},
});
// ACT
await userEvent.click(screen.getByRole("link"));
// ASSERT
expect(handler).not.toHaveBeenCalled();
});
it("announces the link as disabled when it is disabled", async () => {
// ARRANGE
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
disabled: true,
},
});
// ASSERT
expect(screen.getByRole("link")).toHaveAttribute("aria-disabled", "true");
});
it("is not possible to focus a disabled link", async () => {
// ARRANGE
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
disabled: true,
},
});
// ACT
await userEvent.tab();
// ASSERT
expect(screen.getByRole("link")).not.toHaveFocus();
});
it("renders as a custom component", async () => {
// ARRANGE
render(MtLink, {
props: {
as: "button",
},
});
// ASSERT
expect(screen.getByRole("button")).toBeVisible();
expect(screen.getByRole("button")).toHaveRole("button");
});
it("emits a click event when clicking on the link", async () => {
// ARRANGE
const handler = vi.fn();
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
onClick: handler,
},
});
// ACT
await userEvent.click(screen.getByRole("link"));
// ASSERT
expect(handler).toHaveBeenCalledOnce();
});
it("emits a focus event when focusing the link", async () => {
// ARRANGE
const handler = vi.fn();
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
// @ts-expect-error -- focus event gets added via prop fallthrough
onFocus: handler,
},
});
// ACT
await userEvent.tab();
// ASSERT
expect(handler).toHaveBeenCalledOnce();
});
it("emits a blur event when blurring the link", async () => {
// ARRANGE
const handler = vi.fn();
render(MtLink, {
props: {
as: "a",
to: "https://www.shopware.com",
// @ts-expect-error -- blur event gets added via prop fallthrough
onBlur: handler,
},
});
// ACT
await userEvent.tab();
await userEvent.tab();
// ASSERT
expect(handler).toHaveBeenCalledOnce();
});
});