import { fireEvent, render, screen } from '@testing-library/react';
import React from 'react';
import { describe, expect, it, vi } from 'vitest';
import { useErc20 } from '../../../../hooks';
import ERC20TransferForm from './ERC20TransferForm';
vi.mock('@/hooks', () => ({
useErc20: vi.fn(),
}));
describe('ERC20TransferForm', () => {
const mockTransferErc20 = vi.fn();
beforeEach(() => {
(useErc20 as jest.Mock).mockReturnValue({
transferErc20: mockTransferErc20,
});
});
it('renders the form with initial values', () => {
render(
);
expect(
screen.getByPlaceholderText('Recipient Address')
).toBeInTheDocument();
expect(screen.getByPlaceholderText('Amount')).toBeInTheDocument();
expect(screen.getByText('Transfer')).toBeInTheDocument();
});
it('updates recipient and amount state on input change', () => {
render(
);
const recipientInput = screen.getByPlaceholderText('Recipient Address');
const amountInput = screen.getByPlaceholderText('Amount');
fireEvent.change(recipientInput, { target: { value: '0xabcdef' } });
fireEvent.change(amountInput, { target: { value: '100' } });
expect(recipientInput).toHaveValue('0xabcdef');
expect(amountInput).toHaveValue('100');
});
it('calls transferErc20 with correct parameters on form submit', async () => {
render(
);
const recipientInput = screen.getByPlaceholderText('Recipient Address');
const amountInput = screen.getByPlaceholderText('Amount');
const submitButton = screen.getByText('Transfer');
fireEvent.change(recipientInput, { target: { value: '0xabcdef' } });
fireEvent.change(amountInput, { target: { value: '100' } });
fireEvent.click(submitButton);
expect(mockTransferErc20).toHaveBeenCalledWith({
accountName: 'testAccount',
transaction: {
to: '0xabcdef',
amount: '100',
contract_address: '0x1234567890abcdef',
chain_id: '1',
broadcast: true,
value: '0',
},
});
});
it('handles transfer failure', async () => {
mockTransferErc20.mockRejectedValueOnce(new Error('Transfer failed'));
render(
);
const recipientInput = screen.getByPlaceholderText('Recipient Address');
const amountInput = screen.getByPlaceholderText('Amount');
const submitButton = screen.getByText('Transfer');
fireEvent.change(recipientInput, { target: { value: '0xabcdef' } });
fireEvent.change(amountInput, { target: { value: '100' } });
fireEvent.click(submitButton);
await new Promise((r) => setTimeout(r, 0)); // wait for async code to complete
expect(mockTransferErc20).toHaveBeenCalled();
expect(console.error).toHaveBeenCalledWith(
'Transfer failed:',
expect.any(Error)
);
});
});