import React, { useState } from 'react'; import { fireEvent, render, screen } from '@testing-library/react'; import InputRange from './InputRange'; import axe from '../../../../axe-helper'; describe('', () => { it('renders and updates as expected', async () => { const ControlledInputRange = () => { const [value, setValue] = useState(75); return ; }; render(); const input = (await screen.findByRole('slider')) as HTMLInputElement; expect(input.value).toEqual('75'); fireEvent.change(input, { target: { value: '25' } }); expect(input.value).toEqual('25'); }); describe('With Controls', () => { it('renders disabled decrement button when value is same as min', () => { const ControlledInputRangeWithControls = () => { const [value, setValue] = useState(0); return ; }; render(); const decrementButton = screen.getByTitle('decrement'); const inputRange = screen.getByTitle('range') as HTMLInputElement; expect(decrementButton).toHaveAttribute('disabled'); expect(inputRange.value).toBe('0'); }); it('disables the decrement button when value reaches min', () => { const ControlledInputRangeWithControls = () => { const [value, setValue] = useState(1); return ; }; render(); const decrementButton = screen.getByTitle('decrement'); const inputRange = screen.getByTitle('range') as HTMLInputElement; fireEvent.click(decrementButton); expect(decrementButton).toHaveAttribute('disabled'); expect(inputRange.value).toBe('0'); }); it("doesn't trigger onChange when tries to decrement lower than min", () => { const onChange = jest.fn(); const ControlledInputRangeWithControls = () => { const [value] = useState(100); return ; }; render(); const decrementButton = screen.getByTitle('decrement'); fireEvent.click(decrementButton); expect(onChange).not.toHaveBeenCalled(); }); it('renders disabled increment button when value is same as max', () => { const ControlledInputRangeWithControls = () => { const [value, setValue] = useState(200); return ; }; render(); const incrementButton = screen.getByTitle('increment'); const inputRange = screen.getByTitle('range') as HTMLInputElement; expect(incrementButton).toHaveAttribute('disabled'); expect(inputRange.value).toBe('200'); }); it('disables the increment button when value reaches max', () => { const ControlledInputRangeWithControls = () => { const [value, setValue] = useState(199); return ; }; render(); const incrementButton = screen.getByTitle('increment'); const inputRange = screen.getByTitle('range') as HTMLInputElement; fireEvent.click(incrementButton); expect(incrementButton).toHaveAttribute('disabled'); expect(inputRange.value).toBe('200'); }); it("doesn't trigger onChange when tries to increment higher than max", () => { const onChange = jest.fn(); const ControlledInputRangeWithControls = () => { const [value] = useState(100); return ; }; render(); const incrementButton = screen.getByTitle('increment'); fireEvent.click(incrementButton); expect(onChange).not.toHaveBeenCalled(); }); it('should return a numeric value when input changes', () => { const onChange = jest.fn(); const ControlledInputRangeWithControls = () => { const [value] = useState(199); return ; }; render(); const inputRange = screen.getByTitle('range') as HTMLInputElement; fireEvent.change(inputRange, { target: { value: '198' } }); expect(onChange).toHaveBeenCalledWith(198); }); }); it('renders the component with no a11y violations', async () => { const ControlledInputRange = () => { const [value, setValue] = useState(51); return ; }; const { container } = render(); const results = await axe(container.innerHTML); expect(container.firstChild).toMatchSnapshot(); expect(results).toHaveNoViolations(); }); });