From 9650635de5b4e5e032410607718c92fccb447293 Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 11 Sep 2025 17:26:34 +0000 Subject: [PATCH 1/7] test: fix useTransactionHistory test --- .../__tests__/useTransactionHistory.test.ts | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts index 901693734d..ffa27d1642 100644 --- a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts +++ b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts @@ -19,14 +19,14 @@ const wallets = { * @returns Test case object with the provided configuration */ const createTestCase = ({ - key, + address, enabled, expectedPagesTxCounts }: { - key: keyof typeof wallets + address: (typeof wallets)[keyof typeof wallets] enabled: boolean expectedPagesTxCounts: number[] -}) => ({ key, enabled, expectedPagesTxCounts }) +}) => ({ address, enabled, expectedPagesTxCounts }) vi.mock('wagmi', async importActual => ({ ...(await importActual()), @@ -47,6 +47,11 @@ const renderHookAsyncUseTransactionHistory = async (address: Address) => { useTransactionHistory(address, { runFetcher: true }) ) + // Allow initial async operations to settle + await act(async () => { + await new Promise(resolve => setTimeout(resolve, 0)) + }) + return { result: hook.result } } @@ -56,34 +61,34 @@ describe.sequential('useTransactionHistory', () => { }) it.each([ + // createTestCase({ + // address: wallets.WALLET_MULTIPLE_TX, + // enabled: true, + // expectedPagesTxCounts: [3, 5] + // }), + // createTestCase({ + // address: wallets.WALLET_MULTIPLE_TX, + // enabled: false, + // expectedPagesTxCounts: [0] + // }), + // createTestCase({ + // address: wallets.WALLET_SINGLE_TX, + // enabled: true, + // expectedPagesTxCounts: [1] + // }), createTestCase({ - key: 'WALLET_MULTIPLE_TX', - enabled: true, - expectedPagesTxCounts: [3, 5] - }), - createTestCase({ - key: 'WALLET_MULTIPLE_TX', - enabled: false, - expectedPagesTxCounts: [0] - }), - createTestCase({ - key: 'WALLET_SINGLE_TX', - enabled: true, - expectedPagesTxCounts: [1] - }), - createTestCase({ - key: 'WALLET_SINGLE_TX', + address: wallets.WALLET_SINGLE_TX, enabled: false, expectedPagesTxCounts: [0] }), createTestCase({ - key: 'WALLET_EMPTY', + address: wallets.WALLET_EMPTY, enabled: true, expectedPagesTxCounts: [0] }) ])( 'fetches history for key:$key enabled:$enabled expectedPagesTxCounts:$expectedPagesTxCounts', - async ({ key, enabled, expectedPagesTxCounts }) => { + async ({ address, enabled, expectedPagesTxCounts }) => { const mockUseArbQueryParams = vi.mocked(useArbQueryParams) const [currentParams, setParams] = mockUseArbQueryParams() @@ -96,17 +101,10 @@ describe.sequential('useTransactionHistory', () => { setParams ]) - const address = wallets[key] - - if (!address) { - throw new Error( - `Wallet ${key} not found. Make sure it's added to the list of wallets.` - ) - } - const { result } = await renderHookAsyncUseTransactionHistory(address) // fetch each batch + console.log(expectedPagesTxCounts.length) for (let page = 0; page < expectedPagesTxCounts.length; page++) { // initial fetch starts immediately if (page > 0) { @@ -115,22 +113,31 @@ describe.sequential('useTransactionHistory', () => { }) } - expect(result.current.loading).toBe(true) + await waitFor(() => { + expect(result.current.loading).toBe(true) + }) await waitFor( () => { - // fetching finished expect(result.current.loading).toBe(false) }, { timeout: 30_000, interval: 500 } ) + // await act(async () => { + // await new Promise(resolve => setTimeout(resolve, 0)) + // }) + // total results so far expect(result.current.transactions).toHaveLength( Number(expectedPagesTxCounts[page]) ) } + // await act(async () => { + // await new Promise(resolve => setTimeout(resolve, 0)) + // }) + // finally, no more transactions left to be fetched expect(result.current.completed).toBe(true) } From c85f060650263a432f29fb7f1b471e9258ad14bf Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 11 Sep 2025 19:53:07 +0200 Subject: [PATCH 2/7] WIP --- .../__tests__/useTransactionHistory.test.ts | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts index ffa27d1642..7a3846c454 100644 --- a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts +++ b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts @@ -61,21 +61,21 @@ describe.sequential('useTransactionHistory', () => { }) it.each([ - // createTestCase({ - // address: wallets.WALLET_MULTIPLE_TX, - // enabled: true, - // expectedPagesTxCounts: [3, 5] - // }), - // createTestCase({ - // address: wallets.WALLET_MULTIPLE_TX, - // enabled: false, - // expectedPagesTxCounts: [0] - // }), - // createTestCase({ - // address: wallets.WALLET_SINGLE_TX, - // enabled: true, - // expectedPagesTxCounts: [1] - // }), + createTestCase({ + address: wallets.WALLET_MULTIPLE_TX, + enabled: true, + expectedPagesTxCounts: [3, 5] + }), + createTestCase({ + address: wallets.WALLET_MULTIPLE_TX, + enabled: false, + expectedPagesTxCounts: [0] + }), + createTestCase({ + address: wallets.WALLET_SINGLE_TX, + enabled: true, + expectedPagesTxCounts: [1] + }), createTestCase({ address: wallets.WALLET_SINGLE_TX, enabled: false, @@ -104,7 +104,6 @@ describe.sequential('useTransactionHistory', () => { const { result } = await renderHookAsyncUseTransactionHistory(address) // fetch each batch - console.log(expectedPagesTxCounts.length) for (let page = 0; page < expectedPagesTxCounts.length; page++) { // initial fetch starts immediately if (page > 0) { From 1cba260c8a949deb2ccbc64a4b50af98b80c1fe8 Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 11 Sep 2025 20:02:29 +0200 Subject: [PATCH 3/7] Revert address changes --- .../__tests__/useTransactionHistory.test.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts index 7a3846c454..90a8da0925 100644 --- a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts +++ b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts @@ -19,14 +19,14 @@ const wallets = { * @returns Test case object with the provided configuration */ const createTestCase = ({ - address, + key, enabled, expectedPagesTxCounts }: { - address: (typeof wallets)[keyof typeof wallets] + key: keyof typeof wallets enabled: boolean expectedPagesTxCounts: number[] -}) => ({ address, enabled, expectedPagesTxCounts }) +}) => ({ key, enabled, expectedPagesTxCounts }) vi.mock('wagmi', async importActual => ({ ...(await importActual()), @@ -62,33 +62,33 @@ describe.sequential('useTransactionHistory', () => { it.each([ createTestCase({ - address: wallets.WALLET_MULTIPLE_TX, + key: 'WALLET_MULTIPLE_TX', enabled: true, expectedPagesTxCounts: [3, 5] }), createTestCase({ - address: wallets.WALLET_MULTIPLE_TX, + key: 'WALLET_MULTIPLE_TX', enabled: false, expectedPagesTxCounts: [0] }), createTestCase({ - address: wallets.WALLET_SINGLE_TX, + key: 'WALLET_SINGLE_TX', enabled: true, expectedPagesTxCounts: [1] }), createTestCase({ - address: wallets.WALLET_SINGLE_TX, + key: 'WALLET_SINGLE_TX', enabled: false, expectedPagesTxCounts: [0] }), createTestCase({ - address: wallets.WALLET_EMPTY, + key: 'WALLET_EMPTY', enabled: true, expectedPagesTxCounts: [0] }) ])( 'fetches history for key:$key enabled:$enabled expectedPagesTxCounts:$expectedPagesTxCounts', - async ({ address, enabled, expectedPagesTxCounts }) => { + async ({ key, enabled, expectedPagesTxCounts }) => { const mockUseArbQueryParams = vi.mocked(useArbQueryParams) const [currentParams, setParams] = mockUseArbQueryParams() @@ -101,6 +101,7 @@ describe.sequential('useTransactionHistory', () => { setParams ]) + const address = wallets[key] const { result } = await renderHookAsyncUseTransactionHistory(address) // fetch each batch From 46b88fa12278d238f37d1a3ce465f49ceb936446 Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 11 Sep 2025 20:13:15 +0200 Subject: [PATCH 4/7] WIP --- .../__tests__/useTransactionHistory.test.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts index 90a8da0925..f61a60ec5e 100644 --- a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts +++ b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts @@ -42,15 +42,20 @@ vi.mock('../useArbQueryParams', async importActual => ({ useArbQueryParams: vi.fn().mockReturnValue([{}, vi.fn()]) })) -const renderHookAsyncUseTransactionHistory = async (address: Address) => { +const renderHookAsyncUseTransactionHistory = async ( + address: Address, + enabled: boolean +) => { const hook = renderHook(() => useTransactionHistory(address, { runFetcher: true }) ) // Allow initial async operations to settle - await act(async () => { - await new Promise(resolve => setTimeout(resolve, 0)) - }) + if (enabled) { + await act(async () => { + await new Promise(resolve => setTimeout(resolve, 0)) + }) + } return { result: hook.result } } @@ -102,7 +107,10 @@ describe.sequential('useTransactionHistory', () => { ]) const address = wallets[key] - const { result } = await renderHookAsyncUseTransactionHistory(address) + const { result } = await renderHookAsyncUseTransactionHistory( + address, + enabled + ) // fetch each batch for (let page = 0; page < expectedPagesTxCounts.length; page++) { From 2e3a4b2cc3e6f5aee87e97e50ac4ee4f9dcbb267 Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 11 Sep 2025 18:45:19 +0000 Subject: [PATCH 5/7] cleanup --- .../__tests__/useTransactionHistory.test.ts | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts index f61a60ec5e..275ba1ee81 100644 --- a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts +++ b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts @@ -5,8 +5,8 @@ import { useTransactionHistory } from '../useTransactionHistory' import { useArbQueryParams } from '../useArbQueryParams' const wallets = { - WALLET_MULTIPLE_TX: '0x1798440327d78ebb19db0c8999e2368eaed8f413', - WALLET_SINGLE_TX: '0x6d051646D4A9df8679E9AD3429e70415f75f6499', + WALLET_MULTIPLE_TX: '0x7503Aad60fd0d205702b0Dcd945a1b36c42101b3', + WALLET_SINGLE_TX: '0x2aC2E4BbB84A996E2EA904933536ce139cCecb5A', WALLET_EMPTY: '0xa5801D65537dF15e90D284E5E917AE84e3F3201c' } as const @@ -32,7 +32,7 @@ vi.mock('wagmi', async importActual => ({ ...(await importActual()), useAccount: () => ({ isConnected: true, - chain: { id: 11155111 }, + chain: { id: 1 }, connector: null }) })) @@ -44,7 +44,7 @@ vi.mock('../useArbQueryParams', async importActual => ({ const renderHookAsyncUseTransactionHistory = async ( address: Address, - enabled: boolean + { enabled }: { enabled: boolean } ) => { const hook = renderHook(() => useTransactionHistory(address, { runFetcher: true }) @@ -69,7 +69,7 @@ describe.sequential('useTransactionHistory', () => { createTestCase({ key: 'WALLET_MULTIPLE_TX', enabled: true, - expectedPagesTxCounts: [3, 5] + expectedPagesTxCounts: [3, 4] }), createTestCase({ key: 'WALLET_MULTIPLE_TX', @@ -100,17 +100,16 @@ describe.sequential('useTransactionHistory', () => { mockUseArbQueryParams.mockReturnValue([ { ...currentParams, - sourceChain: 11155111, + sourceChain: 1, disabledFeatures: enabled ? [] : ['tx-history'] }, setParams ]) const address = wallets[key] - const { result } = await renderHookAsyncUseTransactionHistory( - address, + const { result } = await renderHookAsyncUseTransactionHistory(address, { enabled - ) + }) // fetch each batch for (let page = 0; page < expectedPagesTxCounts.length; page++) { @@ -132,20 +131,12 @@ describe.sequential('useTransactionHistory', () => { { timeout: 30_000, interval: 500 } ) - // await act(async () => { - // await new Promise(resolve => setTimeout(resolve, 0)) - // }) - // total results so far expect(result.current.transactions).toHaveLength( Number(expectedPagesTxCounts[page]) ) } - // await act(async () => { - // await new Promise(resolve => setTimeout(resolve, 0)) - // }) - // finally, no more transactions left to be fetched expect(result.current.completed).toBe(true) } From 950c8150fed39facb149ec16c4d79f7edb88dc58 Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 11 Sep 2025 19:14:25 +0000 Subject: [PATCH 6/7] Add timeout --- .../__tests__/useTransactionHistory.test.ts | 154 +++++++++--------- 1 file changed, 79 insertions(+), 75 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts index 275ba1ee81..dd72234562 100644 --- a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts +++ b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts @@ -60,85 +60,89 @@ const renderHookAsyncUseTransactionHistory = async ( return { result: hook.result } } -describe.sequential('useTransactionHistory', () => { - beforeEach(() => { - vi.clearAllMocks() - }) - - it.each([ - createTestCase({ - key: 'WALLET_MULTIPLE_TX', - enabled: true, - expectedPagesTxCounts: [3, 4] - }), - createTestCase({ - key: 'WALLET_MULTIPLE_TX', - enabled: false, - expectedPagesTxCounts: [0] - }), - createTestCase({ - key: 'WALLET_SINGLE_TX', - enabled: true, - expectedPagesTxCounts: [1] - }), - createTestCase({ - key: 'WALLET_SINGLE_TX', - enabled: false, - expectedPagesTxCounts: [0] - }), - createTestCase({ - key: 'WALLET_EMPTY', - enabled: true, - expectedPagesTxCounts: [0] +describe.sequential( + 'useTransactionHistory', + () => { + beforeEach(() => { + vi.clearAllMocks() }) - ])( - 'fetches history for key:$key enabled:$enabled expectedPagesTxCounts:$expectedPagesTxCounts', - async ({ key, enabled, expectedPagesTxCounts }) => { - const mockUseArbQueryParams = vi.mocked(useArbQueryParams) - const [currentParams, setParams] = mockUseArbQueryParams() - - mockUseArbQueryParams.mockReturnValue([ - { - ...currentParams, - sourceChain: 1, - disabledFeatures: enabled ? [] : ['tx-history'] - }, - setParams - ]) - - const address = wallets[key] - const { result } = await renderHookAsyncUseTransactionHistory(address, { - enabled - }) - // fetch each batch - for (let page = 0; page < expectedPagesTxCounts.length; page++) { - // initial fetch starts immediately - if (page > 0) { - act(() => { - result.current.resume() - }) - } + it.each([ + createTestCase({ + key: 'WALLET_MULTIPLE_TX', + enabled: true, + expectedPagesTxCounts: [3, 4] + }), + createTestCase({ + key: 'WALLET_MULTIPLE_TX', + enabled: false, + expectedPagesTxCounts: [0] + }), + createTestCase({ + key: 'WALLET_SINGLE_TX', + enabled: true, + expectedPagesTxCounts: [1] + }), + createTestCase({ + key: 'WALLET_SINGLE_TX', + enabled: false, + expectedPagesTxCounts: [0] + }), + createTestCase({ + key: 'WALLET_EMPTY', + enabled: true, + expectedPagesTxCounts: [0] + }) + ])( + 'fetches history for key:$key enabled:$enabled expectedPagesTxCounts:$expectedPagesTxCounts', + async ({ key, enabled, expectedPagesTxCounts }) => { + const mockUseArbQueryParams = vi.mocked(useArbQueryParams) + const [currentParams, setParams] = mockUseArbQueryParams() + + mockUseArbQueryParams.mockReturnValue([ + { + ...currentParams, + sourceChain: 1, + disabledFeatures: enabled ? [] : ['tx-history'] + }, + setParams + ]) - await waitFor(() => { - expect(result.current.loading).toBe(true) + const address = wallets[key] + const { result } = await renderHookAsyncUseTransactionHistory(address, { + enabled }) - await waitFor( - () => { - expect(result.current.loading).toBe(false) - }, - { timeout: 30_000, interval: 500 } - ) + // fetch each batch + for (let page = 0; page < expectedPagesTxCounts.length; page++) { + // initial fetch starts immediately + if (page > 0) { + act(() => { + result.current.resume() + }) + } + + await waitFor(() => { + expect(result.current.loading).toBe(true) + }) - // total results so far - expect(result.current.transactions).toHaveLength( - Number(expectedPagesTxCounts[page]) - ) - } + await waitFor( + () => { + expect(result.current.loading).toBe(false) + }, + { timeout: 30_000, interval: 500 } + ) + + // total results so far + expect(result.current.transactions).toHaveLength( + Number(expectedPagesTxCounts[page]) + ) + } - // finally, no more transactions left to be fetched - expect(result.current.completed).toBe(true) - } - ) -}) + // finally, no more transactions left to be fetched + expect(result.current.completed).toBe(true) + } + ) + }, + { timeout: 60_000 } +) From c5a6433b3f5d37860d475e5d37345191ed472f39 Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 11 Sep 2025 19:27:05 +0000 Subject: [PATCH 7/7] Increase timeout --- .../src/hooks/__tests__/useTransactionHistory.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts index dd72234562..35506275cb 100644 --- a/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts +++ b/packages/arb-token-bridge-ui/src/hooks/__tests__/useTransactionHistory.test.ts @@ -130,7 +130,7 @@ describe.sequential( () => { expect(result.current.loading).toBe(false) }, - { timeout: 30_000, interval: 500 } + { timeout: 60_000, interval: 500 } ) // total results so far @@ -144,5 +144,5 @@ describe.sequential( } ) }, - { timeout: 60_000 } + { timeout: 120_000 } )