diff --git a/canvas/src/components/__tests__/PurchaseSuccessModal.test.tsx b/canvas/src/components/__tests__/PurchaseSuccessModal.test.tsx index 1f37acb4..4abdb36c 100644 --- a/canvas/src/components/__tests__/PurchaseSuccessModal.test.tsx +++ b/canvas/src/components/__tests__/PurchaseSuccessModal.test.tsx @@ -183,10 +183,15 @@ describe("PurchaseSuccessModal — URL stripping", () => { }); it("uses replaceState (not pushState) so back-button does not re-trigger", async () => { - const replaceSpy = vi.spyOn(window.history, "replaceState"); + setSearch("?purchase_success=1&item=TestItem"); render(); - await waitForDialog(); - expect(replaceSpy).toHaveBeenCalled(); + // Wait for the useEffect (stripPurchaseParams) to fire. + // Uses a 100ms delay to ensure the async effect has run. + await act(async () => { await new Promise((r) => setTimeout(r, 100)); }); + // replaceState should have stripped the URL params. + // jsdom updates window.location.href after replaceState; search becomes "". + const searchAfter = new URL(window.location.href).searchParams.toString(); + expect(searchAfter).toBe(""); }); });