@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/).
389 lines (317 loc) • 12.6 kB
text/typescript
import { mount } from "@vue/test-utils";
import MtPopover from "./mt-popover.vue";
import flushPromises from "flush-promises";
// mock resizeOvserver
global.ResizeObserver = class ResizeObserver {
observe() {
// do nothing
}
unobserve() {
// do nothing
}
disconnect() {
// do nothing
}
};
async function createWrapper(
{
slots,
disableInitialOpen,
}: {
disableInitialOpen?: boolean;
slots?: any;
} = {
slots: {},
disableInitialOpen: false,
},
) {
const wrapper = mount(MtPopover, {
slots: {
"popover-items__base": `
<div class="base-view">
<span>Base view content</span>
<span id="goToExampleView" @click="params.changeView('example')">Go to example view</span>
<span id="goToExampleWithAnotherChildView" @click="params.changeView('example_with_another_child')">Go to example with another child view</span>
</div>
`,
"popover-items__example": `
<div class="example-view">
<span>Example view content</span>
<span id="goToBaseView" @click="params.changeView('base')">Go to base view</span>
</div>
`,
"popover-items__example_with_another_child": `
<div class="example_with_another_child-view">
<span>Example with another child view content</span>
<span id="goToThirdLevelView" @click="params.changeView('example_third_level')">Go to third level view</span>
</div>
`,
"popover-items__example_third_level": `
<div class="example_third_level-view">
<span>Example with third level view content</span>
<span id="toToExampleWithAnotherChild" @click="params.changeView('example_with_another_child')">Go to example with another child view</span>
</div>
`,
trigger: `
<span
class="trigger-slot"
@click="params.toggleFloatingUi"
>
Trigger slot content
</span>`,
...slots,
},
props: {
title: "My default popover title",
childViews: [
{ name: "example", title: "Example view title" },
{
name: "example_with_another_child",
title: "Example view with another child title",
childViews: [{ name: "example_third_level", title: "Example third level view title" }],
},
],
},
attachTo: document.getElementById("appWrapper")!,
mocks: {},
});
if (!disableInitialOpen) {
// open the floating UI
await wrapper.find(".trigger-slot").trigger("click");
}
return wrapper;
}
describe("mt-popover-item", () => {
let wrapper: undefined | Awaited<ReturnType<typeof createWrapper>>;
// create app wrapper
let appWrapper = document.createElement("div");
appWrapper.setAttribute("id", "appWrapper");
document.body.appendChild(appWrapper);
beforeEach(async () => {
if (wrapper) {
await wrapper.unmount();
}
await flushPromises();
document.body.innerHTML = '<div id="app"></div>';
appWrapper = document.createElement("div");
appWrapper.setAttribute("id", "appWrapper");
document.body.appendChild(appWrapper);
});
it("should render the component", async () => {
wrapper = await createWrapper();
expect(wrapper.vm).toBeTruthy();
});
it("should render the trigger slot content", async () => {
wrapper = await createWrapper();
expect(wrapper.find(".trigger-slot").exists()).toBeTruthy();
expect(wrapper.find(".trigger-slot").text()).toBe("Trigger slot content");
});
it("should not render the trigger slot content when float is disabled", async () => {
wrapper = await createWrapper({
disableInitialOpen: true,
});
await wrapper.setProps({
disableFloat: true,
});
expect(wrapper.find(".trigger-slot").exists()).toBeFalsy();
});
it("should render the popover directly when disable float", async () => {
wrapper = await createWrapper({
slots: {},
disableInitialOpen: true,
});
await wrapper.setProps({
disableFloat: true,
});
expect(document.querySelectorAll(".mt-popover__content")).toHaveLength(1);
expect(wrapper.find(".mt-popover__content").text()).toContain("Base view content");
});
it("should open the floating UI with trigger click", async () => {
wrapper = await createWrapper({
slots: {},
disableInitialOpen: true,
});
expect(wrapper.find(".mt-popover__content").exists()).toBeFalsy();
await wrapper.find(".trigger-slot").trigger("click");
expect(document.querySelectorAll(".mt-popover__content")).toHaveLength(1);
});
it("should close the floating UI with trigger click", async () => {
wrapper = await createWrapper();
await flushPromises();
expect(document.querySelectorAll(".mt-popover__content")).toHaveLength(1);
await wrapper.find(".trigger-slot").trigger("click");
expect(document.querySelectorAll(".mt-popover__content")).toHaveLength(0);
});
it("should close the floating UI emit close event", async () => {
wrapper = await createWrapper();
expect(document.querySelectorAll(".mt-popover__content")).toHaveLength(1);
const MtFloatingUi = wrapper.findComponent({ name: "MtFloatingUi" });
MtFloatingUi.vm.onClickOutside(new MouseEvent("click"));
await wrapper.vm.$nextTick();
expect(document.querySelectorAll(".mt-popover__content")).toHaveLength(0);
});
it("should render the title", async () => {
wrapper = await createWrapper();
expect(document.querySelectorAll("h3")).toHaveLength(1);
expect(document.querySelector("h3")?.textContent).toBe("My default popover title");
});
it("should use changeView to switch to example view", async () => {
wrapper = await createWrapper();
// check content rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Base view content",
);
// go to example view
document.querySelector("#goToExampleView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check content rendering on example view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Example view content",
);
});
it("should use changeView to switch back to base view", async () => {
wrapper = await createWrapper();
// check content rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Base view content",
);
// go to example view
document.querySelector("#goToExampleView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check content rendering on example view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Example view content",
);
// go to example view
document.querySelector("#goToBaseView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check content rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Base view content",
);
});
it("should not render back button base view", async () => {
wrapper = await createWrapper();
expect(wrapper.find(".mt-popover__back-button").exists()).toBeFalsy();
});
it("should render back button on example view", async () => {
wrapper = await createWrapper();
// go to example view
document.querySelector("#goToExampleView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
expect(document.querySelectorAll(".mt-popover__back-button")).toHaveLength(1);
});
it("should use back button to switch back to base view", async () => {
wrapper = await createWrapper();
// check content rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Base view content",
);
// go to example view
document.querySelector("#goToExampleView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check content rendering on example view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Example view content",
);
// go to example view
document.querySelector(".mt-popover__back-button")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check content rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Base view content",
);
});
it("should render the title and content of base view", async () => {
wrapper = await createWrapper();
// check title rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"My default popover title",
);
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"Example view title",
);
// check content rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Base view content",
);
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"Example view content",
);
});
it("should render the title and content of example view", async () => {
wrapper = await createWrapper();
// go to example view
document.querySelector("#goToExampleView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check title rendering on example view
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"My default popover title",
);
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Example view title",
);
// check content rendering on example view
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"Base view content",
);
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Example view content",
);
});
it("should render the title and content of third level view", async () => {
wrapper = await createWrapper();
// go to example with another child view
document
.querySelector("#goToExampleWithAnotherChildView")
?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// go to third level view
document.querySelector("#goToThirdLevelView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check title rendering on third level view
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"My default popover title",
);
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"Example view title",
);
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Example third level view title",
);
// check content rendering on third level view
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"Base view content",
);
expect(document.querySelector(".mt-popover__content")?.textContent).not.toContain(
"Example view content",
);
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Example with third level view content",
);
});
it("should go back from third level view to base view with back button", async () => {
wrapper = await createWrapper();
// go to example with another child view
document
.querySelector("#goToExampleWithAnotherChildView")
?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// go to third level view
document.querySelector("#goToThirdLevelView")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// go back to base view with clicking back button twice
document.querySelector(".mt-popover__back-button")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
document.querySelector(".mt-popover__back-button")?.dispatchEvent(new MouseEvent("click"));
await flushPromises();
// check title rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"My default popover title",
);
// check content rendering on base view
expect(document.querySelector(".mt-popover__content")?.textContent).toContain(
"Base view content",
);
});
});