import React from "react"; import { createSerializer } from "@emotion/jest"; import { render, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import TextInputWithBadges, { getStringAsBadgeDatum } from "../components/TextInputWithBadges"; expect.addSnapshotSerializer(createSerializer()); const defaultBadges = [ { label: "Badge one", value: "badge-one" }, { label: "Badge two", value: "badge-two" }, { label: "Badge three", value: "badge-three" } ]; describe("TextInputWithBadges", () => { it("renders empty", () => { const { getByText, queryAllByTestId } = render( ); getByText("empty"); expect(queryAllByTestId("badge").length).toBe(0); }); it("renders with badges", () => { const { getByText, asFragment, getAllByTestId } = render( ); getByText("With badges"); expect(getAllByTestId("badge").length).toBe(3); expect(asFragment()).toMatchSnapshot(); }); it("renders badges with custom BadgeAppearance", () => { const { asFragment } = render( ); expect(asFragment()).toMatchSnapshot(); }); it("calls onBadgeChange with the badge data and input value when keying enter", async () => { const badgeChangeHandler = jest.fn(); const inputValue = "some value"; const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(badgeChangeHandler).not.toHaveBeenCalled(); await userEvent.type(inputEl, "[Enter]"); expect(badgeChangeHandler).toHaveBeenCalledWith( [getStringAsBadgeDatum(inputValue)], getStringAsBadgeDatum(inputValue) ); }); it("calls onBadgeChange with the badge data and input value when the input blurs", async () => { const badgeChangeHandler = jest.fn(); const inputValue = "some value"; const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(badgeChangeHandler).not.toHaveBeenCalled(); inputEl.focus(); await userEvent.tab(); expect(badgeChangeHandler).toHaveBeenCalledWith( [getStringAsBadgeDatum(inputValue)], getStringAsBadgeDatum(inputValue) ); }); it("does not call onBadgeChange with the badge data and input value when the input blurs if addBadgeOnBlur=false", async () => { const badgeChangeHandler = jest.fn(); const inputValue = "some value"; const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(badgeChangeHandler).not.toHaveBeenCalled(); inputEl.focus(); await userEvent.tab(); expect(badgeChangeHandler).not.toHaveBeenCalledWith( [getStringAsBadgeDatum(inputValue)], getStringAsBadgeDatum(inputValue) ); }); it("does not call onBadgeChange when keying enter if the input value is undefined", async () => { const badgeChangeHandler = jest.fn(); const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(badgeChangeHandler).not.toHaveBeenCalled(); await userEvent.type(inputEl, "[Enter]"); expect(badgeChangeHandler).not.toHaveBeenCalled(); }); it("does not call onBadgeChange when keying enter if the input value is whitespace chars", async () => { const badgeChangeHandler = jest.fn(); const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(badgeChangeHandler).not.toHaveBeenCalled(); await userEvent.type(inputEl, "[Enter]"); expect(badgeChangeHandler).not.toHaveBeenCalled(); }); it("calls onBadgeChange with the badge data when clicking the close icon", async () => { const firstBadge = { value: "firstbadge", label: "First badge" }; const badgeChangeHandler = jest.fn(); const { getAllByTestId } = render( ); const allBadgesEl = getAllByTestId("badge"); const firstBadgeEl = allBadgesEl[0]; const firstBadgeCloseIcon = await within(firstBadgeEl).findByRole("button"); expect(badgeChangeHandler).not.toHaveBeenCalled(); firstBadgeCloseIcon.click(); expect(badgeChangeHandler).toHaveBeenCalledWith(defaultBadges, firstBadge); }); it("calls onBadgeChange with the last badge's data when keying backspace", async () => { const lastBadge = { value: "lastbadge", label: "Last badge" }; const badgeChangeHandler = jest.fn(); const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(badgeChangeHandler).not.toHaveBeenCalled(); await userEvent.type(inputEl, "[Backspace]"); expect(badgeChangeHandler).toHaveBeenCalledWith(defaultBadges, lastBadge); }); it("calls the input's onKeyDown prop", async () => { const onKeyDownFn = jest.fn(); const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(onKeyDownFn).not.toHaveBeenCalled(); await userEvent.type(inputEl, "[Space]"); expect(onKeyDownFn).toHaveBeenCalled(); }); it("calls the input's onKeyUp prop", async () => { const onKeyUpFn = jest.fn(); const { getByRole } = render( ); const inputEl = getByRole("textbox"); expect(onKeyUpFn).not.toHaveBeenCalled(); await userEvent.type(inputEl, "[Space]"); expect(onKeyUpFn).toHaveBeenCalled(); }); });