import React from "react"; import { screen, waitFor } from "@testing-library/react"; import { createCustomRenderer } from "test/test-utils"; import userEvent from "@testing-library/user-event"; import CreateTeamModal from "./CreateTeamModal"; describe("CreateTeamModal", () => { const defaultProps = { onCancel: jest.fn(), onSubmit: jest.fn(), backendValidators: {}, isUpdatingTeams: false, }; const render = createCustomRenderer(); beforeEach(() => { jest.clearAllMocks(); }); it("renders the modal with the create button disabled initially", () => { render(); const createButton = screen.getByRole("button", { name: "Create" }); expect(createButton).toBeDisabled(); }); it("enables the create button when a valid name is entered", async () => { render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, "Engineering"); const createButton = screen.getByRole("button", { name: "Create" }); expect(createButton).toBeEnabled(); }); it("keeps the create button disabled when only spaces are entered", async () => { render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, " "); const createButton = screen.getByRole("button", { name: "Create" }); expect(createButton).toBeDisabled(); }); it("keeps the create button disabled when only tabs are entered", async () => { render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, "\t\t\t"); const createButton = screen.getByRole("button", { name: "Create" }); expect(createButton).toBeDisabled(); }); it("calls onSubmit with trimmed name when a valid name is submitted", async () => { render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, " Engineering "); const createButton = screen.getByRole("button", { name: "Create" }); await userEvent.click(createButton); expect(defaultProps.onSubmit).toHaveBeenCalledWith({ name: "Engineering", }); }); it("displays backend validation errors", () => { const props = { ...defaultProps, backendValidators: { name: "Team name already exists" }, }; render(); expect(screen.getByText("Team name already exists")).toBeInTheDocument(); }); it("clears errors when user types in the input", async () => { const props = { ...defaultProps, backendValidators: { name: "Team name already exists" }, }; render(); expect(screen.getByText("Team name already exists")).toBeInTheDocument(); // When error is shown, the label text changes to the error message const nameInput = screen.getByRole("textbox"); await userEvent.type(nameInput, "a"); await waitFor(() => { expect( screen.queryByText("Team name already exists") ).not.toBeInTheDocument(); }); }); });