UNPKG

ember-frost-bunsen

Version:
129 lines (109 loc) 3.68 kB
import {expect} from 'chai' import Ember from 'ember' // eslint-disable-line const {$, merge} = Ember import {$hook} from 'ember-hook' import { expectBunsenInputNotToHaveError, expectBunsenInputToHaveError, expectLabel } from './common' /** * Check whether or not input box is disabled/enabled as expected * @param {jQuery} $renderer - jQuery instance of renderer DOM (wrapper tag) * @param {Boolean} disabled - whether or not input should be disabled */ function expectDisabledInput ($renderer, disabled) { const determinerPlusVerb = disabled ? 'a disabled' : 'an enabled' expect( $renderer.find('input'), `renders ${determinerPlusVerb} date input` ) .to.have.prop('disabled', disabled) } /** * Check that property is renderer as a boolean with expected state * @param {String} bunsenId - bunsen ID for property rendered as boolean * @param {Object} state - expected state of boolean renderer */ export function expectWithState (bunsenId, state) { const hook = state.hook || 'bunsenForm' const hookName = `${hook}-${bunsenId}` const $renderer = $hook(hookName).first() const defaults = { disabled: false, hasValue: false } state = merge(defaults, state) expect( $renderer, 'has expected class' ) .to.have.class('frost-bunsen-input-date') expectDisabledInput($renderer, state.disabled) if (state.label !== undefined) { expectLabel($renderer, state.label) } if (state.hasValue) { expect($renderer).to.have.class('frost-bunsen-has-value') } else { expect($renderer).to.not.have.class('frost-bunsen-has-value') } if (state.error) { expectBunsenInputToHaveError(bunsenId, state.error, hook) } else { expectBunsenInputNotToHaveError(bunsenId, hook) } } // Helpers taken from ember-pickaday /** * Open the renderer's date picker * @param {String} bunsenId - the bunsen ID for the property * @param {String} hook - the hook for the form * @returns {Object} an object than can selectDate */ export function openDatepicker (bunsenId, hook) { hook = hook || 'bunsenForm' const hookName = `${hook}-${bunsenId}-datePicker-input` const $input = $hook(hookName) $input.click() return PikadayInteractor } const PikadayInteractor = { selectorForMonthSelect: '.pika-lendar:visible .pika-select-month', selectorForYearSelect: '.pika-lendar:visible .pika-select-year', selectDate: function (date) { const day = date.getDate() const month = date.getMonth() const year = date.getFullYear() const selectEvent = 'ontouchend' in document ? 'touchend' : 'mousedown' $(this.selectorForYearSelect).val(year) triggerNativeEvent($(this.selectorForYearSelect)[0], 'change') $(this.selectorForMonthSelect).val(month) triggerNativeEvent($(this.selectorForMonthSelect)[0], 'change') triggerNativeEvent($('td[data-day="' + day + '"] button:visible')[0], selectEvent) }, selectedDay: function () { return $('.pika-single td.is-selected button').html() }, selectedMonth: function () { return $(this.selectorForMonthSelect + ' option:selected').val() }, selectedYear: function () { return $(this.selectorForYearSelect + ' option:selected').val() }, minimumYear: function () { return $(this.selectorForYearSelect).children().first().val() }, maximumYear: function () { return $(this.selectorForYearSelect).children().last().val() } } function triggerNativeEvent (element, eventName) { if (document.createEvent) { const event = document.createEvent('Events') event.initEvent(eventName, true, false) element.dispatchEvent(event) } else { element.fireEvent('on' + eventName) } }