import { fireEvent, render, screen } from '@testing-library/react' import { AvailableBalance } from '@/components/AvailableBalance' import { useCurrentTokenBalance } from '@/hooks/useCurrentTokenBalance' import { useValidations } from '@/hooks/useValidations' import { useBridgeState } from '@/state/slices/bridge/hooks' import { useWalletState } from '@/state/slices/wallet/hooks' import { FetchState } from '@/state/slices/wallet/reducer' jest.mock('@/hooks/useCurrentTokenBalance') jest.mock('@/hooks/useValidations') jest.mock('@/state/slices/bridge/hooks') jest.mock('@/state/slices/wallet/hooks') describe('AvailableBalance', () => { const setInputAmount = jest.fn() beforeEach(() => { ;(useBridgeState as jest.Mock).mockReturnValue({ originChainId: 1, originToken: { symbol: 'Token' }, }) ;(useCurrentTokenBalance as jest.Mock).mockReturnValue({ decimals: 18, parsedBalance: '1.5000', rawBalance: '1500000000000000000', }) ;(useValidations as jest.Mock).mockReturnValue({ hasEnoughBalance: true, }) ;(useWalletState as jest.Mock).mockReturnValue({ balancesFetchStatus: FetchState.VALID, }) setInputAmount.mockReset() }) afterEach(() => { jest.clearAllMocks() }) it('keeps the existing non-native balance label and raw-balance fill behavior', () => { render( ) fireEvent.click(screen.getByText('Available 1.5000')) expect(setInputAmount).toHaveBeenCalledWith('1.500000000000000000') }) it('shows the native bridgeable amount and fills the safe max instead of the raw balance', () => { render( ) fireEvent.click(screen.getByText('Bridgeable 1.2500')) expect(setInputAmount).toHaveBeenCalledWith('1.250000000000000000') }) it.each([ [ 'idle', { amountWei: null, fillAmount: null, isClickable: false, isNativeOriginToken: true, labelAmount: null, status: 'idle' as const, }, 'Available 1.5000', ], [ 'loading', { amountWei: null, fillAmount: null, isClickable: false, isNativeOriginToken: true, labelAmount: null, status: 'loading' as const, }, 'Available 1.5000', ], [ 'unavailable', { amountWei: null, fillAmount: null, isClickable: false, isNativeOriginToken: true, labelAmount: null, status: 'unavailable' as const, }, 'Available 1.5000', ], [ 'zero', { amountWei: 0n, fillAmount: '0.0', isClickable: false, isNativeOriginToken: true, labelAmount: '0.0', status: 'ready' as const, }, 'Bridgeable 0.0', ], ])( 'renders the native %s state as non-clickable', (_scenario, nativeSafeMax, label) => { render( ) fireEvent.click(screen.getByText(label)) expect(setInputAmount).not.toHaveBeenCalled() } ) it('mirrors the non-native loading label for native assets while the wallet balance is still loading', () => { ;(useWalletState as jest.Mock).mockReturnValue({ balancesFetchStatus: FetchState.LOADING, }) render( ) expect(screen.getByText('loading...')).toBeInTheDocument() }) })