import { describe, test, expect, vi, beforeEach } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' import { BasemapsUI } from './basemaps' import type { BasemapOption } from './types' // Mock the child components vi.mock('./header', () => ({ Header: ({ onChangeCollapsed }: { onChangeCollapsed: () => void }) => (
), })) vi.mock('./group', () => ({ Group: ({ values, selected, onChange, }: { values: BasemapOption[] selected: string | null onChange: (id: string) => void }) => (
{values.map((option) => ( ))}
), })) vi.mock('./group-wrapper', () => ({ GroupWrapper: ({ title, children, }: { title: string children: React.ReactNode }) => (
{children}
), })) vi.mock('../responsive-drawer/responsive-drawer', () => ({ ResponsiveDrawer: ({ children, collapsed, }: { children: React.ReactNode collapsed: boolean }) => (
{children}
), })) describe('BasemapsUI', () => { const mockOptions: BasemapOption[] = [ { id: 'basemap1', label: 'Basemap 1', icon: 'icon1.png', group: 'Group 1' }, { id: 'basemap2', label: 'Basemap 2', icon: 'icon2.png', group: 'Group 1' }, { id: 'basemap3', label: 'Basemap 3', icon: 'icon3.png', group: 'Group 2' }, ] const mockOnChange = vi.fn() beforeEach(() => { mockOnChange.mockReset() }) test('should render with toggle button initially', () => { render( , ) // Drawer should be collapsed initially const drawer = screen.getByTestId('mock-drawer') expect(drawer.getAttribute('data-collapsed')).toBe('true') // Toggle button should be visible expect(screen.getAllByRole('button')[0]).toBeDefined() }) test('should show drawer when toggle button is clicked', () => { render( , ) // Click toggle button const toggleButton = screen.getAllByRole('button')[0]! fireEvent.click(toggleButton) // Drawer should not be collapsed after toggle const drawer = screen.getByTestId('mock-drawer') expect(drawer.getAttribute('data-collapsed')).toBe('false') }) test('should pass correct props to Group component', () => { render( , ) // Click toggle button to show drawer const toggleButton = screen.getAllByRole('button')[0]! fireEvent.click(toggleButton) // Group wrappers should be rendered with correct titles const groupWrappers = screen.getAllByTestId('mock-group-wrapper') expect(groupWrappers.length).toBe(2) // Two groups expect(groupWrappers[0]?.getAttribute('data-title')).toContain('Group 1') expect(groupWrappers[1]?.getAttribute('data-title')).toContain('Group 2') // Check basemap options are rendered expect(screen.getByTestId('basemap-option-basemap1')).toBeDefined() expect(screen.getByTestId('basemap-option-basemap2')).toBeDefined() expect(screen.getByTestId('basemap-option-basemap3')).toBeDefined() }) test('should call onChange when a basemap is selected', () => { render( , ) // Click toggle button to show drawer const toggleButton = screen.getAllByRole('button')[0]! fireEvent.click(toggleButton) // Click a basemap option const basemapOption = screen.getByTestId('basemap-option-basemap2') fireEvent.click(basemapOption) // onChange should be called with correct ID expect(mockOnChange).toHaveBeenCalledWith('basemap2') }) test('should handle small devices correctly using media query', () => { // Mock matchMedia for small devices window.matchMedia = vi.fn().mockImplementation((query: string) => ({ matches: query.includes('max-width'), media: query, onchange: null, addListener: vi.fn(), removeListener: vi.fn(), addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), })) render( , ) // Check if drawer behavior is appropriate for small devices const drawer = screen.getByTestId('mock-drawer') // Toggle button should still be visible on small devices const toggleButton = screen.getAllByRole('button')[0] expect(toggleButton).toBeDefined() // Drawer should be collapsed initially even on small devices expect(drawer.getAttribute('data-collapsed')).toBe('true') }) })