From 482d1a5cd9951b096496cf11e72f3b3ceef77b97 Mon Sep 17 00:00:00 2001 From: WEB3NOVA Date: Sat, 29 Aug 2026 16:18:49 +0100 Subject: [PATCH] test(events): verify mount fetch, contractId propagation and polling resume for ContractEventFeed (Closes #558) --- src/components/ContractEventFeed.test.tsx | 42 +++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/components/ContractEventFeed.test.tsx b/src/components/ContractEventFeed.test.tsx index 99432b7c..015b97b4 100644 --- a/src/components/ContractEventFeed.test.tsx +++ b/src/components/ContractEventFeed.test.tsx @@ -69,6 +69,21 @@ describe("ContractEventFeed", () => { }); }); + it("fetches events on mount with the contractId and the default limit", async () => { + const getEvents = vi.fn().mockResolvedValue({ data: [MOCK_EVENT], error: null }); + vi.mocked(getClient).mockReturnValue({ + soroban: { getEvents }, + } as unknown as SorokitClient); + + render(); + act(() => { vi.advanceTimersByTime(0); }); + + await waitFor(() => { + expect(getEvents).toHaveBeenCalledWith(CONTRACT_ID, 10, undefined); + }); + expect(getEvents).toHaveBeenCalledTimes(1); + }); + it("renders 'No events found' when the events array is empty", async () => { mockGetEvents({ data: [], error: null }); @@ -127,6 +142,33 @@ describe("ContractEventFeed", () => { expect(getEvents).toHaveBeenCalledTimes(callsAfterPause); }); + it("restarts polling when the Live/Paused toggle is turned back on", async () => { + const getEvents = vi.fn().mockResolvedValue({ data: [], error: null }); + vi.mocked(getClient).mockReturnValue({ + soroban: { getEvents }, + } as unknown as SorokitClient); + + render(); + act(() => { vi.advanceTimersByTime(0); }); + await waitFor(() => expect(getEvents).toHaveBeenCalledTimes(1)); + + // Pause polling. + fireEvent.click(screen.getByRole("button", { name: /live/i })); + const callsAfterPause = getEvents.mock.calls.length; + + act(() => { vi.advanceTimersByTime(1500); }); + expect(getEvents).toHaveBeenCalledTimes(callsAfterPause); + + // Resume polling — a fresh interval starts, so one more call fires per + // poll interval. + fireEvent.click(screen.getByRole("button", { name: /paused/i })); + act(() => { vi.advanceTimersByTime(500); }); + expect(getEvents).toHaveBeenCalledTimes(callsAfterPause + 1); + + act(() => { vi.advanceTimersByTime(500); }); + expect(getEvents).toHaveBeenCalledTimes(callsAfterPause + 2); + }); + it("triggers a new load when contractId changes", async () => { const getEvents = vi.fn().mockResolvedValue({ data: [], error: null }); vi.mocked(getClient).mockReturnValue({