UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

435 lines (401 loc) 15.3 kB
"use strict"; var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _createReactClass = require("create-react-class"); var _createReactClass2 = _interopRequireDefault(_createReactClass); var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); var _chai = require("chai"); var _chai2 = _interopRequireDefault(_chai); var _chaiEnzyme = require("chai-enzyme"); var _chaiEnzyme2 = _interopRequireDefault(_chaiEnzyme); var _enzyme = require("enzyme"); var _iconSettings = require("../../icon-settings"); var _iconSettings2 = _interopRequireDefault(_iconSettings); var _enzymeHelpers = require("../../../tests/enzyme-helpers"); var _datePicker = require("../../date-picker"); var _datePicker2 = _interopRequireDefault(_datePicker); var _input = require("../../input"); var _input2 = _interopRequireDefault(_input); var _keyCode = require("../../../utilities/key-code"); var _keyCode2 = _interopRequireDefault(_keyCode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Import your external dependencies /* Enzyme Helpers that can mount and unmount React component instances to * the DOM and set `this.wrapper` and `this.dom` within Mocha's `this` * context [full source here](tests/enzyme-helpers.js). `this` can * only be referenced if inside `function () {}`. */ // Import your internal dependencies (for example): /* Set Chai to use chaiEnzyme for enzyme compatible assertions: * https://github.com/producthunt/chai-enzyme */ _chai2.default.use((0, _chaiEnzyme2.default)()); var defaultProps = { id: 'sample-datepicker', value: new Date(2007, 0, 6) }; /* A re-usable demo component fixture outside of `describe` sections * can accept props within each test and be unmounted after each tests. * This wrapping component will be similar to your wrapping component * you will create in the React Storybook for manual testing. */ var DemoComponent = (0, _createReactClass2.default)({ displayName: 'DatepickerDemoComponent', propTypes: { isOpen: _propTypes2.default.bool }, getDefaultProps: function getDefaultProps() { return defaultProps; }, getInitialState: function getInitialState() { return {}; }, // event handlers render: function render() { return _react2.default.createElement(_iconSettings2.default, { iconPath: "/assets/icons" }, _react2.default.createElement(_datePicker2.default, this.props)); } }); /* All tests for component being tested should be wrapped in a root `describe`, * which should be named after the component being tested. * When read aloud, the cumulative `describe` and `it` names should form a coherent * sentence, eg "Date Picker default structure and css is present with expected * attributes set". If you are having trouble constructing a cumulative short * sentence, this may be an indicator that your test is poorly structured. * String provided as first parameter names the `describe` section. Limit to nouns * as much as possible/appropriate.` */ describe('SLDSDatepicker', function () { var _this = this; var mountNode; var wrapper; var triggerClassSelector = '.slds-input__icon'; describe('Assistive technology', function () { /* Detect if presence of accessibility features such as ARIA * roles and screen reader text is present in the DOM. */ beforeEach(function () { mountNode = (0, _enzymeHelpers.createMountNode)({ context: _this }); }); afterEach(function () { (0, _enzymeHelpers.destroyMountNode)({ wrapper: wrapper, mountNode: mountNode }); }); it('has aria-haspopup, correct aria-expanded on input trigger.', function () { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true }), { attachTo: mountNode }); var inputTrigger = wrapper.find(triggerClassSelector); (0, _chai.expect)(inputTrigger.node.getAttribute('aria-haspopup')).to.equal('true'); var ariaExpanded = inputTrigger.find('button').node.getAttribute('aria-expanded'); (0, _chai.expect)(ariaExpanded).to.equal('true'); }); }); // PROPS AND CHILDREN describe('Optional props', function () { var customPlaceholder = 'With custom Input'; var optionalProps = { children: _react2.default.createElement(_input2.default, { placeholder: customPlaceholder, value: "" }) }; beforeEach(function () { mountNode = (0, _enzymeHelpers.createMountNode)({ context: _this }); }); afterEach(function () { (0, _enzymeHelpers.destroyMountNode)({ wrapper: wrapper, mountNode: mountNode }); }); it('has custom input with custom placeholder', function () { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, optionalProps), { attachTo: mountNode }); (0, _chai.expect)(wrapper.find('input').node.getAttribute('placeholder')).to.equal(customPlaceholder); }); }); // EVENTS describe('onClose, onRequestClose, onOpen callbacks are set', function () { var _this2 = this; beforeEach(function () { mountNode = (0, _enzymeHelpers.createMountNode)({ context: _this2 }); }); afterEach(function () { (0, _enzymeHelpers.destroyMountNode)({ wrapper: wrapper, mountNode: mountNode }); }); it('onOpen is executed when trigger is clicked, onClose is executed when date is selected', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { onClose: function onClose() { setTimeout(function () { var month = wrapper.find('.datepicker__month'); (0, _chai.expect)(month.node).to.not.exist; done(); }, 0); }, onRequestClose: function onRequestClose() { var month = wrapper.find('.datepicker__month'); (0, _chai.expect)(month.node).to.exist; }, onOpen: function onOpen() { var firstDayOfMonth = wrapper.find('.datepicker__month [aria-disabled=false]').first(); (0, _chai.expect)(firstDayOfMonth).to.exist; firstDayOfMonth.simulate('click', {}); } }), { attachTo: mountNode }); var trigger = wrapper.find(triggerClassSelector); trigger.simulate('click', {}); }); it('onChange is triggered when date is selected', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { onChange: function onChange(event, data) { console.log('onChange'); setTimeout(function () { var input = wrapper.find('input'); (0, _chai.expect)(input.node.value).to.equal('1/1/2007'); // test callback parameters (0, _chai.expect)(data.date.getTime()).to.equal(new Date('1/1/2007').getTime()); (0, _chai.expect)(data.formattedDate).to.equal('1/1/2007'); done(); }, 0); }, onOpen: function onOpen() { var firstDayOfMonth = wrapper.find('.datepicker__month [aria-disabled=false]').first(); (0, _chai.expect)(firstDayOfMonth).to.exist; firstDayOfMonth.simulate('click', {}); } }), { attachTo: mountNode }); var trigger = wrapper.find(triggerClassSelector); trigger.simulate('click', {}); }); }); describe('keyboard interactions', function () { /* Test event callback functions using Simulate. For more information, view * https://github.com/airbnb/enzyme/blob/master/docs/api/ReactWrapper/simulate.md */ describe('Esc when menu is open', function () { var _this3 = this; beforeEach(function () { mountNode = (0, _enzymeHelpers.createMountNode)({ context: _this3 }); }); afterEach(function () { (0, _enzymeHelpers.destroyMountNode)({ wrapper: wrapper, mountNode: mountNode }); }); it('opens on trigger click, closes on ESC', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { onClose: function onClose() { setTimeout(function () { var month = wrapper.find('.datepicker__month'); (0, _chai.expect)(month.node).to.not.exist; done(); }, 0); }, onOpen: function onOpen() { var firstDayOfMonth = wrapper.find('.datepicker__month [aria-disabled=false]').first(); firstDayOfMonth.simulate('keyDown', { key: 'Esc', keyCode: _keyCode2.default.ESCAPE, which: _keyCode2.default.ESCAPE }); } }), { attachTo: mountNode }); var trigger = wrapper.find(triggerClassSelector); trigger.simulate('click', {}); }); it('navigates to next week', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true, onCalendarFocus: function onCalendarFocus(event, data) { (0, _chai.expect)(data.date.getTime()).to.equal(new Date(2007, 0, 13).getTime()); done(); } }), { attachTo: mountNode }); var selectedDay = wrapper.find('.datepicker__month [aria-selected=true]'); selectedDay.simulate('keyDown', { key: 'Down', keyCode: _keyCode2.default.DOWN, which: _keyCode2.default.DOWN }); }); it('navigates to next day', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true, onCalendarFocus: function onCalendarFocus(event, data) { (0, _chai.expect)(data.date.getTime()).to.equal(new Date(2007, 0, 7).getTime()); done(); } }), { attachTo: mountNode }); var selectedDay = wrapper.find('.datepicker__month [aria-selected=true]'); selectedDay.simulate('keyDown', { key: 'Right', keyCode: _keyCode2.default.RIGHT, which: _keyCode2.default.RIGHT }); }); it('navigates to previous week (that is of a previous month)', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true, onCalendarFocus: function onCalendarFocus(event, data) { (0, _chai.expect)(data.date.getTime()).to.equal(new Date(2006, 11, 30).getTime()); done(); } }), { attachTo: mountNode }); var selectedDay = wrapper.find('.datepicker__month [aria-selected=true]'); selectedDay.simulate('keyDown', { key: 'Up', keyCode: _keyCode2.default.UP, which: _keyCode2.default.UP }); }); it('navigates to previous day', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true, onCalendarFocus: function onCalendarFocus(event, data) { (0, _chai.expect)(data.date.getTime()).to.equal(new Date(2007, 0, 5).getTime()); done(); } }), { attachTo: mountNode }); var selectedDay = wrapper.find('.datepicker__month [aria-selected=true]'); selectedDay.simulate('keyDown', { key: 'Left', keyCode: _keyCode2.default.LEFT, which: _keyCode2.default.LEFT }); }); it('calendar blur, focus on previous month button', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true, onCalendarFocus: function onCalendarFocus(event, data) { (0, _chai.expect)(data.ref.textContent).to.equal('Previous month'); done(); } }), { attachTo: mountNode }); var selectedDay = wrapper.find('.datepicker__month [aria-selected=true]'); selectedDay.simulate('keyDown', { key: 'Tab', keyCode: _keyCode2.default.TAB, which: _keyCode2.default.TAB }); }); it('calendar blur, focus on today', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true, onCalendarFocus: function onCalendarFocus(event, data) { (0, _chai.expect)(data.ref.textContent).to.equal('Today'); done(); } }), { attachTo: mountNode }); var selectedDay = wrapper.find('.datepicker__month [aria-selected=true]'); selectedDay.simulate('keyDown', { key: 'Tab', keyCode: _keyCode2.default.TAB, shiftKey: true, which: _keyCode2.default.TAB }); }); }); }); describe('Disabled', function () { var _this4 = this; var triggerClicked = sinon.spy(); var dialogOpened = sinon.spy(); beforeEach(function () { mountNode = (0, _enzymeHelpers.createMountNode)({ context: _this4 }); }); afterEach(function () { (0, _enzymeHelpers.destroyMountNode)({ wrapper: wrapper, mountNode: mountNode }); }); it('onOpen is not called when disabled', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { disabled: true, onClick: triggerClicked, onOpen: dialogOpened }), { attachTo: mountNode }); var trigger = wrapper.find('#sample-datepicker'); trigger.simulate('click', {}); setTimeout(function () { (0, _chai.expect)(dialogOpened.callCount).to.equal(0); done(); }, 200); }); }); describe('Disable dates', function () { beforeEach(function () { mountNode = (0, _enzymeHelpers.createMountNode)({ context: _this }); }); afterEach(function () { (0, _enzymeHelpers.destroyMountNode)({ wrapper: wrapper, mountNode: mountNode }); }); it('disable weekends', function (done) { wrapper = (0, _enzyme.mount)(_react2.default.createElement(DemoComponent, { isOpen: true, value: new Date(2007, 0, 5), dateDisabled: function dateDisabled(_ref) { var date = _ref.date; return date.getDay() > 5 || date.getDay() < 1; } }), { attachTo: mountNode }); var input = wrapper.find('input'); (0, _chai.expect)(input.node.value).to.equal('1/5/2007'); var disabledDay = wrapper.find('.datepicker__month [aria-disabled=true]').first(); disabledDay.simulate('click', {}); (0, _chai.expect)(input.node.value).to.equal('1/5/2007'); var day = wrapper.find('.datepicker__month [aria-disabled=false]').first(); day.simulate('click', {}); (0, _chai.expect)(input.node.value).to.equal('1/1/2007'); done(); var trigger = wrapper.find(triggerClassSelector); trigger.simulate('click', {}); }); }); });