@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/).
305 lines (267 loc) • 6.61 kB
text/typescript
import { within, userEvent } from "@storybook/test";
import { expect } from "@storybook/test";
import { waitUntil } from "../../../_internal/test-helper";
import meta, { type MtTabsMeta, type MtTabsStory } from "./mt-tabs.stories";
const tabItems = [
{
label: "Item 1",
name: "item1",
},
{
label: "Item 2 very long",
name: "item2",
},
{
label: "Item 3",
name: "item3",
},
{
label: "Item 4 also very long",
name: "item4",
},
{
label: "Item 5",
name: "item5",
},
{
label: "Item 6",
name: "item6",
},
{
label: "Item 7",
name: "item7",
},
{
label: "Item 8 very long",
name: "item8",
},
{
label: "Item 9",
name: "item9",
},
{
label: "Item 10",
name: "item10",
},
{
label: "Item 11",
name: "item11",
},
{
label: "Item 12",
name: "item12",
},
{
label: "Item 13",
name: "item13",
},
{
label: "Item 14",
name: "item14",
},
{
label: "Item 15",
name: "item15",
},
{
label: "Item 16",
name: "item16",
},
{
label: "Item 17",
name: "item17",
},
];
export default {
...meta,
title: "Interaction Tests/Navigation/mt-tabs",
} as MtTabsMeta;
export const VisualTestRenderTabs: MtTabsStory = {
name: "Render tabs",
args: {
small: false,
defaultItem: "item2",
items: tabItems.slice(0, 2),
},
};
export const VisualTestRenderTabsVertical: MtTabsStory = {
name: "Render tabs vertical",
args: {
vertical: true,
small: true,
defaultItem: "item2",
items: tabItems.slice(0, 2),
},
};
export const VisualTestRenderTabsFullWidth: MtTabsStory = {
name: "Render tabs in small",
args: {
small: true,
defaultItem: "item2",
items: tabItems.slice(0, 2),
},
};
export const VisualTestRenderManyTabItems: MtTabsStory = {
name: "Render many tab items",
args: {
small: true,
defaultItem: "item2",
items: tabItems,
},
};
export const VisualTestRenderTabsWithError: MtTabsStory = {
name: "Render tabs with error",
args: {
small: true,
defaultItem: "item5",
items: [
...tabItems.slice(0, 4),
{
label: "Item with error",
name: "item5",
hasError: true,
},
],
},
};
export const VisualTestRenderContextTabWithError: MtTabsStory = {
name: "Render context tab with error",
args: {
small: true,
defaultItem: "itemWithError",
items: [
...tabItems,
{
label: "Item with error",
name: "itemWithError",
hasError: true,
},
],
},
};
export const VisualTestRenderContextTabWithActiveItem: MtTabsStory = {
name: "Render context tab with active item inside",
args: {
defaultItem: "item1",
small: true,
items: [
{
label: "Context tab test",
name: "contextTabTest",
},
...tabItems.slice(0, 10),
],
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
// wait until tab bar is loaded and context button gets rendered
await waitUntil(() => document.body.textContent?.includes("Context tab test"));
await waitUntil(() => document.querySelector(".mt-context-button__button"));
const button = canvas.getByRole("button");
await userEvent.click(button);
// Look inside the popover
const popover = within(
document.getElementsByClassName("mt-popover__content")[0] as HTMLElement,
);
const menuItem = popover.getAllByRole("tab");
const lastItem = menuItem[menuItem.length - 1];
await expect(lastItem).toHaveTextContent("Item 10");
await userEvent.click(lastItem);
await waitUntil(() => document.getElementsByClassName("mt-popover__content").length === 0);
expect(document.getElementsByClassName("mt-popover__content").length).toEqual(0);
},
};
export const VisualTestRenderTabsWithPositiveBadge: MtTabsStory = {
name: "Render tabs with positive badge",
args: {
small: true,
defaultItem: "badgeItem",
items: [
...tabItems.slice(0, 3),
{
label: "Item with positive badge",
name: "badgeItem",
badge: "positive",
},
...tabItems.slice(5),
],
},
};
export const VisualTestRenderTabsWithInfoBadge: MtTabsStory = {
name: "Render tabs with info badge",
args: {
small: true,
defaultItem: "badgeItem",
items: [
...tabItems.slice(0, 3),
{
label: "Item with info badge",
name: "badgeItem",
badge: "info",
},
...tabItems.slice(5),
],
},
};
export const VisualTestRenderTabsWithContextMenuBadge: MtTabsStory = {
name: "Render tabs with badge in context menu",
args: {
small: true,
defaultItem: "item5",
items: [
{
label: "Context tab test",
name: "contextTabTest",
},
...tabItems.slice(0, 8),
{
label: "Item with critical badge",
name: "badgeItem",
badge: "critical",
},
...tabItems.slice(9),
],
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
// wait until tab bar is loaded and context button gets rendered
await waitUntil(() => document.body.textContent?.includes("Context tab test"));
await waitUntil(() => document.querySelector("button"));
const button = canvas.getByRole("button");
await userEvent.click(button);
// Look inside the popover
const popover = within(
document.getElementsByClassName("mt-popover__content")[0] as HTMLElement,
);
const menuItem = popover.getAllByRole("tab");
await expect(menuItem[menuItem.length - 9]).toHaveTextContent("Item with critical badge");
},
};
export const VisualTestRenderTabsWithDisabledItem: MtTabsStory = {
name: "Render tabs with disabled item",
args: {
defaultItem: "item1",
items: [
...tabItems.slice(0, 4),
{
label: "Disabled item",
name: "item5",
disabled: true,
},
],
},
async play({ canvasElement }) {
const canvas = within(canvasElement);
const disabledTabItem = canvas.getByRole("tab", { name: /disabled/i });
expect(disabledTabItem).toBeDisabled();
await userEvent.tab();
await userEvent.tab();
await userEvent.tab();
await userEvent.tab();
await userEvent.tab();
await userEvent.tab();
expect(canvas.getByRole("tab", { name: /item 1/i })).toHaveFocus();
await userEvent.click(disabledTabItem);
expect(canvas.getByRole("tab", { name: /item 1/i })).toHaveAttribute("aria-selected", "true");
},
};