import ImportAlert from "@/features/Events/ImportAlert"; import { fireEvent, screen } from "@testing-library/react"; import { renderWithProviders } from "../../utils/Renderwithproviders"; // Mock the ErrorSnackbar component since we want to test ImportAlert logic, // but we can also test integration if we don't mock it. // Given ImportAlert uses EventErrorSnackbar which uses MUI Snackbar, // it's better to render it and check for text presence. describe("ImportAlert", () => { const preloadedState = { calendars: { list: { cal1: { id: "cal1", name: "Calendar 1", events: { event1: { uid: "event1", title: "Event 1", error: "Error message 1", }, event2: { uid: "event2", title: "Event 2", // No error }, }, }, cal2: { id: "cal2", name: "Calendar 2", events: { event3: { uid: "event3", title: "Event 3", error: "Error message 2", }, }, }, }, }, }; it("renders nothing when there are no errors", () => { const state = { calendars: { list: { cal1: { id: "cal1", events: { event1: { uid: "event1" }, }, }, }, }, }; const { container } = renderWithProviders(, state); expect(container).toBeEmptyDOMElement(); }); it("renders snackbar with error message when there is one error", () => { renderWithProviders(, preloadedState); // EventErrorSnackbar shows "multipleEvents" if > 1, or the message if 1. // Here we have 2 errors in preloadedState. // Let's adjust state for single error test. const singleErrorState = { calendars: { list: { cal1: { id: "cal1", events: { event1: { uid: "event1", error: "Single Error", }, }, }, }, }, }; renderWithProviders(, singleErrorState); expect(screen.getByText("Single Error")).toBeInTheDocument(); }); it("renders summary message when there are multiple errors", () => { renderWithProviders(, preloadedState); // 2 errors in preloadedState // "error.multipleEvents" key is used. // In test environment, t function usually returns the key or formatted string. // We should check what the real t function does or if it's mocked. // Based on other tests, it seems we might need to check for the translation key or value. // Let's assume standard behavior: "error.multipleEvents" // Actually, EventErrorSnackbar uses: t("error.multipleEvents", { count: messages.length }) // If we don't have full i18n setup in tests, it might be tricky. // But renderWithProviders likely sets up i18n. // Let's check for the text that appears. // If translation is missing, it might show "error.multipleEvents". // Or if we can match regex. // Let's try to match partial text or use a custom state with known behavior. // If we look at EventErrorSnackbar: // const summary = messages.length === 1 ? messages[0] : t("error.multipleEvents", { count: messages.length }); // We can check if the Alert is present. expect(screen.getByRole("alert")).toBeInTheDocument(); }); it("dismisses error when close button is clicked", () => { const singleErrorState = { calendars: { list: { cal1: { id: "cal1", events: { event1: { uid: "event1", error: "Dismiss Me", }, }, }, }, }, }; renderWithProviders(, singleErrorState); expect(screen.getByText("Dismiss Me")).toBeInTheDocument(); const closeButton = screen.getByRole("button", { name: /ok/i }); // EventErrorSnackbar has an "OK" button fireEvent.click(closeButton); // After clicking, it should disappear (or at least be removed from DOM or hidden) // Since we use local state to filter dismissed errors, it should re-render with null. expect(screen.queryByText("Dismiss Me")).not.toBeInTheDocument(); }); });