@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/).
916 lines (773 loc) • 28.7 kB
text/typescript
import { within, userEvent } from "@storybook/test";
import { expect } from "@storybook/test";
import { waitUntil } from "../../../_internal/test-helper";
import { screen } from "@storybook/test";
import meta, { type MtSelectMeta, type MtSelectStory } from "./mt-select.stories";
export default {
...meta,
title: "Components/mt-select/Interaction tests",
tags: ["!autodocs"],
} as MtSelectMeta;
export const TestRemovalOfSelectionByList: MtSelectStory = {
name: "Should remove selections through selection list",
args: {
modelValue: ["a", "b", "d"],
enableMultiSelection: true,
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("textbox"));
const popover = within(
document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement,
);
await userEvent.click(popover.getByTestId("mt-select-option--a"));
expect(args.change).toHaveBeenCalledWith(["b", "d"]);
},
};
export const TestRemoveSelectionByResultItem: MtSelectStory = {
name: "Should remove selection through result item",
args: {
modelValue: ["a", "b", "d"],
enableMultiSelection: true,
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getAllByTestId("dismiss-label")[0]);
expect(args.change).toHaveBeenCalledWith(["b", "d"]);
},
};
export const TestClearSelections: MtSelectStory = {
name: "Should clear selections",
args: {
modelValue: ["a", "b", "d"],
enableMultiSelection: true,
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByTestId("select-clear-button"));
expect(args.change).toHaveBeenCalledWith([]);
},
};
export const VisualTestSingleSelection: MtSelectStory = {
name: "Should single select",
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "A");
await new Promise((resolve) => setTimeout(resolve, 300));
let popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--a"));
await userEvent.click(popover.getByTestId("mt-select-option--a"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 1,
value: "a",
label: "Option A",
});
expect(args.change).toHaveBeenCalledWith("a");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option A");
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "F");
await new Promise((resolve) => setTimeout(resolve, 300));
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--f"));
await userEvent.click(popover.getByTestId("mt-select-option--f"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 6,
value: "f",
label: "Option F",
});
expect(args.change).toHaveBeenCalledWith("f");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option F");
// Only 'FF' is selected
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "FF");
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--ff"));
await new Promise((resolve) => setTimeout(resolve, 200));
await userEvent.click(popover.getByTestId("mt-select-option--ff"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 7,
value: "ff",
label: "Option FF",
});
expect(args.change).toHaveBeenCalledWith("ff");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option FF");
},
};
export const VisualTestSingleSelectionOptionAsValue: MtSelectStory = {
name: "Should single select using option as value",
args: {
valueProperty: "",
},
play: async ({ canvasElement, args }) => {
function findByHighlightText(text: string) {
return (_, element) => {
const isHighlightText = element?.classList.contains("mt-highlight-text");
return element?.textContent === text && isHighlightText;
};
}
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "A");
await new Promise((resolve) => setTimeout(resolve, 300));
let popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByText(findByHighlightText("Option A")));
await userEvent.click(popover.getByText(findByHighlightText("Option A")));
expect(args.change).toHaveBeenCalledWith({
id: 1,
value: "a",
label: "Option A",
});
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option A");
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "F");
await new Promise((resolve) => setTimeout(resolve, 300));
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByText(findByHighlightText("Option F")));
await userEvent.click(popover.getByText(findByHighlightText("Option F")));
expect(args.change).toHaveBeenCalledWith({
id: 6,
value: "f",
label: "Option F",
});
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option F");
// Only 'FF' is selected
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "FF");
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByText(findByHighlightText("Option FF")));
await new Promise((resolve) => setTimeout(resolve, 200));
await userEvent.click(popover.getByText(findByHighlightText("Option FF")));
expect(args.change).toHaveBeenCalledWith({
id: 7,
value: "ff",
label: "Option FF",
});
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option FF");
},
};
export const VisualTestSingleSelectionSmall: MtSelectStory = {
name: "Should single select in small",
args: {
small: true,
options: [
{
id: 1,
label: "A very long A",
value: "a",
},
{
id: 2,
label: "A very long B",
value: "b",
},
{
id: 3,
label: "A very long C",
value: "c",
},
{
id: 6,
label: "A very long F",
value: "f",
},
{
id: 7,
label: "A very long FF",
value: "ff",
},
{
id: 8,
label: "A very long long text",
value: "Longer value text",
},
],
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "A");
await new Promise((resolve) => setTimeout(resolve, 300));
let popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--a"));
await userEvent.click(popover.getByTestId("mt-select-option--a"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 1,
value: "a",
label: "A very long A",
});
expect(args.change).toHaveBeenCalledWith("a");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("A very long A");
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "F");
await new Promise((resolve) => setTimeout(resolve, 300));
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--f"));
await userEvent.click(popover.getByTestId("mt-select-option--f"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 6,
value: "f",
label: "A very long F",
});
expect(args.change).toHaveBeenCalledWith("f");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("A very long F");
// Only 'FF' is selected
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "FF");
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--ff"));
await new Promise((resolve) => setTimeout(resolve, 200));
await userEvent.click(popover.getByTestId("mt-select-option--ff"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 7,
value: "ff",
label: "A very long FF",
});
expect(args.change).toHaveBeenCalledWith("ff");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("A very long FF");
},
};
export const VisualTestSingleSelectionLongInSmallWidth: MtSelectStory = {
name: "Should single select long option in small width",
args: {
_wrapperWidth: "200px",
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "A");
await new Promise((resolve) => setTimeout(resolve, 300));
let popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--a"));
await userEvent.click(popover.getByTestId("mt-select-option--a"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 1,
value: "a",
label: "Option A",
});
expect(args.change).toHaveBeenCalledWith("a");
await new Promise((resolve) => setTimeout(resolve, 300));
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option A");
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "F");
await new Promise((resolve) => setTimeout(resolve, 300));
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--f"));
await userEvent.click(popover.getByTestId("mt-select-option--f"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 6,
value: "f",
label: "Option F",
});
expect(args.change).toHaveBeenCalledWith("f");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option F");
// Only 'FF' is selected
await userEvent.click(canvas.getByRole("textbox"));
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "FF");
popover = within(document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement);
await waitUntil(() => popover.getByTestId("mt-select-option--ff"));
await new Promise((resolve) => setTimeout(resolve, 200));
await userEvent.click(popover.getByTestId("mt-select-option--ff"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 7,
value: "ff",
label: "Option FF",
});
expect(args.change).toHaveBeenCalledWith("ff");
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option FF");
// Click outside to close popover
await userEvent.click(canvas.getByText("hidden"));
},
};
export const VisualTestMultiSelect: MtSelectStory = {
name: "Should multi select",
args: {
modelValue: undefined,
enableMultiSelection: true,
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
// open selection
await userEvent.click(canvas.getByRole("textbox"));
const popover = within(
document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement,
);
await userEvent.click(popover.getByTestId("mt-select-option--a"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 1,
value: "a",
label: "Option A",
});
expect(args.change).toHaveBeenCalledWith(["a"]);
await userEvent.click(popover.getByTestId("mt-select-option--b"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 2,
value: "b",
label: "Option B",
});
expect(args.change).toHaveBeenCalledWith(["a", "b"]);
await userEvent.click(popover.getByTestId("mt-select-option--c"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 3,
value: "c",
label: "Option C",
});
expect(args.change).toHaveBeenCalledWith(["a", "b", "c"]);
await userEvent.click(popover.getByTestId("mt-select-option--e"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 5,
value: "e",
label: "Option E",
});
expect(args.change).toHaveBeenCalledWith(["a", "b", "c", "e"]);
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("");
},
};
export const VisualTestMultiSelectOptionAsValue: MtSelectStory = {
name: "Should multi select using option as value",
args: {
modelValue: undefined,
enableMultiSelection: true,
valueProperty: "",
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
// open selection
await userEvent.click(canvas.getByRole("textbox"));
const popover = within(
document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement,
);
await userEvent.click(popover.getByText("Option A"));
expect(args.change).toHaveBeenCalledWith([
{
id: 1,
value: "a",
label: "Option A",
},
]);
await userEvent.click(popover.getByText("Option B"));
expect(args.change).toHaveBeenCalledWith([
{
id: 1,
value: "a",
label: "Option A",
},
{
id: 2,
value: "b",
label: "Option B",
},
]);
await userEvent.click(popover.getByText("Option C"));
expect(args.change).toHaveBeenCalledWith([
{
id: 1,
value: "a",
label: "Option A",
},
{
id: 2,
value: "b",
label: "Option B",
},
{
id: 3,
value: "c",
label: "Option C",
},
]);
await userEvent.click(popover.getByText("Option E"));
expect(args.change).toHaveBeenCalledWith([
{
id: 1,
value: "a",
label: "Option A",
},
{
id: 2,
value: "b",
label: "Option B",
},
{
id: 3,
value: "c",
label: "Option C",
},
{
id: 5,
value: "e",
label: "Option E",
},
]);
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("");
},
};
export const VisualTestMultiSelectWithInitialValue: MtSelectStory = {
name: "Should multi select with initial value",
args: {
modelValue: "a",
enableMultiSelection: true,
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
// open selection
await userEvent.click(canvas.getByRole("textbox"));
const popover = within(
document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement,
);
await userEvent.click(popover.getByTestId("mt-select-option--b"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 2,
value: "b",
label: "Option B",
});
expect(args.change).toHaveBeenCalledWith(["a", "b"]);
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("");
},
};
export const VisualTestPrefix: MtSelectStory = {
name: "Should display prefix",
args: {
prefix: "prefix",
},
play: ({ canvasElement, args }) => {
const canvas = within(canvasElement);
expect(canvas.getByText(args.prefix)).toBeDefined();
},
};
export const VisualTestSuffix: MtSelectStory = {
name: "Should display suffix",
args: {
suffix: "suffix",
},
play: ({ canvasElement, args }) => {
const canvas = within(canvasElement);
expect(canvas.getByText(args.suffix)).toBeDefined();
},
};
export const VisualTestPlaceholder: MtSelectStory = {
name: "Should display placeholder",
args: {
placeholder: "Select an option",
modelValue: undefined,
},
play: ({ canvasElement, args }) => {
const canvas = within(canvasElement);
expect(canvas.getAllByPlaceholderText(args.placeholder!)).toBeDefined();
},
};
export const VisualTestPlaceholderMulti: MtSelectStory = {
name: "Should display placeholder in multi select",
args: {
placeholder: "Select an option",
modelValue: undefined,
enableMultiSelection: true,
},
play: ({ canvasElement, args }) => {
const canvas = within(canvasElement);
expect(canvas.getAllByPlaceholderText(args.placeholder!)).toBeDefined();
},
};
export const VisualTestHint: MtSelectStory = {
name: "Should display hint",
args: {
hint: "hint",
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await waitUntil(() => {
// Check if input item contains "Option B"
const selectionListItem = document.querySelector(
".mt-select-selection-list__input",
) as HTMLInputElement;
return selectionListItem?.value === "Option B";
});
expect(canvas.getByText(args.hint)).toBeDefined();
},
};
export const VisualTestDisabled: MtSelectStory = {
name: "Should disable",
args: {
disabled: true,
modelValue: ["a", "b", "d"],
enableMultiSelection: true,
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("textbox"));
const popover = document.querySelector(".mt-popover-deprecated__wrapper");
expect(popover).toBe(null);
},
};
export const VisualTestDisabledSingleOption: MtSelectStory = {
name: "Should disable a single option",
args: {
modelValue: ["a", "c"],
options: [
{ id: 1, label: "Option A", value: "a", disabled: false },
{ id: 2, label: "Option B", value: "b", disabled: true },
{ id: 3, label: "Option C", value: "c", disabled: false },
],
enableMultiSelection: true,
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByRole("textbox"));
const popover = document.querySelector(".mt-popover-deprecated__wrapper");
expect(popover).toBeVisible();
// Check if option A and C are enabled, option B is disabled
const optionA = document.querySelector('[data-testid="mt-select-option--a"]');
const optionB = document.querySelector('[data-testid="mt-select-option--b"]');
const optionC = document.querySelector('[data-testid="mt-select-option--c"]');
expect(optionA).toBeVisible();
expect(optionA).toHaveAttribute("aria-disabled", "false");
expect(optionB).toBeVisible();
expect(optionB).toHaveAttribute("aria-disabled", "true");
expect(optionC).toBeVisible();
expect(optionC).toHaveAttribute("aria-disabled", "false");
},
};
export const VisualTestError: MtSelectStory = {
name: "Should display error",
args: {
error: {
code: 500,
detail: "Error while saving!",
},
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await waitUntil(() => {
// Check if input item contains "Option B"
const selectionListItem = document.querySelector(
".mt-select-selection-list__input",
) as HTMLInputElement;
return selectionListItem?.value === "Option B";
});
expect(canvas.getByText(args.error.detail)).toBeDefined();
},
};
export const VisualTestHighlightSearchTerm: MtSelectStory = {
name: "Should highlight search term",
args: {
enableMultiSelection: true,
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await userEvent.type(canvas.getByRole("textbox"), "A");
// wait until only one result is rendered
await waitUntil(() => document.getElementsByClassName("mt-select-result").length === 1);
// emulate arrow up key press
await userEvent.keyboard("{ArrowUp}");
// wait until "mt-select-result" has "is--active" class
await waitUntil(() => {
const result = document.querySelector(".mt-select-result");
return result?.classList.contains("is--active");
});
const popover = within(
document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement,
);
// Option A is separated in different elements. This methods get the combined instance.
expect(
popover.getByText((content, element) => {
const hasText = (element: HTMLElement) => element.textContent === "Option A";
const elementHasText = hasText(element as HTMLElement);
const childrenDontHaveText = Array.from(element?.children || []).every(
(child) => !hasText(child as HTMLElement),
);
return elementHasText && childrenDontHaveText;
}),
).toBeDefined();
},
};
export const VisualTestInherited: MtSelectStory = {
name: "Should trigger inheritance-remove event",
args: {
label: "Inherited",
isInheritanceField: true,
isInherited: true,
},
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await userEvent.click(canvas.getByTestId("mt-inheritance-switch-icon"));
expect(args.inheritanceRemove).toHaveBeenCalledWith();
},
};
export const VisualTestEnsureSingleSelectionWithoutLoadMore: MtSelectStory = {
name: "Should not show load more",
play: async ({ canvasElement, args }) => {
const canvas = within(canvasElement);
await waitUntil(() => {
// Check if input item contains "Option B"
const selectionListItem = document.querySelector(
".mt-select-selection-list__input",
) as HTMLInputElement;
return selectionListItem?.value === "Option B";
});
await userEvent.clear(canvas.getByRole("textbox"));
await userEvent.type(canvas.getByRole("textbox"), "Option long text");
await waitUntil(() => {
// Check if highlight text contains the search term
const highlight = document.querySelector(".mt-highlight-text__highlight");
return highlight?.textContent === "Option long text";
});
const popover = within(
document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement,
);
await userEvent.click(popover.getByTestId("mt-select-option--Longer value text"));
expect(args.itemAdd).toHaveBeenCalledWith({
id: 8,
label: "Option long text",
value: "Longer value text",
});
expect(args.change).toHaveBeenCalledWith("Longer value text");
// Click outside to trigger blur
await userEvent.click(canvas.getByText("hidden"));
expect((canvas.getByRole("textbox") as HTMLInputElement).value).toBe("Option long text");
expect(canvas.queryByText("+12")).toBeNull();
},
};
export const VisualTestEnsureCorrectMultiSelectionWrapping: MtSelectStory = {
name: "Should wrap multi selection correctly",
args: {
enableMultiSelection: true,
options: [
{
id: 1,
label: "This is a very long option A with some text",
value: "a",
},
{
id: 2,
label: "This is a very long option B with some text",
value: "b",
},
{
id: 3,
label: "This is a very long option C with some text",
value: "c",
},
{
id: 4,
label: "This is a very long option D with some text",
value: "d",
},
{
id: 5,
label: "This is a very long option E with some text",
value: "e",
},
{
id: 6,
label: "This is a very long option F with some text",
value: "f",
},
{
id: 7,
label: "This is a very long option G with some text",
value: "g",
},
],
modelValue: ["a", "b", "c", "d", "e", "f", "g"],
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
const loadMoreButton = canvas.getByText("+2");
await userEvent.click(loadMoreButton);
},
};
export const VisualTestEnsureSelectionOpensViaIndicators: MtSelectStory = {
name: "Should open selection via indicators",
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await waitUntil(() => {
// Check if input item contains "Option B"
const selectionListItem = document.querySelector(
".mt-select-selection-list__input",
) as HTMLInputElement;
return selectionListItem?.value === "Option B";
});
// open selection via indicator
await userEvent.click(canvas.getByTestId("mt-select__select-indicator"));
// selection should open
const popover = within(
document.querySelector(".mt-popover-deprecated__wrapper") as HTMLElement,
);
await waitUntil(() => popover.getByTestId("mt-select-option--a"));
// close selection via indicator
await userEvent.click(canvas.getByTestId("mt-select__select-indicator"));
expect(document.querySelector(".mt-popover-deprecated__wrapper")).toBeNull();
},
};
export const VisualTestMultipleSelectsOnOnePage: MtSelectStory = {
name: "Should close other selects when opening a new one",
args: {
_secondSelect: true,
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
// Open the second select below the first one
const secondSelect = canvas.getAllByRole("textbox").at(1);
expect(secondSelect).toBeDefined();
// @ts-ignore - secondSelect is a HTMLElement
await userEvent.click(secondSelect);
// Open the primary select above the second one
const primary = canvas.getAllByRole("textbox").at(0);
expect(primary).toBeDefined();
// @ts-ignore - primary is a HTMLElement
await userEvent.click(primary);
},
};
export const VisualTestPlaceholderBehavior: MtSelectStory = {
name: "Should show placeholder when alwaysShowPlaceholder is true",
args: {
placeholder: "Select an option",
modelValue: undefined,
enableMultiSelection: true,
alwaysShowPlaceholder: true,
},
play: ({ canvasElement, args }) => {
const canvas = within(canvasElement);
expect(canvas.getAllByPlaceholderText(args.placeholder!)).toBeDefined();
},
};
export const VisualTestPlaceholderBehaviorFalse: MtSelectStory = {
name: "Should not show placeholder when alwaysShowPlaceholder is false",
args: {
placeholder: "Select an option",
modelValue: undefined,
enableMultiSelection: true,
alwaysShowPlaceholder: false,
},
play: ({ canvasElement, args }) => {
const canvas = within(canvasElement);
expect(canvas.queryByPlaceholderText(args.placeholder!)).toBeNull();
},
};