import { cleanup, render } from "@testing-library/react"; import { afterEach, expect, it, vi } from "vitest"; import { dismissMapNotice, showMapNotice } from "./notice-actions"; import { MapErrorNotice, MapLoadingNotice, MapSourceStatusNotice } from "./notice"; vi.mock("./notice-actions", () => ({ showMapNotice: vi.fn(), dismissMapNotice: vi.fn() })); afterEach(() => { cleanup(); vi.clearAllMocks(); }); it("keeps initial healthy sources quiet and announces recovery once", () => { const { rerender, unmount } = render(); expect(showMapNotice).not.toHaveBeenCalled(); rerender(); expect(showMapNotice).not.toHaveBeenCalled(); rerender(); expect(showMapNotice).toHaveBeenLastCalledWith(expect.objectContaining({ tone: "error", message: "连接失败" })); rerender(); expect(showMapNotice).toHaveBeenLastCalledWith(expect.objectContaining({ tone: "success", duration: 2600 })); rerender(); expect(showMapNotice).toHaveBeenCalledTimes(2); expect(dismissMapNotice).not.toHaveBeenCalled(); unmount(); expect(dismissMapNotice).toHaveBeenCalledOnce(); }); it("updates a degraded source in place and only removes it when unmounted", () => { const { rerender, unmount } = render(); rerender(); rerender(); expect(showMapNotice).toHaveBeenCalledTimes(3); expect(dismissMapNotice).not.toHaveBeenCalled(); unmount(); expect(dismissMapNotice).toHaveBeenCalledWith("source"); }); it("updates map errors without cancelling the updated notice and cleans up a replaced id", () => { const { rerender, unmount } = render(); rerender(); expect(dismissMapNotice).not.toHaveBeenCalled(); rerender(); expect(dismissMapNotice).toHaveBeenCalledExactlyOnceWith("old"); unmount(); expect(dismissMapNotice).toHaveBeenLastCalledWith("new"); }); it("keeps loading visible while its title or message changes", () => { const { rerender, unmount } = render(); rerender(); expect(showMapNotice).toHaveBeenLastCalledWith(expect.objectContaining({ id: "loading", title: "准备管网", duration: Infinity })); expect(dismissMapNotice).not.toHaveBeenCalled(); unmount(); expect(dismissMapNotice).toHaveBeenCalledWith("loading"); });