import { useOutsideClick } from '@/internal/hooks/useOutsideClick';
import { degenToken } from '@/token/constants';
import { useOnchainKit } from '@/useOnchainKit';
import { fireEvent, render, screen } from '@testing-library/react';
import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest';
import {
type Config,
type UseConnectReturnType,
useAccount,
useConnect,
} from 'wagmi';
import { Buy } from './Buy';
import { useBuyContext } from './BuyProvider';
vi.mock('./BuyProvider', () => ({
useBuyContext: vi.fn(),
BuyProvider: ({ children }: { children: React.ReactNode }) => (
{children}
),
}));
vi.mock('./BuyDropdown', () => ({
BuyDropdown: () => BuyDropdown
,
}));
vi.mock('./BuyButton', () => ({
BuyButton: () => Buy
,
}));
vi.mock('@/internal/hooks/useOutsideClick', () => ({
useOutsideClick: vi.fn(),
}));
vi.mock('@/useOnchainKit', () => ({
useOnchainKit: vi.fn(),
}));
vi.mock('wagmi', () => ({
useAccount: vi.fn(),
useConnect: vi.fn(),
}));
type useOutsideClickType = ReturnType<
typeof vi.fn<
(
ref: React.RefObject,
callback: (event: MouseEvent) => void,
) => void
>
>;
describe('Buy', () => {
let mockSetIsOpen: ReturnType;
let mockOutsideClickCallback: (e: MouseEvent) => void;
beforeEach(() => {
mockSetIsOpen = vi.fn();
(useBuyContext as Mock).mockReturnValue({
isDropdownOpen: false,
setIsDropdownOpen: mockSetIsOpen,
lifecycleStatus: {
statusName: 'idle',
statusData: {
maxSlippage: 10,
},
},
to: {
token: degenToken,
amount: 10,
setAmount: vi.fn(),
},
address: '0x123',
});
(useAccount as Mock).mockReturnValue({
address: '0x123',
});
vi.mocked(useConnect).mockReturnValue({
connectors: [{ id: 'mockConnector' }],
connect: vi.fn(),
status: 'connected',
} as unknown as UseConnectReturnType);
(useOutsideClick as unknown as useOutsideClickType).mockImplementation(
(_, callback) => {
mockOutsideClickCallback = callback;
},
);
(useOnchainKit as Mock).mockReturnValue({
projectId: 'mock-project-id',
});
vi.clearAllMocks();
});
it('renders the Buy component', () => {
render();
expect(screen.getByText('Buy')).toBeInTheDocument();
expect(screen.getByText('DEGEN')).toBeInTheDocument();
});
it('closes the dropdown when clicking outside the container', () => {
(useBuyContext as Mock).mockReturnValue({
isDropdownOpen: true,
setIsDropdownOpen: mockSetIsOpen,
lifecycleStatus: {
statusName: 'idle',
statusData: {
maxSlippage: 10,
},
},
to: {
token: degenToken,
amount: 10,
setAmount: vi.fn(),
},
});
render();
expect(screen.getByTestId('mock-BuyDropdown')).toBeDefined();
mockOutsideClickCallback({} as MouseEvent);
expect(mockSetIsOpen).toHaveBeenCalledWith(false);
});
it('does not close the dropdown when clicking inside the container', () => {
(useBuyContext as Mock).mockReturnValue({
isDropdownOpen: true,
setIsDropdownOpen: mockSetIsOpen,
lifecycleStatus: {
statusName: 'idle',
statusData: {
maxSlippage: 10,
},
},
to: {
token: degenToken,
amount: 10,
setAmount: vi.fn(),
},
});
render();
expect(screen.getByTestId('mock-BuyDropdown')).toBeDefined();
fireEvent.click(screen.getByTestId('mock-BuyDropdown'));
expect(mockSetIsOpen).not.toHaveBeenCalled();
});
it('should not trigger click handler when dropdown is closed', () => {
render();
expect(screen.queryByTestId('mock-BuyDropdown')).not.toBeInTheDocument();
});
it('should pass sessionToken to BuyProvider', () => {
const sessionToken = 'test-session-token';
render(
,
);
// Verify BuyProvider is rendered (which receives the sessionToken prop)
expect(screen.getByTestId('mock-BuyProvider')).toBeInTheDocument();
});
});