import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test';
import type { EarnContextType } from '@/earn/types';
import { usdcToken } from '@/token/constants';
import { fireEvent, render, screen } from '@testing-library/react';
import type { Address } from 'viem';
import {
type Mock,
afterEach,
beforeEach,
describe,
expect,
it,
vi,
} from 'vitest';
import { useAccount } from 'wagmi';
import { useEarnContext } from './EarnProvider';
import { WithdrawBalance } from './WithdrawBalance';
vi.mock('./EarnProvider', () => ({
useEarnContext: vi.fn(),
}));
vi.mock('wagmi', () => ({
useAccount: vi.fn().mockReturnValue({
address: '0x123' as Address,
}),
}));
describe('WithdrawBalance', () => {
beforeEach(() => {
vi.resetAllMocks();
vi.mocked(useEarnContext).mockReturnValue(MOCK_EARN_CONTEXT);
vi.mocked(useAccount as Mock).mockReturnValue({
address: '0x123' as Address,
});
});
afterEach(() => {
vi.clearAllMocks();
});
it("renders 'Wallet not connected' when the user is not connected", () => {
vi.mocked(useAccount as Mock).mockReturnValue({
address: undefined,
});
render();
expect(screen.getByText('Wallet not connected')).toBeInTheDocument();
});
it('renders a skeleton for the amount and shows the token symbol when the balance is pending', () => {
vi.mocked(useEarnContext).mockReturnValue({
...MOCK_EARN_CONTEXT,
depositedBalanceStatus: 'pending',
});
render();
expect(screen.getByTestId('ockSkeleton')).toBeInTheDocument();
expect(screen.getByText(usdcToken.symbol)).toBeInTheDocument();
});
it('renders a Skeleton when vaultToken is undefined', () => {
const mockContext: EarnContextType = {
...MOCK_EARN_CONTEXT,
vaultToken: undefined,
};
vi.mocked(useEarnContext).mockReturnValue(mockContext);
render();
expect(screen.getByTestId('ockSkeleton')).toBeInTheDocument();
});
it('renders the receipt token balance and subtitle correctly', () => {
vi.mocked(useEarnContext).mockReturnValue(MOCK_EARN_CONTEXT);
render();
expect(screen.getByText('1,000 USDC')).toBeInTheDocument();
expect(screen.getByText('Available to withdraw')).toBeInTheDocument();
});
it('calls setWithdrawAmount with receiptBalance when the action button is clicked', () => {
const mocksetWithdrawAmount = vi.fn();
const mockContext: EarnContextType = {
...MOCK_EARN_CONTEXT,
depositedBalance: '1000',
setWithdrawAmount: mocksetWithdrawAmount,
};
vi.mocked(useEarnContext).mockReturnValue(mockContext);
render();
const actionButton = screen.getByText('Use max');
fireEvent.click(actionButton);
expect(mocksetWithdrawAmount).toHaveBeenCalledWith('1000');
});
it('does not render the action button when receiptBalance is blank', () => {
const mockContext: EarnContextType = {
...MOCK_EARN_CONTEXT,
depositedBalance: '',
setWithdrawAmount: vi.fn(),
};
vi.mocked(useEarnContext).mockReturnValue(mockContext);
render();
expect(screen.queryByText('Use max')).not.toBeInTheDocument();
});
it('applies custom className', () => {
const mockContext: EarnContextType = {
...MOCK_EARN_CONTEXT,
depositedBalance: '1000',
setWithdrawAmount: vi.fn(),
};
vi.mocked(useEarnContext).mockReturnValue(mockContext);
render();
const container = screen.getByTestId('ockEarnBalance');
expect(container).toHaveClass('custom-class');
});
});