@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/).
1,125 lines (915 loc) • 28.7 kB
text/typescript
import { fireEvent, render, screen } from "@testing-library/vue";
import MtTooltip from "./mt-tooltip.vue";
import { userEvent } from "@testing-library/user-event";
import { flushPromises } from "@vue/test-utils";
import MtButton from "@/components/form/mt-button/mt-button.vue";
describe("mt-tooltip", () => {
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
vi.runOnlyPendingTimers();
vi.useRealTimers();
});
it("does not show the tooltip by default", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
// ACT & ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
expect(screen.getByRole("button", { name: "Open tooltip" })).toHaveAccessibleDescription(
"Tooltip",
);
});
it("shows the tooltip when focusing the element", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
it("announces the content of the tooltip trough the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
// ASSERT
expect(screen.getByRole("button", { name: "Open tooltip" })).toHaveAccessibleDescription(
"Tooltip",
);
});
it(
"hides the tooltip when focusing out of the element",
async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
await user.tab();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
},
{
// TODO: JSDOM does not include targetElement, the browser does though
skip: true,
},
);
it("does read out the tooltip content when focusing the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
// wait until everything has rendered
await flushPromises();
// ACT & ASSERT
expect(screen.getByRole("button", { name: "Open tooltip" })).toHaveAccessibleDescription(
"Tooltip",
);
expect(screen.getByRole("button", { name: "Open tooltip" })).toHaveAttribute(
"aria-describedby",
);
});
it("does not show the tooltip before the delay has passed when hovering over the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 200,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("closes the tooltip when pressing the escape key", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
// ACT
await user.keyboard("{Escape}");
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("closes the tooltip when pressing the space key", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
// ACT
await user.keyboard(" ");
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("closes the tooltip when pressing the enter key", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
// ACT
await user.keyboard("{Enter}");
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("does not immediately close the tooltip when unhovering the trigger element", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 0,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
it("shows the tooltip when hovering over the trigger element", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 0,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
it("hides the tooltip when hovering out of the trigger element", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("does not hide the tooltip when hovering out of the trigger but the trigger is still focused via the keyboard", async () => {
// ARRANGE
render(MtTooltip, {
props: { content: "Tooltip" },
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
// ASSERT
expect(screen.getByRole("tooltip")).toBeInTheDocument();
});
it(
"does not hide the tooltip when clicking on the tooltip",
async () => {
// ARRANGE
render(MtTooltip, {
props: { content: "Tooltip" },
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
await user.click(screen.getByRole("tooltip"));
// ASSERT
expect(screen.getByRole("tooltip")).toBeInTheDocument();
},
{
// TODO: JSDOM does not include targetElement, the browser does though
skip: true,
},
);
it("always shows the tooltip when quickly unhovering and then hovering again", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 200,
hideDelayDurationInMs: 100,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(200);
await flushPromises();
// ACT
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeInTheDocument();
});
it("never shows the tooltip when quickly hovering and then unhovering again", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 300,
hideDelayDurationInMs: 100,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(200);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("keeps showing the tooltip when hovering over the tooltip and the trigger is not focused", async () => {
// ARRANGE
render(MtTooltip, {
props: {
delayDurationInMs: 300,
hideDelayDurationInMs: 100,
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(300);
await flushPromises();
// ACT
await user.hover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip")).toBeInTheDocument();
});
it("hides the tooltip when hovering out of the tooltip and the trigger is not focused", async () => {
// ARRANGE
render(MtTooltip, {
props: {
delayDurationInMs: 300,
hideDelayDurationInMs: 100,
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(300);
await flushPromises();
await user.hover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(100);
await flushPromises();
// ACT
await user.unhover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip")).not.toBeInTheDocument();
});
it("shows the tooltip when focusing the trigger element and the cursor leaves the tooltip", async () => {
// ARRANGE
render(MtTooltip, {
props: {
delayDurationInMs: 300,
hideDelayDurationInMs: 100,
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
await user.hover(screen.getByRole("tooltip"));
// ACT
await user.unhover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip")).toBeInTheDocument();
});
it("always shows the tooltip when moving from the tooltip to the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
delayDurationInMs: 300,
hideDelayDurationInMs: 100,
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(300);
await flushPromises();
// ACT
await user.hover(screen.getByRole("tooltip"));
await flushPromises();
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip")).toBeInTheDocument();
});
it("always shows the tooltip when quickly unhovering the tooltip and the hovering it again before it closes", async () => {
// ARRANGE
render(MtTooltip, {
props: {
delayDurationInMs: 300,
hideDelayDurationInMs: 100,
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(300);
await flushPromises();
await user.hover(screen.getByRole("tooltip"));
await flushPromises();
// ACT
await user.unhover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(50);
await flushPromises();
await user.hover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(50);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip")).toBeInTheDocument();
});
it("does not show the tooltip when clicking on the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.click(screen.getByRole("button", { name: "Open tooltip" }));
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("closes the tooltip when clicking on the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
// ACT
await user.click(screen.getByRole("button", { name: "Open tooltip" }));
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("does not show the tooltip when closing it by clicking on the trigger and then moving the mouse away", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await flushPromises();
await user.click(screen.getByRole("button", { name: "Open tooltip" }));
// we need fireEvent here, in the browser the mouseOver gets triggered again
// we can't do that with userEvent
await fireEvent.mouseOver(screen.getByRole("button", { name: "Open tooltip" }));
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("does not show the tooltip when clicking on the trigger before the tooltip is visible", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
await user.click(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("does not show the tooltip when focusing the trigger and then closing it by clicking on the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
// We need to use fireEvent, user.hover does not trigger the mouseover event
await fireEvent.mouseOver(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
await user.click(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
await flushPromises();
// wait for mouseover timeout
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("does not hide the tooltip before the delay when unhovering the tooltip when hovered the trigger before", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await flushPromises();
await user.hover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(25);
await user.unhover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(25);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).toBeInTheDocument();
});
it("does not hide the tooltip before the delay when unhovering the trigger when hovered the tooltip before", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await flushPromises();
await user.hover(screen.getByRole("tooltip"));
vi.advanceTimersByTime(25);
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(25);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).toBeInTheDocument();
});
it.each([" ", "{Enter}", "{Escape}"])(
'closes the tooltip when pressing "%s" and the trigger is hovered and focused',
async (key) => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
// ACT
await user.keyboard(key);
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
},
);
it("keeps the tooltip closed when focusing the trigger, hovering over it and quickly pressing the escape key", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
// ACT
await user.keyboard("{Escape}");
vi.advanceTimersByTime(50);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("shows the tooltip when focusing the trigger, closing it by pressing the escape key and then hovering the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
await user.keyboard("{Escape}");
// ACT
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeInTheDocument();
});
it("closes the tooltip when focusing the trigger, closing it by pressing the escape key, hovering and then unhovering the trigger", async () => {
// ARRANGE
render(MtTooltip, {
props: {
content: "Tooltip",
delayDurationInMs: 100,
hideDelayDurationInMs: 50,
},
slots: {
default: "<button v-bind='params'>Open tooltip</button>",
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
await user.tab();
await user.keyboard("{Escape}");
await user.hover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(100);
await flushPromises();
// ACT
await user.unhover(screen.getByRole("button", { name: "Open tooltip" }));
vi.advanceTimersByTime(50);
await flushPromises();
// ASSERT
expect(screen.queryByRole("tooltip", { name: "Tooltip" })).not.toBeInTheDocument();
});
it("opens the tooltip when tabbing on a disabled button", async () => {
// ARRANGE
render({
template: `
<mt-tooltip content="Tooltip">
<template
<mt-button v-bind="params" disabled>Focus to open tooltip</mt-button>
</template>
</mt-tooltip>
`,
components: {
MtTooltip,
MtButton,
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
it("does not perform an action when clicking on the disabled button", async () => {
// ARRANGE
const handler = vi.fn();
render({
template: `
<mt-tooltip content="Tooltip">
<template
<mt-button v-bind="params" @click="handler" disabled>Click to open tooltip</mt-button>
</template>
</mt-tooltip>`,
components: {
MtTooltip,
MtButton,
},
setup: () => ({ handler }),
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.click(screen.getByRole("button"));
// ASSERT
expect(handler).not.toHaveBeenCalled();
});
it.each([" ", "{Enter}"])(
'does not perform an action when pressing "%s" on the disabled button',
async (key) => {
// ARRANGE
const handler = vi.fn();
render({
template: `
<mt-tooltip content="Tooltip">
<template
<mt-button v-bind="params" @click="handler" disabled>Click to open tooltip</mt-button>
</template>
</mt-tooltip>`,
components: {
MtTooltip,
MtButton,
},
setup: () => ({ handler }),
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.keyboard(key);
// ASSERT
expect(handler).not.toHaveBeenCalled();
},
);
it("shows the tooltip when hovering over the disabled button", async () => {
// ARRANGE
render({
template: `
<mt-tooltip content="Tooltip" delayDurationInMs="100" hideDelayDurationInMs="50">
<template
<mt-button v-bind="params" disabled>Hover to open tooltip</mt-button>
</template>
</mt-tooltip>`,
components: {
MtTooltip,
MtButton,
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("button"));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
it("does show a tooltip when focusing a disabled link button", async () => {
// ARRANGE
render({
template: `
<mt-tooltip content="Tooltip">
<template
<mt-button v-bind="params" disabled link="https://www.shopware.com">Focus to open tooltip</mt-button>
</template>
</mt-tooltip>
`,
components: {
MtTooltip,
MtButton,
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
// ARRANGE
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
it("shows a tooltip when focusing a loading link button", async () => {
// ARRANGE
render({
template: `
<mt-tooltip content="Tooltip">
<template
<mt-button v-bind="params" isLoading link="https://www.shopware.com">Focus to open tooltip</mt-button>
</template>
</mt-tooltip>
`,
components: {
MtTooltip,
MtButton,
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.tab();
// ARRANGE
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
it("shows the tooltip when hovering over the disabled link button", async () => {
// ARRANGE
render({
template: `
<mt-tooltip content="Tooltip" delayDurationInMs="100" hideDelayDurationInMs="50">
<template
<mt-button v-bind="params" link="https://www.shopware.com" disabled>Hover to open tooltip</mt-button>
</template>
</mt-tooltip>`,
components: {
MtTooltip,
MtButton,
},
});
const user = userEvent.setup({
advanceTimers: vi.advanceTimersByTime,
});
// ACT
await user.hover(screen.getByRole("link"));
vi.advanceTimersByTime(100);
await flushPromises();
// ASSERT
expect(screen.getByRole("tooltip", { name: "Tooltip" })).toBeVisible();
});
});