// @vitest-environment jsdom import { afterEach, describe, expect, it, vi } from "vitest"; import { flushView, renderView } from "./view-test-utils"; const snoozeMock = vi.fn(async () => {}); const silenceMock = vi.fn(async () => {}); vi.mock("../../shared/pro-nudge", () => ({ snoozeProNudge: () => snoozeMock(), silenceProNudge: () => silenceMock(), })); const { ProNudgeView } = await import("./ProNudge"); function button(container: HTMLElement, label: string): HTMLButtonElement { const match = [...container.querySelectorAll("button")].find((b) => b.textContent?.trim() === label); if (!match) throw new Error(`no button "${label}"`); return match; } describe("ProNudgeView", () => { let dispose: (() => void) | undefined; afterEach(() => { dispose?.(); vi.clearAllMocks(); }); it("snoozes for 90 days, then dismisses", async () => { const onDismiss = vi.fn(); const view = renderView(() => {}} onDismiss={onDismiss} />); dispose = view.dispose; button(view.container, "Remind me in 90 days").click(); await flushView(); expect(snoozeMock).toHaveBeenCalledOnce(); expect(silenceMock).not.toHaveBeenCalled(); expect(onDismiss).toHaveBeenCalledOnce(); }); it("silences permanently, then dismisses", async () => { const onDismiss = vi.fn(); const view = renderView(() => {}} onDismiss={onDismiss} />); dispose = view.dispose; button(view.container, "Don't show again").click(); await flushView(); expect(silenceMock).toHaveBeenCalledOnce(); expect(onDismiss).toHaveBeenCalledOnce(); }); it("still dismisses when storage fails", async () => { silenceMock.mockRejectedValueOnce(new Error("quota")); const onDismiss = vi.fn(); const view = renderView(() => {}} onDismiss={onDismiss} />); dispose = view.dispose; button(view.container, "Don't show again").click(); await flushView(); expect(onDismiss).toHaveBeenCalledOnce(); }); it("opens Pro without recording a dismissal", () => { const onSeePro = vi.fn(); const view = renderView(() => {}} />); dispose = view.dispose; button(view.container, "See Peach Pro").click(); expect(onSeePro).toHaveBeenCalledOnce(); expect(snoozeMock).not.toHaveBeenCalled(); expect(silenceMock).not.toHaveBeenCalled(); }); });