import { describe, test, expect, vi } from 'vitest'
import { render, screen, fireEvent } from '@testing-library/react'
import { ZoomControlsUI } from './zoom-controls'
describe('ZoomControlsUI', () => {
const defaultProps = {
zoom: 10,
onChange: vi.fn(),
}
test('renders correctly with default props', () => {
render()
expect(screen.getByLabelText('Increase zoom')).toBeTruthy()
expect(screen.getByLabelText('Decrease zoom')).toBeTruthy()
expect(screen.getByText('10')).toBeTruthy()
})
test('handles zoom increase correctly', () => {
render()
fireEvent.click(screen.getByLabelText('Increase zoom'))
expect(defaultProps.onChange).toHaveBeenCalledWith(11)
})
test('handles zoom decrease correctly', () => {
render()
fireEvent.click(screen.getByLabelText('Decrease zoom'))
expect(defaultProps.onChange).toHaveBeenCalledWith(9)
})
test('respects min and max zoom limits', () => {
const props = {
...defaultProps,
zoom: 24,
maxZoom: 24,
minZoom: 5,
}
const { rerender } = render()
fireEvent.click(screen.getByLabelText('Increase zoom'))
expect(props.onChange).toHaveBeenCalledWith(24) // Should not exceed maxZoom
props.zoom = 5
rerender()
fireEvent.click(screen.getByLabelText('Decrease zoom'))
expect(props.onChange).toHaveBeenCalledWith(5) // Should not go below minZoom
})
test('renders reset button when onReset is provided', () => {
const props = {
...defaultProps,
onReset: vi.fn(),
}
render()
const resetButton = screen.getByLabelText('Reset action')
expect(resetButton).toBeTruthy()
fireEvent.click(resetButton)
expect(props.onReset).toHaveBeenCalledTimes(1)
})
test('does not render reset button when onReset is not provided', () => {
render()
expect(screen.queryByLabelText('Reset action')).toBeNull()
})
test('hides zoom display when showZoom is false', () => {
render()
expect(screen.queryByText('10')).toBeNull()
})
test('shows loading indicator when isLoading is true', () => {
render()
expect(screen.getByRole('progressbar')).toBeTruthy()
})
test('renders in horizontal direction when specified', () => {
render()
// We can't check styles directly without jest-dom, so we'll skip this assertion
expect(screen.getByText('10')).toBeTruthy()
})
test('disables buttons when disabled prop is true', () => {
render()
const increaseButton = screen.getByLabelText('Increase zoom')
const decreaseButton = screen.getByLabelText('Decrease zoom')
expect(increaseButton.hasAttribute('disabled')).toBeTruthy()
expect(decreaseButton.hasAttribute('disabled')).toBeTruthy()
})
})