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();
});
});