import '@testing-library/jest-dom';
import { fireEvent, render, screen } from '@testing-library/react';
import { act } from 'react';
import {
type Mock,
afterEach,
beforeEach,
describe,
expect,
it,
vi,
} from 'vitest';
import { AppchainBridgeAddressInput } from './AppchainBridgeAddressInput';
import { useAppchainBridgeContext } from './AppchainBridgeProvider';
vi.mock('./AppchainBridgeProvider', () => ({
useAppchainBridgeContext: vi.fn(),
}));
vi.mock('@/identity', () => ({
Avatar: () =>
Avatar
,
Address: ({ address }: { address: string }) => (
{address}
),
}));
describe('AppchainBridgeAddressInput', () => {
const mockSetIsAddressModalOpen = vi.fn();
const mockHandleAddressSelect = vi.fn();
beforeEach(() => {
(useAppchainBridgeContext as Mock).mockReturnValue({
setIsAddressModalOpen: mockSetIsAddressModalOpen,
handleAddressSelect: mockHandleAddressSelect,
});
});
afterEach(() => {
vi.clearAllMocks();
});
it('renders the component with initial state', () => {
render();
expect(screen.getByText('Send to')).toBeInTheDocument();
expect(screen.getByText('To')).toBeInTheDocument();
expect(screen.getByRole('textbox')).toBeInTheDocument();
});
it('handles back button click', () => {
render();
const backButton = screen.getByLabelText('Back button');
fireEvent.click(backButton);
expect(mockSetIsAddressModalOpen).toHaveBeenCalledWith(false);
});
it('shows error message for invalid address', async () => {
render();
const input = screen.getByRole('textbox');
await act(async () => {
fireEvent.change(input, { target: { value: 'invalid-address' } });
});
expect(
screen.getByText('Please enter a valid Ethereum address'),
).toBeInTheDocument();
});
it('shows address details for valid address', async () => {
render();
const validAddress = '0x1234567890123456789012345678901234567890';
const input = screen.getByRole('textbox');
await act(async () => {
fireEvent.change(input, { target: { value: validAddress } });
});
expect(screen.getByTestId('mock-avatar')).toBeInTheDocument();
expect(screen.getAllByTestId('mock-address')).toHaveLength(2);
});
it('handles address selection for valid address', async () => {
render();
const validAddress = '0x1234567890123456789012345678901234567890';
const input = screen.getByRole('textbox');
await act(async () => {
fireEvent.change(input, { target: { value: validAddress } });
});
const addressButton = screen.getByRole('button', {
name: new RegExp(validAddress),
});
fireEvent.click(addressButton);
expect(mockHandleAddressSelect).toHaveBeenCalledWith(validAddress);
expect(mockSetIsAddressModalOpen).toHaveBeenCalledWith(false);
});
it('does not show address details or selection button for empty input', async () => {
render();
expect(screen.queryByTestId('mock-avatar')).not.toBeInTheDocument();
expect(
screen.queryByRole('button', { name: /0x/i }),
).not.toBeInTheDocument();
});
});