/** * @jest-environment jsdom */ import { pollLifiStatusUntilTerminal, isLikelyLifiIndexerNotReadyMessage, } from './lifiStatusPoll' import type { LifiStatusResponse } from '../../../shared/types' describe('lifiStatusPoll', () => { describe('isLikelyLifiIndexerNotReadyMessage', () => { it('returns true for known indexer lag phrases', () => { expect( isLikelyLifiIndexerNotReadyMessage('No transfer information found'), ).toBe(true) expect(isLikelyLifiIndexerNotReadyMessage('transfer not found')).toBe( true, ) }) it('returns false for unrelated errors', () => { expect(isLikelyLifiIndexerNotReadyMessage('Network error 400')).toBe( false, ) }) }) describe('pollLifiStatusUntilTerminal', () => { it('treats response error field as hard error without resetting counter incorrectly', async () => { const getStatus = jest .fn() .mockResolvedValueOnce({ error: 'temporary', data: undefined, } as LifiStatusResponse) .mockResolvedValueOnce({ data: { rawResponse: { status: 'DONE' as const } }, } as LifiStatusResponse) const result = await pollLifiStatusUntilTerminal({ getStatus, request: { txHash: '0x1' }, everyMs: 5, initialDelayMs: 0, timeoutMs: 5000, maxConsecutiveErrors: 10, }) expect(result.status).toBe('DONE') expect(getStatus).toHaveBeenCalledTimes(2) }) it('retries on indexer lag message without counting as hard error', async () => { const getStatus = jest .fn() .mockRejectedValueOnce(new Error('transfer not found')) .mockResolvedValue({ data: { rawResponse: { status: 'DONE' as const } }, } as LifiStatusResponse) const result = await pollLifiStatusUntilTerminal({ getStatus, request: { txHash: '0x1' }, everyMs: 5, initialDelayMs: 0, timeoutMs: 5000, maxConsecutiveErrors: 2, }) expect(result.status).toBe('DONE') }) }) })