import { render, screen } from '@testing-library/react'; import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; import { WalletAdvancedTokenHoldings } from './WalletAdvancedTokenHoldings'; import { useWalletContext } from './WalletProvider'; import { usePortfolio } from '../hooks/usePortfolio'; vi.mock('wagmi', () => ({ useAccount: vi.fn().mockReturnValue({ address: '0x123', }), })); vi.mock('../hooks/usePortfolio', () => ({ usePortfolio: vi.fn(), })); vi.mock('./WalletProvider', () => ({ useWalletContext: vi.fn(), WalletAdvancedProvider: ({ children }: { children: React.ReactNode }) => ( <>{children} ), })); describe('WalletAdvancedTokenHoldings', () => { const mockUseWalletAdvancedContext = useWalletContext as ReturnType< typeof vi.fn >; const defaultMockUseWalletAdvancedContext = { tokenBalances: [], portfolioFiatValue: 0, refetchPortfolioData: vi.fn(), isFetchingPortfolioData: false, portfolioDataUpdatedAt: new Date(), animations: { content: '', }, }; beforeEach(() => { vi.clearAllMocks(); mockUseWalletAdvancedContext.mockReturnValue( defaultMockUseWalletAdvancedContext, ); (usePortfolio as Mock).mockReturnValue({ data: { tokenBalances: [], }, isFetching: false, }); }); it('does not render token lists with zero tokens', () => { render(); expect(screen.queryByTestId('ockWalletAdvanced_TokenHoldings')).toBeNull(); }); it('renders a placeholder when fetcher is loading', () => { (usePortfolio as Mock).mockReturnValue({ data: { tokenBalances: [], }, isFetching: true, }); render(); const placeholder = screen.getByTestId( 'ockWalletAdvanced_LoadingPlaceholder', ); expect(placeholder).toHaveClass('my-2 h-44 w-80'); }); it('renders the WalletAdvancedTokenHoldings component with tokens when user has tokens and fetcher is not loading', () => { const tokens = [ { token: { name: 'Ether', address: '', symbol: 'ETH', decimals: 18, image: 'https://wallet-api-production.s3.amazonaws.com/uploads/tokens/eth_288.png', chainId: 8453, }, cryptoBalance: 420000000000000, fiatBalance: 1386, }, { token: { name: 'USD Coin', address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', symbol: 'USDC', decimals: 6, image: 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/44/2b/442b80bd16af0c0d9b22e03a16753823fe826e5bfd457292b55fa0ba8c1ba213-ZWUzYjJmZGUtMDYxNy00NDcyLTg0NjQtMWI4OGEwYjBiODE2', chainId: 8453, }, cryptoBalance: 69000000, fiatBalance: 69, }, { token: { name: 'Ether', address: '', symbol: 'ETH', decimals: 18, image: 'https://wallet-api-production.s3.amazonaws.com/uploads/tokens/eth_288.png', chainId: 8453, }, cryptoBalance: 420000000000000, fiatBalance: 1386, }, ]; (usePortfolio as Mock).mockReturnValue({ data: { tokenBalances: tokens, }, isFetching: false, }); render(); expect(screen.getByTestId('ockWalletAdvanced_TokenHoldings')).toBeDefined(); }); it('trims whitespace from token names', () => { const tokens = [ { address: '0x123', chainId: 1, symbol: 'SPACE', decimals: 18, image: 'test.png', name: ' Spaced Token ', cryptoBalance: '1000000000000000000', // 1 token in wei fiatBalance: '100', }, ]; (usePortfolio as Mock).mockReturnValue({ data: { tokenBalances: tokens, }, isFetching: false, }); render(); expect(screen.getByText('Spaced Token')).toBeInTheDocument(); }); it('applies custom classNames when provided', () => { const tokens = [ { address: '0x123', chainId: 1, symbol: 'TEST', decimals: 18, image: 'test.png', name: 'Test Token', cryptoBalance: '1000000000000000000', fiatBalance: '100', }, ]; const customClassNames = { container: 'custom-container', tokenDetails: { container: 'custom-token-details-container', tokenImage: 'custom-token-img', tokenName: 'custom-token-name', tokenBalance: 'custom-token-balance', fiatValue: 'custom-fiat-value', }, }; (usePortfolio as Mock).mockReturnValue({ data: { tokenBalances: tokens, }, isFetching: false, }); render(); const container = screen.getByTestId('ockWalletAdvanced_TokenHoldings'); expect(container).toHaveClass('custom-container'); const tokenImageContainer = screen.getByTestId( 'ockWalletAdvanced_TokenDetails_TokenImage', ); expect(tokenImageContainer).toHaveClass('custom-token-img'); const tokenName = screen.getByText('Test Token'); expect(tokenName).toHaveClass('custom-token-name'); const tokenBalance = screen.getByText('1.00 TEST'); expect(tokenBalance).toHaveClass('custom-token-balance'); const fiatValue = screen.getByText('$100.00'); expect(fiatValue).toHaveClass('custom-fiat-value'); }); });