@salesforce/design-system-react
Version:
Salesforce Lightning Design System for React
690 lines (581 loc) • 23.8 kB
JavaScript
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
/* eslint-disable max-lines */
/* eslint-disable react/no-render-return-value */
import React from 'react';
import ReactDOM from 'react-dom';
import { expect } from 'chai';
import assign from 'lodash.assign';
import TestUtils from 'react-dom/test-utils';
import Input from '../../input';
import Icon from '../../icon';
import InputIcon from '../../icon/input-icon';
import IconSettings from '../../icon-settings';
describe('SLDSInput', function () {
var defaultProps = {
placeholder: 'Placeholder Text'
};
var body;
var renderInput = function renderInput(instance) {
body = document.createElement('div');
document.body.appendChild(body);
/* deepscan-disable REACT_ASYNC_RENDER_RETURN_VALUE */
return ReactDOM.render( /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(IconSettings, {
iconPath: "/assets/icons"
}, instance)), body);
/* deepscan-enable REACT_ASYNC_RENDER_RETURN_VALUE */
};
function removeInput() {
ReactDOM.unmountComponentAtNode(body);
document.body.removeChild(body);
}
var createInput = function createInput(props) {
return /*#__PURE__*/React.createElement(Input, assign({}, defaultProps, props));
};
var getInput = function getInput(props) {
return renderInput(createInput(props));
};
describe('Standard Input with Label', function () {
var component;
var wrapper;
var input;
var label;
beforeEach(function () {
component = getInput({
label: 'Input Label',
id: 'custom-id'
});
var _component$getElement = component.getElementsByClassName('slds-form-element');
var _component$getElement2 = _slicedToArray(_component$getElement, 1);
wrapper = _component$getElement2[0];
var _component$getElement3 = component.getElementsByTagName('input');
var _component$getElement4 = _slicedToArray(_component$getElement3, 1);
input = _component$getElement4[0];
var _component$getElement5 = component.getElementsByClassName('slds-form-element__label');
var _component$getElement6 = _slicedToArray(_component$getElement5, 1);
label = _component$getElement6[0];
});
afterEach(function () {
removeInput();
});
it('is wrapped in div with class "slds-form-element"', function () {
expect(wrapper.className).to.include('slds-form-element');
});
it('renders label', function () {
expect(label.textContent).to.equal('Input Label');
});
it('renders input element with class "slds-input"', function () {
expect(input.className).to.include('slds-input');
});
it('has an id', function () {
expect(input.getAttribute('id')).to.be.ok;
});
it('can pass custom id', function () {
expect(input.getAttribute('id')).to.equal('custom-id');
});
it('renders placeholder text', function () {
expect(input.getAttribute('placeholder')).to.equal('Placeholder Text');
});
it('has associated label for tag pointing to id of input', function () {
var labelForTag = label.getAttribute('for');
var inputId = input.getAttribute('id');
expect(labelForTag).to.equal(inputId);
});
});
describe('Input without Assistive Text Label', function () {
var component;
var label;
var input;
beforeEach(function () {
component = getInput({
assistiveText: {
label: 'Assistive Label'
}
});
var _component$getElement7 = component.getElementsByTagName('input');
var _component$getElement8 = _slicedToArray(_component$getElement7, 1);
input = _component$getElement8[0];
var _component$getElement9 = component.getElementsByClassName('slds-form-element__label');
var _component$getElement10 = _slicedToArray(_component$getElement9, 1);
label = _component$getElement10[0];
});
afterEach(function () {
removeInput();
});
it('renders label (assitive)', function () {
expect(label.textContent).to.equal('Assistive Label');
});
it('label has class "slds-assistive-text"', function () {
expect(label.className).to.include('slds-assistive-text');
});
it('has associated label for tag pointing to id of input', function () {
var labelForTag = label.getAttribute('for');
var inputId = input.getAttribute('id');
expect(labelForTag).to.equal(inputId);
});
});
describe('Read Only Input', function () {
var component;
var label;
var input;
beforeEach(function () {
component = getInput({
label: 'Input Label',
readOnly: true
});
var _component$getElement11 = component.getElementsByTagName('input');
var _component$getElement12 = _slicedToArray(_component$getElement11, 1);
input = _component$getElement12[0];
var _component$getElement13 = component.getElementsByTagName('label');
var _component$getElement14 = _slicedToArray(_component$getElement13, 1);
label = _component$getElement14[0];
});
afterEach(function () {
removeInput();
});
it('label has class "slds-form-element__label"', function () {
expect(label.className).to.include('slds-form-element__label');
});
it('input has attribute "readonly"', function () {
expect(input.getAttribute('readonly')).to.equal('');
});
});
describe('Static Input', function () {
var component;
var label;
var input;
beforeEach(function () {
component = getInput({
label: 'Input Label',
isStatic: true
});
var _component$getElement15 = component.getElementsByTagName('span');
var _component$getElement16 = _slicedToArray(_component$getElement15, 1);
label = _component$getElement16[0];
// eslint-disable-next-line prefer-destructuring
input = component.getElementsByTagName('span')[1];
});
afterEach(function () {
removeInput();
});
it('label is a span and has class "slds-form-element__label"', function () {
expect(label.className).to.include('slds-form-element__label');
});
it('input is a span and has class "slds-form-element__static"', function () {
expect(input.className).to.include('slds-form-element__static');
});
});
describe('Disabled Input', function () {
var component;
var input;
beforeEach(function () {
component = getInput({
label: 'Input Label',
disabled: true
});
var _component$getElement17 = component.getElementsByTagName('input');
var _component$getElement18 = _slicedToArray(_component$getElement17, 1);
input = _component$getElement18[0];
});
afterEach(function () {
removeInput();
});
it('input has attribute "disabled"', function () {
expect(input.getAttribute('disabled')).to.equal('');
});
});
describe('Multiple Inputs', function () {
var component1;
var component2;
var input1;
var input2;
beforeEach(function () {
component1 = getInput({
className: 'input-one',
label: 'Input One'
});
component2 = getInput({
className: 'input-two',
label: 'Input Two'
});
var _component1$getElemen = component1.getElementsByTagName('input');
var _component1$getElemen2 = _slicedToArray(_component1$getElemen, 1);
input1 = _component1$getElemen2[0];
var _component2$getElemen = component2.getElementsByTagName('input');
var _component2$getElemen2 = _slicedToArray(_component2$getElemen, 1);
input2 = _component2$getElemen2[0];
});
afterEach(function () {
var inputNodes = document.querySelectorAll('.slds-form-element');
inputNodes[0].parentNode.remove(inputNodes[0]);
inputNodes[1].parentNode.remove(inputNodes[1]);
});
it('each input has unique generated id', function () {
expect(input1.getAttribute('id')).to.not.equal(input2.getAttribute('id'));
});
});
describe('Required Input in Error State', function () {
var component;
var wrapper;
var error;
var input;
beforeEach(function () {
component = getInput({
label: 'Input Label',
required: true,
errorText: 'Error Message'
});
var _component$getElement19 = component.getElementsByClassName('slds-form-element');
var _component$getElement20 = _slicedToArray(_component$getElement19, 1);
wrapper = _component$getElement20[0];
var _component$getElement21 = component.getElementsByTagName('input');
var _component$getElement22 = _slicedToArray(_component$getElement21, 1);
input = _component$getElement22[0];
var _component$getElement23 = component.getElementsByClassName('slds-form-element__help');
var _component$getElement24 = _slicedToArray(_component$getElement23, 1);
error = _component$getElement24[0];
});
afterEach(function () {
removeInput();
});
it('input wrapper contains an <abbr> that has class "slds-required"', function () {
expect(component.getElementsByTagName('abbr')[0].className).to.include('slds-required');
});
it('input wrapper has class "slds-has-error"', function () {
expect(wrapper.className).to.include('slds-has-error');
});
it('renders error message', function () {
expect(error.textContent).to.equal('Error Message');
});
it('has associated aria-describedby pointing to id of error message', function () {
var inputDescribedby = input.getAttribute('aria-describedby');
var errorId = error.getAttribute('id');
expect(inputDescribedby).to.equal(errorId);
});
});
describe('Input with Left Clickable Icon', function () {
var component;
var elementControl;
var leftButton;
var iconAssistiveText;
var clickCallback = sinon.spy();
beforeEach(function () {
component = getInput({
iconLeft: /*#__PURE__*/React.createElement(InputIcon, {
assistiveText: {
icon: 'Passed assistive text to icon'
},
name: "search",
category: "utility",
onClick: clickCallback
})
});
var _component$getElement25 = component.getElementsByTagName('button');
var _component$getElement26 = _slicedToArray(_component$getElement25, 1);
leftButton = _component$getElement26[0];
var _component$getElement27 = component.getElementsByClassName('slds-assistive-text');
var _component$getElement28 = _slicedToArray(_component$getElement27, 1);
iconAssistiveText = _component$getElement28[0];
var _component$getElement29 = component.getElementsByClassName('slds-form-element__control');
var _component$getElement30 = _slicedToArray(_component$getElement29, 1);
elementControl = _component$getElement30[0];
});
afterEach(function () {
removeInput();
});
it('element control has class "slds-input-has-icon"', function () {
expect(elementControl.className).to.include('slds-input-has-icon');
});
it('passes "assitiveText" down to icon', function () {
expect(iconAssistiveText.textContent).to.equal('Passed assistive text to icon');
});
it('icon renders button BEFORE input in DOM', function () {
var render = elementControl.innerHTML;
expect(render.indexOf('<button')).to.be.below(render.indexOf('<input'));
});
it('icon can be clicked', function () {
TestUtils.Simulate.click(leftButton);
expect(clickCallback.calledOnce).to.be.true;
});
});
describe('Input with Right Clickable Icon', function () {
var component;
var elementControl;
var leftButton;
var clickCallback = sinon.spy();
beforeEach(function () {
component = getInput({
iconRight: /*#__PURE__*/React.createElement(InputIcon, {
assistiveText: {
icon: 'Passed assistive text to icon'
},
name: "search",
category: "utility",
onClick: clickCallback
})
});
var _component$getElement31 = component.getElementsByTagName('button');
var _component$getElement32 = _slicedToArray(_component$getElement31, 1);
leftButton = _component$getElement32[0];
var _component$getElement33 = component.getElementsByClassName('slds-form-element__control');
var _component$getElement34 = _slicedToArray(_component$getElement33, 1);
elementControl = _component$getElement34[0];
});
afterEach(function () {
removeInput();
});
it('element control has class "slds-input-has-icon"', function () {
expect(elementControl.className).to.include('slds-input-has-icon');
});
it('icon renders button AFTER input in DOM', function () {
var render = elementControl.innerHTML;
expect(render.indexOf('<button')).to.be.above(render.indexOf('<input'));
});
it('icon can be clicked', function () {
TestUtils.Simulate.click(leftButton);
expect(clickCallback.calledOnce).to.be.true;
});
});
describe('Input with Non-Clickable Icon', function () {
var component;
var elementControl;
beforeEach(function () {
component = getInput({
iconRight: /*#__PURE__*/React.createElement(Icon, {
name: "search",
category: "utility"
})
});
var _component$getElement35 = component.getElementsByClassName('slds-form-element__control');
var _component$getElement36 = _slicedToArray(_component$getElement35, 1);
elementControl = _component$getElement36[0];
});
afterEach(function () {
removeInput();
});
it('button tag does not exist', function () {
expect(elementControl.getElementsByTagName('button')[0]).to.not.be.ok;
});
});
describe('Input with Loading Spinner Icon', function () {
var component;
var spinner;
var input;
beforeEach(function () {
component = getInput({
assistiveText: {
label: 'Passed assistive text to icon'
},
hasSpinner: true,
iconRight: /*#__PURE__*/React.createElement(InputIcon, {
assistiveText: {
icon: 'Passed assistive text to icon'
},
name: "search",
category: "utility"
}),
id: 'unique-id-4',
label: 'Input Label'
});
var _component$getElement37 = component.getElementsByClassName('slds-spinner');
var _component$getElement38 = _slicedToArray(_component$getElement37, 1);
spinner = _component$getElement38[0];
var _component$getElement39 = component.getElementsByTagName('input');
var _component$getElement40 = _slicedToArray(_component$getElement39, 1);
input = _component$getElement40[0];
});
afterEach(function () {
removeInput();
});
it('renders loading spinner icon', function () {
expect(spinner).to.be.ok;
});
it('input aria-describedby points to id of spinner)', function () {
var spinnerId = spinner.getAttribute('id');
var inputDescribedby = input.getAttribute('aria-describedby');
expect(inputDescribedby).to.include(spinnerId);
});
it('input aria-describedby points to id of spinner AND id of error message)', function () {
var spinnerId = spinner.getAttribute('id');
var inputDescribedby = input.getAttribute('aria-describedby');
expect(inputDescribedby).to.include(spinnerId);
});
});
describe('Input with Loading Spinner Icon & Error', function () {
var component;
var spinner;
var input;
var error;
beforeEach(function () {
component = getInput({
assistiveText: {
label: 'Passed assistive text to icon'
},
required: true,
errorText: 'Error Message',
hasSpinner: true,
iconRight: /*#__PURE__*/React.createElement(InputIcon, {
assistiveText: {
icon: 'Passed assistive text to icon'
},
name: "search",
category: "utility"
}),
id: 'unique-id-4',
label: 'Input Label'
});
var _component$getElement41 = component.getElementsByClassName('slds-spinner');
var _component$getElement42 = _slicedToArray(_component$getElement41, 1);
spinner = _component$getElement42[0];
var _component$getElement43 = component.getElementsByTagName('input');
var _component$getElement44 = _slicedToArray(_component$getElement43, 1);
input = _component$getElement44[0];
var _component$getElement45 = component.getElementsByClassName('slds-form-element__help');
var _component$getElement46 = _slicedToArray(_component$getElement45, 1);
error = _component$getElement46[0];
});
afterEach(function () {
removeInput();
});
it('input aria-describedby points to id of spinner AND id of error message)', function () {
var errorId = error.getAttribute('id');
var spinnerId = spinner.getAttribute('id');
var inputDescribedby = input.getAttribute('aria-describedby');
expect(inputDescribedby).to.equal("".concat(spinnerId, " ").concat(errorId));
});
});
describe('Input with Fixed Left Text', function () {
var component;
var fixedTextLeft;
beforeEach(function () {
component = getInput({
fixedTextLeft: '$',
id: 'unique-id-5',
label: 'Input Label'
});
var _component$getElement47 = component.getElementsByClassName('slds-form-element__addon');
var _component$getElement48 = _slicedToArray(_component$getElement47, 1);
fixedTextLeft = _component$getElement48[0];
});
afterEach(function () {
removeInput();
});
it('renders fixed text node', function () {
expect(fixedTextLeft).to.be.ok;
});
it('renders fixed text node content', function () {
expect(fixedTextLeft.textContent).to.equal('$');
});
});
describe('Counter Input', function () {
var changeOccurred;
var component;
var decrement;
var increment;
var onChangeData;
afterEach(function () {
removeInput();
});
it('increments and decrements as expected', function () {
component = getInput({
onChange: function onChange(event, data) {
onChangeData = data;
},
value: 1,
variant: 'counter'
});
var _component$getElement49 = component.getElementsByClassName('slds-input__button_decrement');
var _component$getElement50 = _slicedToArray(_component$getElement49, 1);
decrement = _component$getElement50[0];
var _component$getElement51 = component.getElementsByClassName('slds-input__button_increment');
var _component$getElement52 = _slicedToArray(_component$getElement51, 1);
increment = _component$getElement52[0];
onChangeData = {};
TestUtils.Simulate.mouseDown(increment);
TestUtils.Simulate.mouseUp(increment);
expect(onChangeData.number === 2 && onChangeData.value === '2').to.be.true;
onChangeData = {};
TestUtils.Simulate.keyDown(increment, {
key: 'Enter',
keyCode: 13,
which: 13
});
TestUtils.Simulate.keyUp(increment, {
key: 'Enter',
keyCode: 13,
which: 13
});
expect(onChangeData.number === 2 && onChangeData.value === '2').to.be.true;
TestUtils.Simulate.mouseDown(decrement);
TestUtils.Simulate.mouseUp(decrement);
expect(onChangeData.number === 0 && onChangeData.value === '0').to.be.true;
onChangeData = {};
TestUtils.Simulate.keyDown(decrement, {
key: 'Enter',
keyCode: 13,
which: 13
});
TestUtils.Simulate.keyUp(decrement, {
key: 'Enter',
keyCode: 13,
which: 13
});
expect(onChangeData.number === 0 && onChangeData.value === '0').to.be.true;
});
it('respects min and max values', function () {
component = getInput({
maxValue: 1,
minValue: 1,
onChange: function onChange() {
changeOccurred = true;
},
value: 1,
variant: 'counter'
});
var _component$getElement53 = component.getElementsByClassName('slds-input__button_decrement');
var _component$getElement54 = _slicedToArray(_component$getElement53, 1);
decrement = _component$getElement54[0];
var _component$getElement55 = component.getElementsByClassName('slds-input__button_increment');
var _component$getElement56 = _slicedToArray(_component$getElement55, 1);
increment = _component$getElement56[0];
changeOccurred = false;
TestUtils.Simulate.mouseDown(increment);
TestUtils.Simulate.mouseUp(increment);
expect(changeOccurred).to.be.false;
expect(increment.disabled).to.be.true;
changeOccurred = false;
TestUtils.Simulate.mouseDown(decrement);
TestUtils.Simulate.mouseUp(decrement);
expect(changeOccurred).to.be.false;
expect(decrement.disabled).to.be.true;
});
it('acknowledges custom step values', function () {
component = getInput({
onChange: function onChange(event, data) {
onChangeData = data;
},
step: 0.1,
value: 1,
variant: 'counter'
});
var _component$getElement57 = component.getElementsByClassName('slds-input__button_decrement');
var _component$getElement58 = _slicedToArray(_component$getElement57, 1);
decrement = _component$getElement58[0];
var _component$getElement59 = component.getElementsByClassName('slds-input__button_increment');
var _component$getElement60 = _slicedToArray(_component$getElement59, 1);
increment = _component$getElement60[0];
onChangeData = {};
TestUtils.Simulate.mouseDown(increment);
TestUtils.Simulate.mouseUp(increment);
expect(onChangeData.number === 1.1 && onChangeData.value === '1.1').to.be.true;
TestUtils.Simulate.mouseDown(decrement);
TestUtils.Simulate.mouseUp(decrement);
expect(onChangeData.number === 0.9 && onChangeData.value === '0.9').to.be.true;
});
});
});
//# sourceMappingURL=input.browser-test.js.map