import { render, screen } from "@testing-library/react"; import { Alert } from "./Alert"; const args = { error: "error placeholder" }; describe("Alert component", () => { it("should display an error when the error is in string format", () => { const error = "error in string format"; render(); const alert = screen.getByRole("alert") as HTMLDivElement; expect(alert).toBeInTheDocument(); expect(alert).toHaveClass("alert alert-danger"); expect(alert).toHaveTextContent(error); }); it("should display error(s) when the error is an array", () => { const arrayOfErrors = ["first error", "second error", "third error"]; const joinedErrors = arrayOfErrors.map((error) => error).join(""); render(); const alert = screen.getByRole("alert") as HTMLDivElement; expect(alert).toBeInTheDocument(); expect(alert).toHaveClass("alert alert-danger"); expect(screen.getByText(joinedErrors)).toBeInTheDocument(); }); it("should display error's names paths and messages when the error is an object that has an 'errors' property that contains an array of error objects", () => { const arrayOfErrors = { errors: [ { name: "first error", path: "/path", message: "message" }, { name: "second error", path: "/path", message: "message" }, { name: "third error", path: "/path", message: "message" } ] }; render(); const alert = screen.getByRole("alert") as HTMLDivElement; expect(alert).toBeInTheDocument(); expect(alert).toHaveClass("alert alert-danger"); expect(alert).toHaveTextContent(arrayOfErrors.errors.map((error) => `${error.name} (${error.path}) - ${error.message}`).join("")); }); it("should display an error message when the error is a standard error", () => { const standardError = { message: "first error" }; render(); const alert = screen.getByRole("alert") as HTMLDivElement; expect(alert).toBeInTheDocument(); expect(alert).toHaveClass("alert alert-danger"); expect(screen.getByText(standardError.message)).toBeInTheDocument(); }); it("should display error(s) message(s) when the error is a joi validation error", () => { const joiValidationError = { name: "ValidationError", details: [{ message: "message 1" }, { message: "message 2" }] }; render(); const alert = screen.getByRole("alert") as HTMLDivElement; expect(alert).toBeInTheDocument(); expect(alert).toHaveClass("alert alert-danger"); expect(screen.getByText("message 1")).toBeInTheDocument(); expect(screen.getByText("message 2")).toBeInTheDocument(); }); it("should display a custom error message that asks to reload the form when a conflict error occurs in a form", () => { const error = { _id: "some id", display: "some value" }; const messageReturned = "Another user has saved this form already. Please reload and re-apply your changes."; render(); const alert = screen.getByRole("alert") as HTMLDivElement; expect(alert).toBeInTheDocument(); expect(alert).toHaveClass("alert alert-danger"); expect(alert).toHaveTextContent(messageReturned); }); it("should display an error message by default when the error format does not match any of the conditions of the formatError() handler", () => { const messageError: string = "An error occurred. See console logs for details."; render(); const alert = screen.getByRole("alert") as HTMLDivElement; expect(alert).toBeInTheDocument(); expect(alert).toHaveClass("alert alert-danger"); expect(alert).toHaveTextContent(messageError); }); });