import { EmailInputBlock } from "./index"; import { fireEvent, render, screen } from "@testing-library/react"; describe("EmailInputBlock", () => { const defaultProps = { onSubmit: jest.fn(), }; beforeEach(() => { jest.clearAllMocks(); }); it("renders with default props", () => { const { container } = render(); expect(container.querySelector("#email-input")).toBeInTheDocument(); }); it("renders custom anchorId", () => { const { container } = render( ); expect(container.querySelector("#custom-anchor")).toBeInTheDocument(); }); it("renders title when provided", () => { render(); expect(screen.getByText("Join us")).toBeInTheDocument(); expect(screen.getByText("Join us").tagName).toBe("H1"); }); it("does not render title when not provided", () => { const { container } = render(); expect(container.querySelector("h1")).not.toBeInTheDocument(); }); it("renders subTitle when provided", () => { render(); expect(screen.getByText("Stay updated")).toBeInTheDocument(); expect(screen.getByText("Stay updated").tagName).toBe("H2"); }); it("does not render subTitle when not provided", () => { const { container } = render(); expect(container.querySelector("h2")).not.toBeInTheDocument(); }); it("renders emailInputDescription when provided", () => { render( ); expect(screen.getByText("Sign up now")).toBeInTheDocument(); }); it("renders caption when provided", () => { render(); expect(screen.getByText("No spam")).toBeInTheDocument(); }); it("does not render caption when not provided", () => { render(); expect(screen.queryByText("No spam")).not.toBeInTheDocument(); }); it("uses default placeholder text", () => { render(); expect( screen.getByPlaceholderText("Enter your email here") ).toBeInTheDocument(); }); it("uses custom placeholder text", () => { render(); expect(screen.getByPlaceholderText("Your email")).toBeInTheDocument(); }); it("calls onSubmit with email on valid submission", () => { render(); const input = screen.getByPlaceholderText("Enter your email here"); fireEvent.change(input, { target: { value: "test@example.com" } }); fireEvent.click(screen.getByText("Sign me up")); expect(defaultProps.onSubmit).toHaveBeenCalledWith({ email: "test@example.com", }); }); it("clears email after successful submission", () => { render(); const input = screen.getByPlaceholderText( "Enter your email here" ) as HTMLInputElement; fireEvent.change(input, { target: { value: "test@example.com" } }); fireEvent.click(screen.getByText("Sign me up")); expect(input.value).toBe(""); }); it("shows error for invalid email", () => { render(); const input = screen.getByPlaceholderText("Enter your email here"); fireEvent.change(input, { target: { value: "invalid" } }); fireEvent.click(screen.getByText("Sign me up")); expect(screen.getByText("Invalid email address")).toBeInTheDocument(); expect(defaultProps.onSubmit).not.toHaveBeenCalled(); }); it("shows required error for empty email", () => { render(); fireEvent.click(screen.getByText("Sign me up")); expect(screen.getByText("Email is required")).toBeInTheDocument(); expect(defaultProps.onSubmit).not.toHaveBeenCalled(); }); it("clears error when user types a valid email after error", () => { render(); const input = screen.getByPlaceholderText("Enter your email here"); fireEvent.change(input, { target: { value: "invalid" } }); fireEvent.click(screen.getByText("Sign me up")); expect(screen.getByText("Invalid email address")).toBeInTheDocument(); fireEvent.change(input, { target: { value: "user@test.com" } }); expect( screen.queryByText("Invalid email address") ).not.toBeInTheDocument(); }); it("shows success feedback after valid submission", () => { render(); const input = screen.getByPlaceholderText("Enter your email here"); fireEvent.change(input, { target: { value: "user@test.com" } }); fireEvent.click(screen.getByText("Sign me up")); expect(screen.getByText("Thanks!")).toBeInTheDocument(); }); it("hides success feedback when user types again", () => { render(); const input = screen.getByPlaceholderText("Enter your email here"); fireEvent.change(input, { target: { value: "user@test.com" } }); fireEvent.click(screen.getByText("Sign me up")); expect(screen.getByText("Thanks!")).toBeInTheDocument(); fireEvent.change(input, { target: { value: "x" } }); expect(screen.queryByText("Thanks!")).not.toBeInTheDocument(); }); it("does not show success feedback without successFeedback prop", () => { render(); const input = screen.getByPlaceholderText("Enter your email here"); fireEvent.change(input, { target: { value: "user@test.com" } }); fireEvent.click(screen.getByText("Sign me up")); // No success text rendered expect(screen.queryByText("Thanks!")).not.toBeInTheDocument(); }); it("applies green theme background by default", () => { const { container } = render(); expect(container.querySelector(".bg-bg-fill-brand")).toBeInTheDocument(); }); it("applies blue theme background class", () => { const { container } = render( ); expect( container.querySelector(".bg-bg-fill-brand-supporting") ).toBeInTheDocument(); }); it("applies purple theme background class", () => { const { container } = render( ); expect( container.querySelector(".bg-bg-fill-brand-tertiary") ).toBeInTheDocument(); }); it("applies white outer background class by default", () => { const { container } = render(); expect(container.querySelector("section")).toHaveClass("bg-bg"); }); it("uses white text for dark themes", () => { render( ); expect(screen.getByText("Blue title").className).toContain("text-white"); }); it("uses dark text for the white theme", () => { render( ); expect(screen.getByText("White title").className).toContain("text-text"); }); it("uses custom ctaText", () => { render(); expect(screen.getByText("Subscribe")).toBeInTheDocument(); }); });