import '@testing-library/jest-dom';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest';
import { useBreakpoints } from '../../internal/hooks/useBreakpoints';
import { useIcon } from '../../internal/hooks/useIcon';
import { SwapSettings } from './SwapSettings';
import { SwapSettingsSlippageDescription } from './SwapSettingsSlippageDescription';
import { SwapSettingsSlippageInput } from './SwapSettingsSlippageInput';
import { SwapSettingsSlippageTitle } from './SwapSettingsSlippageTitle';
vi.mock('@/internal/hooks/useIcon', () => ({
useIcon: vi.fn(() => ),
}));
vi.mock('./SwapSettingsSlippageLayout', () => ({
SwapSettingsSlippageLayout: vi.fn(({ children }) => (
{children}
)),
}));
vi.mock('./SwapSettingsSlippageLayoutBottomSheet', () => ({
SwapSettingsSlippageLayoutBottomSheet: vi.fn(({ children }) => (
{children}
)),
}));
vi.mock('./SwapSettingsSlippageTitle', () => ({
SwapSettingsSlippageTitle: vi.fn(() => Title
),
}));
vi.mock('./SwapSettingsSlippageDescription', () => ({
SwapSettingsSlippageDescription: vi.fn(() => Description
),
}));
vi.mock('./SwapSettingsSlippageInput', () => ({
SwapSettingsSlippageInput: vi.fn(() => Input
),
}));
vi.mock('@/internal/hooks/useBreakpoints', () => ({
useBreakpoints: vi.fn(),
}));
vi.mock('../../internal/components/FocusTrap', () => ({
FocusTrap: vi.fn(({ children }) => (
{children}
)),
}));
const useBreakpointsMock = useBreakpoints as Mock;
const renderComponent = (props = {}) => {
return render(
Title
Description
,
);
};
describe('SwapSettings', () => {
beforeEach(() => {
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: vi.fn().mockImplementation((query) => ({
matches: false,
media: query,
onchange: null,
addListener: vi.fn(),
removeListener: vi.fn(),
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
dispatchEvent: vi.fn(),
})),
});
vi.clearAllMocks();
useBreakpointsMock.mockReturnValue('md');
});
it('should render with default props and handle dropdown toggle for desktop', async () => {
renderComponent();
expect(screen.getByTestId('ockSwapSettings_Settings')).toBeInTheDocument();
expect(screen.getByTestId('mock-icon')).toBeInTheDocument();
const button = screen.getByRole('button', {
name: /toggle swap settings/i,
});
fireEvent.click(button);
await waitFor(() => {
expect(screen.getByTestId('ockSwapSettingsDropdown')).toBeInTheDocument();
expect(screen.getByTestId('mock-layout')).toBeInTheDocument();
expect(screen.getByText('Title')).toBeInTheDocument();
expect(screen.getByText('Description')).toBeInTheDocument();
expect(screen.getByText('Input')).toBeInTheDocument();
});
fireEvent.click(button);
await waitFor(() => {
expect(
screen.queryByTestId('ockSwapSettingsDropdown'),
).not.toBeInTheDocument();
});
});
it('should render with custom props and handle outside click', async () => {
render(
,
);
expect(screen.getByText('Custom Text')).toBeInTheDocument();
expect(screen.getByTestId('ockSwapSettings_Settings')).toHaveClass(
'custom-class',
);
expect(useIcon).toHaveBeenCalledWith({ icon: 'custom-icon' });
const button = screen.getByRole('button', {
name: /toggle swap settings/i,
});
fireEvent.click(button);
await waitFor(() => {
expect(screen.getByTestId('ockSwapSettingsDropdown')).toBeInTheDocument();
});
fireEvent.click(
screen.getByRole('button', { name: /toggle swap settings/i }),
);
await waitFor(() => {
expect(
screen.queryByTestId('ockSwapSettingsDropdown'),
).not.toBeInTheDocument();
});
});
it('should handle non-valid React elements as children', async () => {
render(
Title
Plain text child
,
);
const button = screen.getByRole('button', {
name: /toggle swap settings/i,
});
fireEvent.click(button);
await waitFor(() => {
expect(screen.getByTestId('ockSwapSettingsDropdown')).toBeInTheDocument();
expect(screen.getByText('Title')).toBeInTheDocument();
expect(screen.getByText('Plain text child')).toBeInTheDocument();
expect(screen.getByText('Input')).toBeInTheDocument();
});
});
it('renders mobile view with Sheet when breakpoint is "sm"', async () => {
useBreakpointsMock.mockReturnValue('sm');
renderComponent();
const button = screen.getByRole('button', {
name: /toggle swap settings/i,
});
fireEvent.click(button);
await waitFor(() => {
expect(screen.getByTestId('ockSheet')).toBeInTheDocument();
});
});
it('renders desktop view with Popover when breakpoint is not "sm"', async () => {
useBreakpointsMock.mockReturnValue('md');
renderComponent();
const button = screen.getByRole('button', {
name: /toggle swap settings/i,
});
fireEvent.click(button);
await waitFor(() => {
expect(
screen.getByRole('button', { name: /toggle swap settings/i }),
).toBeInTheDocument();
expect(screen.getByTestId('ockSwapSettingsDropdown')).toBeInTheDocument();
});
fireEvent.click(
screen.getByRole('button', { name: /toggle swap settings/i }),
);
await waitFor(() => {
expect(
screen.queryByTestId('ockSwapSettingsDropdown'),
).not.toBeInTheDocument();
});
});
it('closes the sheet when Escape key is pressed', async () => {
useBreakpointsMock.mockReturnValue('sm');
renderComponent();
const button = screen.getByRole('button', {
name: /toggle swap settings/i,
});
fireEvent.click(button);
await waitFor(() => {
expect(screen.getByTestId('ockSheet')).toBeInTheDocument();
});
fireEvent.keyDown(document, { key: 'Escape' });
await waitFor(() => {
expect(screen.queryByTestId('ockSheet')).not.toBeInTheDocument();
});
});
});