import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import '@testing-library/jest-dom/extend-expect'; import { setRef } from '../../lib/utils'; import RangeSliderBase, { RangeSliderProps } from './RangeSlider'; import { mockRect, baselineComponent } from '../../testing/utils'; const RangeSlider = (props: RangeSliderProps) => { const getRootRef: RangeSliderProps['getRootRef'] = (el) => { mockRect(el, { w: 100 }); props.getRootRef && setRef(el, props.getRootRef); }; return ; }; const getSlider = () => screen.getByTestId('range'); describe('RangeSlider', () => { baselineComponent(RangeSlider); describe('works uncontrolled', () => { it('uses defaultValue', () => { render(); expect(getSlider()).toHaveAttribute('data-value', '5,6'); }); it('uses full range as fallback', () => { render(); expect(getSlider()).toHaveAttribute('data-value', '0,10'); }); }); describe('works controlled', () => { it('sets value', () => { const { rerender } = render(); expect(getSlider()).toHaveAttribute('data-value', '5,6'); rerender(); expect(getSlider()).toHaveAttribute('data-value', '3,7'); }); it('value overrides defaultValue', () => { render(); expect(getSlider()).toHaveAttribute('data-value', '6,9'); }); }); describe('changes', () => { const pointerPos = (x: number) => ({ clientX: x, clientY: 10 }); describe('with tap', () => { it('moves start', () => { render(); userEvent.click(getSlider(), pointerPos(20)); expect(getSlider()).toHaveAttribute('data-value', '2,7'); }); it('moves end', () => { render(); userEvent.click(getSlider(), pointerPos(80)); expect(getSlider()).toHaveAttribute('data-value', '3,8'); }); }); describe('with drag', () => { it('moves start', async () => { render(); fireEvent.mouseDown(getSlider(), pointerPos(30)); fireEvent.mouseMove(getSlider(), pointerPos(40)); expect(getSlider()).toHaveAttribute('data-value', '4,7'); fireEvent.mouseMove(getSlider(), pointerPos(50)); expect(getSlider()).toHaveAttribute('data-value', '5,7'); fireEvent.mouseUp(getSlider()); }); it('changes direction on overdrag', () => { render(); fireEvent.mouseDown(getSlider(), pointerPos(30)); fireEvent.mouseMove(getSlider(), pointerPos(80)); expect(getSlider()).toHaveAttribute('data-value', '7,8'); fireEvent.mouseUp(getSlider()); }); }); }); });