|
| 1 | +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' |
| 2 | +import { render, screen, cleanup, fireEvent, waitFor } from '@testing-library/react' |
| 3 | +import { WalletPicker } from './WalletPicker' |
| 4 | + |
| 5 | +const mockWalletManager = vi.hoisted(() => ({ |
| 6 | + connect: vi.fn(), |
| 7 | + disconnect: vi.fn(), |
| 8 | + getWalletType: vi.fn(), |
| 9 | + getPublicKey: vi.fn(), |
| 10 | +})) |
| 11 | + |
| 12 | +vi.mock('../utils/walletManager', () => ({ |
| 13 | + walletManager: mockWalletManager, |
| 14 | +})) |
| 15 | + |
| 16 | +vi.mock('../lib/wallet', () => ({ |
| 17 | + SUPPORTED_WALLETS: [ |
| 18 | + { name: 'Freighter', type: 'freighter', installUrl: 'https://www.freighter.app/' }, |
| 19 | + { name: 'Rabet', type: 'rabet', installUrl: 'https://rabet.io/' }, |
| 20 | + { name: 'xBull', type: 'xbull', installUrl: 'https://xbull.app/' }, |
| 21 | + { name: 'LOBSTR', type: 'lobstr', installUrl: 'https://lobstr.co/' }, |
| 22 | + { name: 'WalletConnect', type: 'walletconnect', installUrl: 'https://walletconnect.com/' }, |
| 23 | + ], |
| 24 | + getLastUsedWallet: vi.fn(() => null), |
| 25 | + setLastUsedWallet: vi.fn(), |
| 26 | + clearLastUsedWallet: vi.fn(), |
| 27 | +})) |
| 28 | + |
| 29 | +describe('WalletPicker', () => { |
| 30 | + let mockOnConnect: (publicKey: string, walletType: string) => void |
| 31 | + let mockOnError: (error: string) => void |
| 32 | + |
| 33 | + beforeEach(() => { |
| 34 | + cleanup() |
| 35 | + vi.restoreAllMocks() |
| 36 | + |
| 37 | + mockOnConnect = vi.fn() |
| 38 | + mockOnError = vi.fn() |
| 39 | + |
| 40 | + mockWalletManager.getWalletType.mockReturnValue(null) |
| 41 | + }) |
| 42 | + |
| 43 | + afterEach(() => { |
| 44 | + cleanup() |
| 45 | + }) |
| 46 | + |
| 47 | + it('renders all supported wallet options', () => { |
| 48 | + render(<WalletPicker onConnect={mockOnConnect} onError={mockOnError} />) |
| 49 | + |
| 50 | + expect(screen.getByText('Freighter')).toBeTruthy() |
| 51 | + expect(screen.getByText('Rabet')).toBeTruthy() |
| 52 | + expect(screen.getByText('xBull')).toBeTruthy() |
| 53 | + expect(screen.getByText('LOBSTR')).toBeTruthy() |
| 54 | + expect(screen.getByText('WalletConnect')).toBeTruthy() |
| 55 | + }) |
| 56 | + |
| 57 | + it('detects Lobstr as installed when window.lobstr is available', () => { |
| 58 | + window.lobstr = {} as any |
| 59 | + render(<WalletPicker onConnect={mockOnConnect} onError={mockOnError} />) |
| 60 | + expect(screen.getByText('Installed')).toBeTruthy() |
| 61 | + delete (window as any).lobstr |
| 62 | + }) |
| 63 | + |
| 64 | + it('calls walletManager.connect with lobstr when Lobstr is clicked', async () => { |
| 65 | + window.lobstr = {} as any |
| 66 | + const testPublicKey = 'GAlobstrtest1234567890abcdef1234567890abcdef1234567890abcdef' |
| 67 | + mockWalletManager.connect.mockResolvedValue(testPublicKey) |
| 68 | + |
| 69 | + render(<WalletPicker onConnect={mockOnConnect} onError={mockOnError} />) |
| 70 | + |
| 71 | + const lobstrButton = screen.getByText('LOBSTR').closest('button') |
| 72 | + expect(lobstrButton).toBeTruthy() |
| 73 | + |
| 74 | + fireEvent.click(lobstrButton!) |
| 75 | + |
| 76 | + await waitFor(() => { |
| 77 | + expect(mockWalletManager.connect).toHaveBeenCalledWith('lobstr') |
| 78 | + expect(mockOnConnect).toHaveBeenCalledWith(testPublicKey, 'LOBSTR') |
| 79 | + expect(mockOnError).not.toHaveBeenCalled() |
| 80 | + }) |
| 81 | + |
| 82 | + delete (window as any).lobstr |
| 83 | + }) |
| 84 | +}) |
0 commit comments