UNPKG

wix-style-react

Version:
202 lines (189 loc) • 7.55 kB
import ReactTestUtils from 'react-dom/test-utils'; import dropdownBaseDriverFactory from '../DropdownBase/DropdownBase.legacy.driver'; const calendarDriverFactory = ({ element }) => { const getCalendar = () => element.querySelector('.DayPicker'); const getCalendarWrapper = () => element.querySelector('.DayPicker-wrapper'); const getNthDay = n => element.querySelectorAll( '[role="gridcell"]:not([class*="disabled"])>[data-outsideday="false"]', )[n]; const getNthDayOfTheMonth = n => element.querySelectorAll('[role="gridcell"]>[data-outsideday="false"]')[n]; const getDayOfDate = (year, month, day) => element.querySelector( `[role="gridcell"]>[data-outsideday="false"][data-date='${year}-${month}-${day}']`, ); const getSelectedDay = () => element.querySelector( '[role="gridcell"][aria-selected=true]>[data-outsideday="false"]', ); const getYearDropdown = () => element.querySelector('[data-hook="datepicker-year-dropdown-button"]'); const getMonthDropdownButton = () => element.querySelector('[data-hook="datepicker-month-dropdown-button"]'); const getNthYear = n => element.querySelector(`[data-hook="dropdown-item-${n}"]`); const getMonthCaption = () => element.querySelector('[data-hook="datepicker-month-caption"]'); const getYearCaption = () => element.querySelector('[data-hook="datepicker-year-caption"]'); const getMonthAndYear = () => [getMonthCaption(), getYearCaption()]; const getNthWeekDayName = n => element.querySelectorAll(`[data-hook="weekday-day"]`)[n]; const getPrevMonthButton = () => element.querySelector('[data-hook="datepicker-left-arrow"]'); const getNextMonthButton = () => element.querySelector('[data-hook="datepicker-right-arrow"]'); const getFocusedDay = () => element.querySelector('.DayPicker-Day:focus'); const getVisuallyUnfocusedDay = () => element.querySelector('.unfocused'); const getMonthContainers = () => element.querySelectorAll('.DayPicker-Month'); const getVisibleMonths = () => element.querySelectorAll('[class*="DayPicker-Month"]'); const getSelectedDays = () => element.querySelectorAll( '[role="gridcell"][aria-selected=true]>[data-outsideday="false"]', ); const driver = { exists: () => !!element, close: () => ReactTestUtils.Simulate.keyDown(getFocusedDay(), { key: 'Escape', keyCode: 27, }), isVisible: () => !!getCalendar(), getCurrentMonthWithYear: () => getMonthAndYear() ? getMonthAndYear() .map(elm => elm.textContent) .join(' ') : '', getNthWeekDayName: (n = 0) => getNthWeekDayName(n) ? getNthWeekDayName(n).textContent : '', clickOnNthDay: (n = 0) => getNthDay(n) && ReactTestUtils.Simulate.click(getNthDay(n)), clickDay: date => { const day = getDayOfDate( date.getFullYear(), date.getMonth(), date.getDate(), ); if (day) { ReactTestUtils.Simulate.click(day); } else { throw new Error( `ERROR: CalendarDriver.clickDay() - The given date (${date.toString()}) is not visible`, ); } }, isDayActive: date => { const day = getDayOfDate( date.getFullYear(), date.getMonth(), date.getDate(), ); if (day) { return day.parentElement.getAttribute('aria-disabled') === 'false'; } else { throw new Error( `ERROR: CalendarDriver.isDayActive() - The given date (${date.toString()}) is not visible`, ); } }, clickOnNthDayOfTheMonth: (n = 0) => getNthDayOfTheMonth(n) && ReactTestUtils.Simulate.click(getNthDayOfTheMonth(n)), clickOnSelectedDay: () => ReactTestUtils.Simulate.click(getSelectedDay()), clickOnYearDropdown: () => ReactTestUtils.Simulate.click(getYearDropdown()), clickOnMonthDropdown: () => ReactTestUtils.Simulate.click(getMonthDropdownButton()), clickOnNthYear: (n = 1) => ReactTestUtils.Simulate.mouseDown(getNthYear(n)), clickOnPrevMonthButton: () => ReactTestUtils.Simulate.click(getPrevMonthButton()), clickOnNextMonthButton: () => ReactTestUtils.Simulate.click(getNextMonthButton()), keyboardNextYear: () => ReactTestUtils.Simulate.keyDown(getCalendarWrapper(), { key: 'ArrowDown', keyCode: 40, }), keyboardPrevYear: () => ReactTestUtils.Simulate.keyDown(getCalendarWrapper(), { key: 'ArrowUp', keyCode: 38, }), isHeaderVisible: () => !!element.querySelector('[data-hook="datepicker-head"]'), isYearDropdownExists: () => !!element.querySelector('[data-hook="datepicker-year-dropdown"]'), isYearCaptionExists: () => !!getYearCaption(), isMonthDropdownExists: () => !!element.querySelector('[data-hook="datepicker-month-dropdown"]'), isMonthCaptionExists: () => !!getMonthCaption(), getMonthCaption: () => getMonthCaption().textContent, getMonthDropdownLabel: () => getMonthDropdownButton().textContent, getSelectedYear: () => getYearDropdown().textContent, /** Returns the text of the focused day or `null` if there is no focused day */ getFocusedDay: () => { const focusedDayElement = getFocusedDay(); return !!focusedDayElement ? focusedDayElement.textContent : null; }, getFocusedDayElement: () => getFocusedDay(), pressLeftArrow: () => ReactTestUtils.Simulate.keyDown(getFocusedDay(), { key: 'ArrowLeft', keyCode: 37, }), pressRightArrow: () => ReactTestUtils.Simulate.keyDown(getFocusedDay(), { key: 'ArrowRight', keyCode: 39, }), getSelectedDay: () => getSelectedDay().textContent, getWidth: () => element.style.width, triggerKeyDown: params => ReactTestUtils.Simulate.keyDown(getFocusedDay(), params), isFocusedDayVisuallyUnfocused: () => getFocusedDay().classList.contains('unfocused'), containsVisuallyUnfocusedDay: () => !!getVisuallyUnfocusedDay(), isTwoMonthsLayout: () => getMonthContainers().length === 2, getMonthDropdownDriver: () => { ReactTestUtils.Simulate.click( element.querySelector('[data-hook="datepicker-month-dropdown-button"]'), ); const dropdownBaseDriver = dropdownBaseDriverFactory({ element: element.querySelector( '[data-hook="datepicker-month-dropdown"]', ), }); return dropdownBaseDriver.getDropdownLayoutDriver(); }, getYearDropdownDriver: () => { ReactTestUtils.Simulate.click( element.querySelector('[data-hook="datepicker-year-dropdown-button"]'), ); const dropdownBaseDriver = dropdownBaseDriverFactory({ element: element.querySelector( '[data-hook="datepicker-year-dropdown"]', ), }); return dropdownBaseDriver.getDropdownLayoutDriver(); }, getNumOfVisibleMonths: () => getVisibleMonths().length, getNumOfSelectedDays: () => getSelectedDays().length, getSelectedDays: () => { const result = []; getSelectedDays().forEach(item => { const date = item .getAttribute('data-date') .split('-') .map(part => parseInt(part)); result.push(new Date(date[0], date[1], date[2])); }); return result; }, mouseClickOutside: () => document.body.dispatchEvent(new Event('mouseup', { cancelable: true })), }; return driver; }; export default calendarDriverFactory;