UNPKG

ldx-widgets

Version:

widgets

556 lines (413 loc) 15.5 kB
describe 'TextInput 2', -> React = require 'react' TextInput = React.createFactory require('../../src/components/text_input_2') TestUtils = require 'react-addons-test-utils' ReactDOM = require 'react-dom' dispatcher = require('../../src/dispatcher') ValidationContext = require '../../src/context_wrapper' afterEach -> dispatcher.dispatch 'clear-all' ### Note About ValidationContext The input validation uses context to gain access to the app level validation methods Because context is only present when the component is a child of the application, it is not present in tests The ValidationContext component, simply wraps the input component, and adds the validation context methods so they are present in the tests ### #--------------------------------------------------------------------- Default Props it 'Should have default props', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: '' }) input = wrapper.getInput() defaultProps = input.props expect(defaultProps.type).to.equal('text') expect(defaultProps.loading).to.equal(no) expect(defaultProps.className).to.equal('text-input') expect(defaultProps.placeholder).to.equal('') expect(defaultProps.validation).to.equal(off) expect(defaultProps.disabled).to.equal(no) expect(defaultProps.showClear).to.equal(no) expect(defaultProps.autoComplete).to.equal(no) expect(defaultProps.isInPopover).to.equal(no) expect(defaultProps.spellCheck).to.equal(no) expect(defaultProps.focusOnMount).to.equal(no) #--------------------------------------------------------------------- Spinner it 'Should show a spinner when the loading prop is true', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: loading: yes value: '' }) inputSpinner = TestUtils.scryRenderedDOMComponentsWithClass wrapper, 'input-spinner' expect(inputSpinner.length).to.equal(1) # #--------------------------------------------------------------------- Validation it 'Should not show an error when the validation is off', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: loading: no validation: off value: '' }) el = TestUtils.scryRenderedDOMComponentsWithClass wrapper, 'field-wrap' expect(el[0].className).to.equal('field-wrap') it 'Should NOT show an error before a change has ocurred', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: key: 'test' loading: no validation: null value: '' }) el = TestUtils.scryRenderedDOMComponentsWithClass wrapper, 'field-wrap' expect(el[0].className).to.equal('field-wrap') it 'Should set valueHasChanged to true after a change occurs', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: key: 'test' loading: no validation: null value: '' }) input = wrapper.getInput() expect(input.state.valueHasChanged).to.equal(no) inputEl = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' TestUtils.Simulate.change inputEl, { key: 'Enter' type: 'keyup' } expect(input.state.valueHasChanged).to.equal(yes) it 'Should show an error before a change has ocurred and forceShowAllErrors is on', () -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: key: 'test' loading: no validation: [] value: '' }) dispatcher.dispatch 'force-show-all', {autoHideAfter: no, isInPopover: no} el = wrapper.getInputEl() expect(el.className).to.equal('field-wrap invalid') it 'Should show an error when the validation is static non null value and a change occurs', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: key: 'test' loading: no validation: messages: ['fail'] value: '' }) inputEl = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' TestUtils.Simulate.change inputEl, { key: 'Enter' type: 'keyup' } el = wrapper.getInputEl() expect(el.className).to.equal('field-wrap invalid') it 'Should show an error when the validation is a method that returns a non null value', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: key: 'test' loading: no validation: (value) -> [ { messages: ['fail'] } ] value: '' }) inputEl = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' TestUtils.Simulate.change inputEl, { key: 'Enter' type: 'keyup' } el = wrapper.getInputEl() expect(el.className).to.equal('field-wrap invalid') it 'Should show an error when the validation changes, but not the value', (done) -> node = document.createElement('div') document.body.appendChild(node) wrapper = ReactDOM.render ValidationContext({ factory: TextInput childProps: key: 'test' loading: no validation: null value: 'one' }), node input = wrapper.getInput() input.setState {valueHasChanged: yes}, -> wrapper = ReactDOM.render ValidationContext({ factory: TextInput childProps: key: 'test' loading: no validation: messages: ['fail'] value: 'two' }), node, -> el = wrapper.getInputEl() expect(el.className).to.equal('field-wrap invalid') done() it 'Should not show an error when the validation fails, but loading is on', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: '' loading: yes validation: -> [] }) input = wrapper.getInput() errorBtn = TestUtils.findRenderedDOMComponentWithClass input, 'field-errors-show' el = ReactDOM.findDOMNode errorBtn expect(el.className).to.equal('field-errors-show is-hidden') # #--------------------------------------------------------------------- Delayed action it 'Should fire a delayed action after a set number of milliseconds', (cb) -> actionFn = sinon.spy() wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: '' delayedActionOnChange: action: actionFn interval: 10 }) input = wrapper.getInput() expect(typeof input.props.delayedActionOnChange.action).to.equal('function') expect(typeof input.props.delayedActionOnChange.interval).to.equal('number') # Fire the action to make sure it's executing input.fireDelayedAction() setTimeout -> expect(actionFn.calledOnce).to.equal(true) cb() , 20 # #--------------------------------------------------------------------- Text change it 'Should set the value of the input to the value prop, and return it with getValue method', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' }) input = wrapper.getInput() subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' inputValue = ReactDOM.findDOMNode(subInput).value returnedValue = input.getValue() expect(inputValue).to.equal('new value') expect(returnedValue).to.equal('new value') # #--------------------------------------------------------------------- DOM State it 'Should disable the input when disabled is true', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' disabled: yes }) input = wrapper.getInput() subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' el = ReactDOM.findDOMNode(subInput) expect(el.disabled).to.equal(yes) it 'Should set the tab index', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' tabIndex: 34 }) subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' el = ReactDOM.findDOMNode(subInput) expect(el.getAttribute('tabindex')).to.equal('34') it 'Should set the DOM id', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' id: 'theOneAndOnly' }) subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' el = ReactDOM.findDOMNode(subInput) expect(el.getAttribute('id')).to.equal('theOneAndOnly') it 'Should set the DOM spellcheck attr', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' spellCheck: yes }) subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' el = ReactDOM.findDOMNode(subInput) expect(el.getAttribute('spellcheck')).to.equal('true') it 'Should set the DOM autoComplete attr', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' autoComplete: "on" }) subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' el = ReactDOM.findDOMNode(subInput) expect(el.getAttribute('autocomplete')).to.equal('on') it 'Should set the DOM max length attr', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' maxLength: 4 }) subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' el = ReactDOM.findDOMNode(subInput) expect(el.getAttribute('maxlength')).to.equal('4') it 'Should set the DOM placeholder attr', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' placeholder: 'type something here' }) subInput = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' el = ReactDOM.findDOMNode(subInput) expect(el.getAttribute('placeholder')).to.equal('type something here') it 'Should apply the wrapper class to the outer div', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' wrapperClass: 'blanket' }) matches = TestUtils.scryRenderedDOMComponentsWithClass wrapper, 'blanket' expect(matches.length).to.equal(1) it 'Should apply arbitrary inline styles to the wrapper div passed in a style prop', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' style: width: 239 }) input = wrapper.getInput() el = ReactDOM.findDOMNode(input) expect(el.style.width).to.equal("239px") it 'Should wrap the input component in a label element when wrapperLabel is passed', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' wrapperLabel: 'First Name' }) matches = TestUtils.scryRenderedDOMComponentsWithTag wrapper, 'label' expect(matches.length).to.equal(1) #--------------------------------------------------------------------- Clear button it 'Should show a clear button when text is entered and showClear is on', -> wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' showClear: on }) clear = TestUtils.scryRenderedDOMComponentsWithClass wrapper, 'search-clear' expect(clear.length).to.equal(1) it 'Should clear the input when clear button is clicked', (cb) -> method = sinon.spy() wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: value: 'new value' showClear: on onChange: method }) clear = TestUtils.findRenderedDOMComponentWithClass wrapper, 'search-clear' TestUtils.Simulate.click clear setTimeout -> expect(method.calledWith('')).to.equal(true) cb() , 10 #--------------------------------------------------------------------- handlers it 'Should fire a passed onKeyUp handler on key up', (cb) -> method = sinon.spy() wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: onKeyUp: method value: 'test' }) input = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' TestUtils.Simulate.keyUp input, { key: 'Enter' type: 'keyup' } setTimeout -> expect(method.calledOnce).to.equal(true) cb() , 10 it 'Should fire a passed onChange handler, passing the input value as the param, on change', (cb) -> method = sinon.spy() wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: onChange: method value: 'test' }) input = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' TestUtils.Simulate.change input, { key: 'Enter' type: 'keyup' } setTimeout -> expect(method.calledOnce).to.equal(true) expect(method.calledWith('test')).to.equal(true) cb() , 10 it 'Should fire a passed onEnterKey handler on enter press', (cb) -> method = sinon.spy() wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: onEnterKey: method value: 'test' }) input = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' e = key: 'Enter' type: 'keyup' keyCode: 13 TestUtils.Simulate.keyUp input, e setTimeout -> expect(method.calledOnce).to.equal(true) cb() , 10 it 'Should fire all other passed handlers: focus, blur, key press, key down', (cb) -> blur = sinon.spy() focus = sinon.spy() keyPress = sinon.spy() keyDown = sinon.spy() wrapper = TestUtils.renderIntoDocument(ValidationContext { factory: TextInput childProps: onFocus: focus onBlur: blur onKeyDown: keyDown onKeyPress: keyPress value: 'test' }) input = TestUtils.findRenderedDOMComponentWithClass wrapper, 'text-input' e = key: 'Enter' type: 'keyup' keyCode: 13 TestUtils.Simulate.focus input TestUtils.Simulate.blur input TestUtils.Simulate.keyDown input TestUtils.Simulate.keyPress input setTimeout -> expect(focus.calledOnce).to.equal(true) expect(blur.calledOnce).to.equal(true) expect(keyPress.calledOnce).to.equal(true) expect(keyDown.calledOnce).to.equal(true) cb() , 10