import React from 'react'; import { fireEvent, createEvent } from '@testing-library/react'; import renderWithTheme from '../../../testUtils/renderWithTheme'; import Slider from '..'; const mockGetBoundingClientRect = () => { const mockedRef = { mockElement: { getBoundingClientRect: jest.fn() }, get current() { return this.mockElement; }, set current(newCurrent) { if (newCurrent !== null) { jest.spyOn(newCurrent, 'getBoundingClientRect').mockReturnValue({ x: 0, width: 100, }); } this.mockElement = newCurrent; }, }; jest.spyOn(React, 'useRef').mockReturnValue(mockedRef); }; describe('Slider', () => { it('can slide on mouse move', () => { mockGetBoundingClientRect(); const mockOnChange = jest.fn(); const { getByTestId } = renderWithTheme( ); const thumb = getByTestId('slider-thumb'); expect(thumb).toBeInTheDocument(); const mouseDown = createEvent.mouseDown(thumb); thumb.dispatchEvent(mouseDown); const mouseMove = createEvent.mouseMove(document, { clientX: 40, clientY: 0, }); const mouseUp = createEvent.mouseUp(document); fireEvent(document, mouseMove); fireEvent(document, mouseUp); expect(mockOnChange).toHaveBeenCalledWith(70); }); it('can slide on touch move', async () => { mockGetBoundingClientRect(); const mockOnChange = jest.fn(); const { getByTestId } = renderWithTheme( ); const thumb = getByTestId('slider-thumb'); expect(thumb).toBeInTheDocument(); fireEvent.touchStart(thumb); fireEvent.touchMove(thumb, { changedTouches: [{ pageX: 30, pageY: 0 }], }); expect(mockOnChange).toHaveBeenNthCalledWith(1, 30); fireEvent.touchMove(thumb, { touches: [{ pageX: 75, pageY: 0 }], }); expect(mockOnChange).toHaveBeenNthCalledWith(2, 75); }); it('shows tooltip', () => { const { getByText } = renderWithTheme( ); expect(getByText('my tooltip')).toBeInTheDocument(); }); it.each` key | keyCode | expectedValue | shouldPreventScrolling ${'PageUp'} | ${33} | ${52} | ${true} ${'PageDown'} | ${34} | ${48} | ${true} ${'ArrowLeft'} | ${37} | ${48} | ${true} ${'ArrowUp'} | ${38} | ${52} | ${true} ${'ArrowRight'} | ${39} | ${52} | ${true} ${'ArrowDown'} | ${40} | ${48} | ${true} ${'KeyA'} | ${65} | ${50} | ${false} `( 'prevents scrolling and slides when pressing $key key', ({ key, keyCode, expectedValue, shouldPreventScrolling, }: { expectedValue: number; key: string; keyCode: number; shouldPreventScrolling: boolean; }) => { const mockOnChange = jest.fn(); const { getByTestId } = renderWithTheme( ); const thumb = getByTestId('slider-thumb'); expect(thumb).toBeInTheDocument(); const keyDownEvent = createEvent.keyDown(thumb, { key, keyCode, }); fireEvent(thumb, keyDownEvent); expect(keyDownEvent.defaultPrevented).toBe(shouldPreventScrolling); expect(mockOnChange).toHaveBeenCalledWith(expectedValue); } ); });