import { render, screen, waitFor } from "@testing-library/react"; import React, { useRef } from "react"; import userEvent from "@testing-library/user-event"; import { expect } from "vitest"; import { Input } from ":/components/Forms/Input/index"; import { Button } from ":/components/Button"; describe("", () => { it("renders and can type", async () => { const user = userEvent.setup(); render(); const input: HTMLInputElement = screen.getByRole("textbox", { name: "First name", }); expect(input.value).toEqual(""); await user.type(input, "John"); expect(input.value).toEqual("John"); }); it("renders with default value and can type", async () => { const user = userEvent.setup(); render(); const input: HTMLInputElement = screen.getByRole("textbox", { name: "First name", }); expect(input.value).toEqual("John"); await user.clear(input); expect(input.value).toEqual(""); await user.type(input, "Paul"); expect(input.value).toEqual("Paul"); }); it("renders with moving label", async () => { const user = userEvent.setup(); render(
, ); const input: HTMLInputElement = screen.getByRole("textbox", { name: "First name", }); const input2: HTMLInputElement = screen.getByRole("textbox", { name: "Second name", }); const label = screen.getByText("First name"); expect(Array.from(label.classList)).toContain("placeholder"); // Clicking on the input should remove the placeholder class. await user.click(input); expect(Array.from(label.classList)).not.toContain("placeholder"); // Writing something should remove the placeholder class too. await user.type(input, "John"); expect(Array.from(label.classList)).not.toContain("placeholder"); // Clearing the input and focus out should add the placeholder class await user.clear(input); await user.click(input2); expect(Array.from(label.classList)).toContain("placeholder"); }); it("renders with state=success", async () => { render(); expect(document.querySelector(".c__field--success")).toBeInTheDocument(); expect( document.querySelector(".c__input__wrapper--success"), ).toBeInTheDocument(); }); it("renders with state=error", async () => { render(); expect(document.querySelector(".c__field--error")).toBeInTheDocument(); expect( document.querySelector(".c__input__wrapper--error"), ).toBeInTheDocument(); }); it("renders disabled", async () => { const user = userEvent.setup(); render(); const input: HTMLInputElement = screen.getByRole("textbox", { name: "First name", }); expect( document.querySelector(".c__input__wrapper--disabled"), ).toBeInTheDocument(); expect(input.value).toEqual(""); // Disabled inputs should not be able to type. await user.type(input, "John"); expect(input.value).toEqual(""); }); it("renders with left icon", async () => { render( apartment} />, ); expect(document.querySelector(".material-icons")).toBeInTheDocument(); }); it("renders with right icon", async () => { render( apartment} />, ); expect(document.querySelector(".material-icons")).toBeInTheDocument(); }); it("renders with text", async () => { render( apartment} text="Some text" />, ); screen.getByText("Some text"); }); it("renders with text items", async () => { render( apartment} textItems={[ "Text too long", "Wrong choice", "Must contain at least 9 characters, uppercase and digits", ]} />, ); expect( screen.getAllByRole("listitem").map((item) => item.textContent), ).toEqual([ "Text too long", "Wrong choice", "Must contain at least 9 characters, uppercase and digits", ]); }); it("renders with text and text right", async () => { render( apartment} rightText="Some text right" />, ); screen.getByText("Some text right"); }); it("renders with char counter", async () => { const user = userEvent.setup(); render(); const input: HTMLInputElement = screen.getByRole("textbox", { name: "First name", }); screen.getByText("0/15"); await user.type(input, "Jo"); screen.getByText("2/15"); await user.type(input, "hn"); screen.getByText("4/15"); await user.clear(input); screen.getByText("0/15"); }); it("forwards ref", async () => { const user = userEvent.setup(); const Wrapper = () => { const ref = useRef(null); return (
); }; render(); const input: HTMLInputElement = screen.getByRole("textbox", { name: "First name", }); expect(input).not.toHaveFocus(); await user.click(screen.getByRole("button", { name: "Focus" })); waitFor(() => expect(input).toHaveFocus()); }); it("works controlled", async () => { const Wrapper = () => { const [value, setValue] = React.useState("I am controlled"); return (
Value: {value}.
setValue(e.target.value)} />
); }; const user = userEvent.setup(); render(); const input: HTMLInputElement = screen.getByRole("textbox", { name: "First name", }); screen.getByText("Value: I am controlled."); await user.type(input, "John"); screen.getByText("Value: I am controlledJohn."); await user.clear(input); screen.getByText("Value: ."); }); });