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

323 lines (265 loc) 7.3 kB
import { userEvent } from "@testing-library/user-event"; import { render, screen } from "@testing-library/vue"; import { expect, describe, it, vi } from "vitest"; import MtTextarea from "./mt-textarea.vue"; describe("mt-textarea", () => { it("focuses the text area when clicking on the label", async () => { // ARRANGE render(MtTextarea, { props: { label: "Label", }, }); // ACT await userEvent.click(screen.getByText("Label")); // ASSERT expect(screen.getByRole("textbox")).toHaveFocus(); }); it("emits the changed value when the user types", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { "onUpdate:modelValue": handler, }, }); // ACT await userEvent.type(screen.getByRole("textbox"), "a"); // ASSERT expect(handler).toHaveBeenNthCalledWith(1, "a"); expect(screen.getByRole("textbox")).toHaveValue("a"); }); it("emits the changed value when the user moves focus to another element", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { onChange: handler, }, }); // ACT await userEvent.type(screen.getByRole("textbox"), "Shopware"); await userEvent.tab(); // ASSERT expect(handler).toHaveBeenNthCalledWith(1, "Shopware"); }); it("does not change the value when the textarea is disabled", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { disabled: true, "onUpdate:modelValue": handler, }, }); // ACT await userEvent.type(screen.getByRole("textbox"), "Shopware"); // ASSERT expect(handler).not.toHaveBeenCalled(); expect(screen.getByRole("textbox")).toHaveValue(""); expect(screen.getByRole("textbox")).toBeDisabled(); }); it("shows the specified placholder", async () => { // ARRANGE render(MtTextarea, { props: { placeholder: "Placeholder", }, }); // ASSERT expect(screen.getByRole("textbox")).toHaveAttribute("placeholder", "Placeholder"); }); it("shows an error to the user", async () => { // ARRANGE render(MtTextarea, { props: { error: { detail: "Error", }, }, }); // ASSERT expect(screen.getByText("Error")).toBeVisible(); }); it.each([ ["", "0/10"], ["Hello", "5/10"], ])( "displays an indicator on how many characters the input field has", async (modelValue, result) => { // ARRANGE render(MtTextarea, { props: { maxLength: 10, modelValue, }, }); // ASSERT expect(screen.getByText(result)).toBeVisible(); }, ); it("does not allow typing more characters than the specified max length", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { maxLength: 4, "onUpdate:modelValue": handler, }, }); // ACT await userEvent.type(screen.getByRole("textbox"), "Shopware"); // ASSERT expect(screen.getByRole("textbox")).toHaveValue("Shop"); expect(handler).toHaveBeenNthCalledWith(4, "Shop"); }); it("can be a required field", async () => { // ARRANGE render(MtTextarea, { props: { required: true, }, }); // ASSERT expect(screen.getByRole("textbox")).toBeRequired(); }); it("displays a hint", async () => { // ARRANGE render(MtTextarea, { slots: { hint: "Hint", }, }); // ASSERT expect(screen.getByText("Hint")).toBeVisible(); }); it("displays a helptext", async () => { // ARRANGE render(MtTextarea, { props: { helpText: "Helptext", }, }); // ACT await userEvent.tab(); // ASSERT expect(screen.getByRole("tooltip")).toBeVisible(); expect(screen.getByRole("tooltip")).toHaveTextContent("Helptext"); }); it("displays no helptext when none is specified", async () => { // ARRANGE render(MtTextarea); // ASSERT expect(screen.queryByRole("tooltip")).not.toBeInTheDocument(); }); it("has the specified name value", async () => { // ARRANGE render(MtTextarea, { props: { name: "some-random-name", }, }); // ASSERT expect(screen.getByRole("textbox")).toHaveAttribute("name", "some-random-name"); }); it("emits an event when inheritance got removed", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { label: "Some label", isInherited: true, isInheritanceField: true, "onInheritance-remove": handler, }, }); // ACT await userEvent.click(screen.getByRole("button", { name: "Unlink inheritance" })); // ASSERT expect(handler).toHaveBeenCalledOnce(); }); it("emits an event when inheritance got restored", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { label: "Some label", isInherited: false, isInheritanceField: true, "onInheritance-restore": handler, }, }); // ACT await userEvent.click(screen.getByRole("button", { name: "Link inheritance" })); // ASSERT expect(handler).toHaveBeenCalledOnce(); }); it("is not possible to edit value of textarea with linked inheritance", async () => { // ARRANGE render(MtTextarea, { props: { label: "Some label", isInherited: true, isInheritanceField: true, }, }); // ACT await userEvent.type(screen.getByRole("textbox"), "Shopware"); // ASSERT expect(screen.getByRole("textbox")).toHaveValue(""); expect(screen.getByRole("textbox")).toBeDisabled(); }); it("is possible to edit value of textarea with unlinked inheritance", async () => { // ARRANGE render(MtTextarea, { props: { label: "Some label", isInherited: false, isInheritanceField: true, }, }); // ACT await userEvent.type(screen.getByRole("textbox"), "Shopware"); // ASSERT expect(screen.getByRole("textbox")).toHaveValue("Shopware"); expect(screen.getByRole("textbox")).toBeEnabled(); }); it("emits a focus event when the textarea is focused", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { onFocus: handler, }, }); // ACT await userEvent.click(screen.getByRole("textbox")); // ASSERT expect(handler).toHaveBeenCalledOnce(); }); it("emits a blur event when the textarea is blurred", async () => { // ARRANGE const handler = vi.fn(); render(MtTextarea, { props: { onBlur: handler, }, }); // ACT await userEvent.click(screen.getByRole("textbox")); await userEvent.tab(); // ASSERT expect(handler).toHaveBeenCalledOnce(); }); it("disables the textarea when the inheritance is linked", async () => { // ARRANGE render(MtTextarea, { props: { isInheritanceField: true, isInherited: true, }, }); // ASSERT expect(screen.getByRole("textbox")).toBeDisabled(); }); });