import { describe, test, vi, expect, beforeEach } from 'vitest' import { render, screen, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { MeasurementToolsUI } from './measurement-tools' import type { MeasurementToolsComponentProps } from './types' import type { MeasurementMode } from '../types' import { changeMeasurementModeOptions, DEFAULT_MEASUREMENT_TOOLS_MODES, DEFAULT_MEASUREMENT_TOOLS_UNITS, } from '../../../tests/config' describe('MeasurementToolsUI', () => { const mockOnActionToggle = vi.fn() const mockOnChangeMode = vi.fn() const mockOnChangeUnit = vi.fn() beforeEach(() => { vi.clearAllMocks() }) test('should enable measurement', async () => { const { container } = render( , ) const rulerButton = within(container).getByLabelText( 'Click on the map to start measuring', ) await userEvent.click(rulerButton) expect(mockOnActionToggle).toHaveBeenCalledWith(true) }) for (const [mode, label] of Object.entries(changeMeasurementModeOptions)) { test(`should change mode to ${label}`, async () => { const { container } = render( , ) const dropdownButton = within(container).getAllByRole('button')[1]! await userEvent.click(dropdownButton) const modeButton = await screen.findByRole('menuitem', { name: label, }) await userEvent.click(modeButton) expect(mockOnChangeMode).toHaveBeenCalledWith(mode) }) } test('should change meters and kilometers units', async () => { const { container } = render( , ) const dropdownButton = within(container).getAllByRole('button')[1]! await userEvent.click(dropdownButton) const unitButton = await screen.findByText('Unit of measurement') await userEvent.click(unitButton) const dialog = await screen.findByRole('dialog') const radioGroup = within(dialog).getByRole('radiogroup') const kilometerRadioButton = within(radioGroup).getByText('Kilometers') await userEvent.click(kilometerRadioButton) const saveButton = within(dialog).getByText('Save') await userEvent.click(saveButton) expect(mockOnChangeUnit).toHaveBeenCalledWith('kilometer') }) test('should change feet and miles units', async () => { const { container } = render( , ) const dropdownButton = within(container).getAllByRole('button')[1]! await userEvent.click(dropdownButton) const unitButton = await screen.findByText('Unit of measurement') await userEvent.click(unitButton) const dialog = await screen.findByRole('dialog') const feetAndMilesButton = within(dialog).getByText('Feet and Miles') await userEvent.click(feetAndMilesButton) const radioGroup = await within(dialog).findByRole('radiogroup') const mileRadioButton = await within(radioGroup).findByText('Mile') await userEvent.click(mileRadioButton) const saveButton = within(dialog).getByText('Save') await userEvent.click(saveButton) expect(mockOnChangeUnit).toHaveBeenCalledWith('mile') }) }) interface ComponentProps { enabled: boolean modes: MeasurementToolsComponentProps['modes'] modeSelected: MeasurementToolsComponentProps['modeSelected'] units: MeasurementToolsComponentProps['units'] mockOnActionToggle: MeasurementToolsComponentProps['onActionToggle'] mockOnChangeMode: MeasurementToolsComponentProps['onChangeMode'] mockOnChangeUnit: MeasurementToolsComponentProps['onChangeUnit'] } // Aux const Component = ({ enabled, modes, modeSelected, units, mockOnActionToggle, mockOnChangeMode, mockOnChangeUnit, }: ComponentProps) => { return ( ) }