UNPKG

@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/).

173 lines (133 loc) 5.96 kB
import { within, userEvent } from "@storybook/test"; import { expect, fn } from "@storybook/test"; import { screen } from "@storybook/test"; import { waitUntil } from "../../../_internal/test-helper"; import meta, { type MtEntitySelectStory } from "./mt-entity-select.stories"; export default { ...meta, title: "Components/mt-entity-select/Interaction tests", tags: ["!autodocs"], }; export const VisualTestSingleSelection: MtEntitySelectStory = { name: "should select a single item", play: async ({ canvasElement, args }) => { const canvas = within(canvasElement); // wait for data to be loaded await canvas.findByText("Manufacturers"); // open the select by clicking on text input await canvas.getByRole("textbox").click(); // wait for options to appear await screen.findByText("Manufacturer 2 with a long name to test wrapping"); // click an option await userEvent.click(screen.getByText("Manufacturer 2 with a long name to test wrapping")); // check if the value has been updated expect(args["onUpdate:modelValue"]).toHaveBeenCalledWith("manufacturer-2"); }, }; export const VisualTestMultiSelection: MtEntitySelectStory = { name: "should select multiple items", args: { enableMultiSelection: true, }, play: async ({ canvasElement, args }) => { const canvas = within(canvasElement); // wait for data to be loaded await canvas.findByText("Manufacturers"); // open the select by clicking on text input await canvas.getByRole("textbox").click(); // wait for options to appear await screen.findByText("Manufacturer 2 with a long name to test wrapping"); // click a few options await userEvent.click(screen.getByText("Manufacturer 2 with a long name to test wrapping")); await userEvent.click(screen.getByText("Manufacturer 5 with a long name to test wrapping")); await userEvent.click(screen.getByText("Manufacturer 8 with a long name to test wrapping")); // check if the value has been updated expect(args["onUpdate:modelValue"]).toHaveBeenLastCalledWith([ "manufacturer-2", "manufacturer-5", "manufacturer-8", ]); // remove one selection const popover = await within( document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement, ); await userEvent.click(popover.getByText("Manufacturer 5 with a long name to test wrapping")); expect(args["onUpdate:modelValue"]).toHaveBeenLastCalledWith([ "manufacturer-2", "manufacturer-8", ]); }, }; export const VisualTestSearch: MtEntitySelectStory = { name: "should search for items", play: async ({ canvasElement, args }) => { const canvas = within(canvasElement); // wait for data to be loaded await canvas.findByText("Manufacturers"); // open the select and type a search term await userEvent.type(canvas.getByRole("textbox"), "Manufacturer 10"); // wait for search results await screen.findByTestId("mt-select-option--manufacturer-101"); // click on 101 await userEvent.click(screen.getByTestId("mt-select-option--manufacturer-101")); // check if the value has been updated expect(args["onUpdate:modelValue"]).toHaveBeenCalledWith("manufacturer-101"); // check if input placeholder contains the selected item expect(canvas.getByRole("textbox")).toHaveAttribute( "placeholder", "Manufacturer 101 with a long name to test wrapping", ); }, }; export const VisualTestSearchMultiple: MtEntitySelectStory = { name: "should search for items with multiple selection", args: { enableMultiSelection: true, }, play: async ({ canvasElement, args }) => { const canvas = within(canvasElement); // wait for data to be loaded await canvas.findByText("Manufacturers"); // open the select and type a search term await userEvent.type(canvas.getByRole("textbox"), "Manufacturer 10"); // wait for search results await screen.findByTestId("mt-select-option--manufacturer-101"); // click on 101 await userEvent.click(screen.getByTestId("mt-select-option--manufacturer-101")); // check if the value has been updated expect(args["onUpdate:modelValue"]).toHaveBeenCalledWith(["manufacturer-101"]); // Click outside to close the select await userEvent.click(document.body); // wait 400ms until the close animation is complete await new Promise((resolve) => setTimeout(resolve, 400)); // check if selected value has an option holder (li with data-id="manufacturer-10") const optionHolder = await canvas.findByText( "Manufacturer 101 with a long name to test wrapping", ); expect(optionHolder).toBeInTheDocument(); }, }; export const VisualTestPagination: MtEntitySelectStory = { name: "should paginate to load more items", play: async ({ canvasElement }) => { const canvas = within(canvasElement); // wait for data to be loaded await canvas.findByText("Manufacturers"); // open the select await userEvent.click(canvas.getByRole("textbox")); // wait for options to appear await screen.findByText("Manufacturer 5 with a long name to test wrapping"); // scroll to the bottom of the results list let resultsList = document.querySelector(".mt-select-result-list__content"); resultsList?.scrollTo(0, resultsList.scrollHeight); // wait for more options to be loaded await screen.findByText("Manufacturer 50 with a long name to test wrapping"); // scroll again to the bottom of the results list resultsList = document.querySelector(".mt-select-result-list__content"); resultsList?.scrollTo(0, resultsList.scrollHeight); // wait for more options to be loaded await screen.findByText("Manufacturer 99 with a long name to test wrapping"); // wait 500ms until the pagination is complete for snapshot await new Promise((resolve) => setTimeout(resolve, 500)); }, };