import '@testing-library/jest-dom';
import { fireEvent, render, screen } from '@testing-library/react';
import { describe, expect, it, vi } from 'vitest';
import { AmountInputTypeSwitch } from './AmountInputTypeSwitch';
describe('AmountInputTypeSwitch', () => {
const defaultProps = {
selectedInputType: 'fiat' as const,
setSelectedInputType: vi.fn(),
asset: 'ETH',
fiatAmount: '100',
cryptoAmount: '0.5',
exchangeRate: 2000,
exchangeRateLoading: false,
currency: 'USD',
};
it('renders fiat to crypto conversion', () => {
render();
expect(screen.getByTestId('ockAmountLine')).toHaveTextContent('0.5 ETH');
});
it('renders crypto to fiat conversion', () => {
render(
,
);
expect(screen.getByTestId('ockAmountLine')).toHaveTextContent('$100');
});
it('toggles input type when clicked', () => {
render();
fireEvent.click(screen.getByTestId('ockAmountTypeSwitch'));
expect(defaultProps.setSelectedInputType).toHaveBeenCalledWith('crypto');
});
it('renders loading skeleton when exchange rate is loading', () => {
render(
,
);
expect(screen.getByTestId('ockSkeleton')).toBeInTheDocument();
});
it('renders loading skeleton when exchange rate is zero', () => {
render();
expect(screen.getByTestId('ockSkeleton')).toBeInTheDocument();
});
it('applies custom className', () => {
render(
,
);
const container = screen.getByTestId('ockAmountTypeSwitch').parentElement;
expect(container).toHaveClass('custom-class');
});
it('truncates crypto amount to 8 decimal places', () => {
render(
,
);
expect(screen.getByTestId('ockAmountLine')).toHaveTextContent(
'0.12345678 ETH',
);
});
it('handles empty amounts', () => {
render(
,
);
expect(screen.getByTestId('ockAmountLine')).toHaveTextContent('0 ETH');
});
it('formats fiat amount with currency symbol', () => {
render(
,
);
expect(screen.getByTestId('ockAmountLine')).toHaveTextContent('$1,234.56');
});
it('toggles from crypto to fiat when clicked', () => {
render(
,
);
fireEvent.click(screen.getByTestId('ockAmountTypeSwitch'));
expect(defaultProps.setSelectedInputType).toHaveBeenCalledWith('fiat');
});
it('has correct aria-label for accessibility', () => {
render();
const button = screen.getByTestId('ockAmountTypeSwitch');
expect(button).toHaveAttribute('aria-label', 'amount type switch');
});
});