import { render, screen, fireEvent } from '@testing-library/react'; import { RenderDepositButton, type RenderDepositButtonProps, } from './RenderDepositButton'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { TransactionReceipt } from 'viem'; vi.mock('@/internal/components/Spinner', () => ({ Spinner: () =>
Loading...
, })); describe('RenderDepositButton', () => { const defaultProps = { context: { receipt: null, errorMessage: null, isLoading: false, }, onSubmit: vi.fn(), onSuccess: vi.fn(), isDisabled: false, depositAmountError: null, depositedAmount: '100', vaultToken: { symbol: 'ETH' }, } as unknown as RenderDepositButtonProps; afterEach(() => { vi.clearAllMocks(); }); it('renders deposit button in default state', () => { const button = RenderDepositButton(defaultProps); render(button); const buttonElement = screen.getByRole('button', { name: 'Deposit' }); expect(buttonElement).toBeInTheDocument(); expect(buttonElement).not.toBeDisabled(); fireEvent.click(buttonElement); expect(defaultProps.onSubmit).toHaveBeenCalledTimes(1); }); it('renders disabled deposit button', () => { const button = RenderDepositButton({ ...defaultProps, isDisabled: true, }); render(button); const buttonElement = screen.getByRole('button', { name: 'Deposit' }); expect(buttonElement).toBeInTheDocument(); expect(buttonElement).toBeDisabled(); }); it('renders loading state with spinner', () => { const button = RenderDepositButton({ ...defaultProps, context: { ...defaultProps.context, isLoading: true, }, }); render(button); const buttonElement = screen.getByRole('button'); const spinner = screen.getByTestId('spinner'); expect(buttonElement).toBeInTheDocument(); expect(spinner).toBeInTheDocument(); }); it('renders error state with error message', () => { const errorMessage = 'Insufficient funds'; const button = RenderDepositButton({ ...defaultProps, context: { ...defaultProps.context, errorMessage: 'Some error occurred', }, depositAmountError: errorMessage, }); render(button); const buttonElement = screen.getByRole('button', { name: errorMessage }); expect(buttonElement).toBeInTheDocument(); fireEvent.click(buttonElement); expect(defaultProps.onSubmit).toHaveBeenCalledTimes(1); }); it('renders error state with default message when depositAmountError is null', () => { const button = RenderDepositButton({ ...defaultProps, context: { ...defaultProps.context, errorMessage: 'Some error occurred', }, depositAmountError: null, }); render(button); const buttonElement = screen.getByRole('button', { name: 'Try again' }); expect(buttonElement).toBeInTheDocument(); }); it('renders success state with deposited amount', () => { const button = RenderDepositButton({ ...defaultProps, context: { ...defaultProps.context, receipt: {} as unknown as TransactionReceipt, }, }); render(button); const expectedText = `Deposited ${defaultProps.depositedAmount} ${defaultProps?.vaultToken?.symbol}`; const buttonElement = screen.getByRole('button', { name: expectedText }); expect(buttonElement).toBeInTheDocument(); fireEvent.click(buttonElement); expect(defaultProps.onSuccess).toHaveBeenCalledTimes(1); }); it('handles missing vaultToken gracefully', () => { const button = RenderDepositButton({ ...defaultProps, vaultToken: undefined, context: { ...defaultProps.context, receipt: {} as unknown as TransactionReceipt, }, }); render(button); const expectedText = `Deposited ${defaultProps.depositedAmount} undefined`; const buttonElement = screen.getByRole('button', { name: expectedText }); expect(buttonElement).toBeInTheDocument(); }); });