/* global describe, it */ import expect from 'expect' import NumericInput from '../src/NumericInput.jsx' import React from 'react' import TestUtils from 'react-dom/test-utils' const INVALID_CLASS = "has-error" class Wrapper extends React.Component { constructor(...args) { super(...args) this.state = this.props } render() { return ( ) } } describe('NumericInput', function() { it('respects the noValidate prop', function(done) { let onInvalidCalled = false function testInvalidEvent() { onInvalidCalled = true } let widget = TestUtils.renderIntoDocument( ) window.setTimeout(function() { expect( onInvalidCalled, "Must not call the onInvalid callback" ).toEqual(false) expect( widget.refsWrapper.className.indexOf(INVALID_CLASS), "Must not have the '" + INVALID_CLASS + "' class" ).toEqual(-1) done() }, 50) }) it('renders as invalid if it is both empty and required', (done) => { let onInvalidCalled = false function testInvalidEvent() { onInvalidCalled = true } let widget = TestUtils.renderIntoDocument( ) setTimeout(() => { expect(widget.refsInput.required).toEqual(true, "Must be required") expect(widget.refsInput.validity.valid).toEqual(false, "Must not be valid") expect(widget.refsInput.value).toEqual("", "Must have empty value") expect(onInvalidCalled).toEqual( true, "Must call the onInvalid callback" ) expect( widget.refsWrapper.className.indexOf(INVALID_CLASS), "Must have the '" + INVALID_CLASS + "' class" ).toNotEqual(-1) done() }, 500) }) it('renders as invalid if the value length exceeds maxLength', (done) => { let onInvalidCalled = false function testInvalidEvent() { onInvalidCalled = true } let widget = TestUtils.renderIntoDocument( ) setTimeout(() => { expect(widget.refsInput.value).toEqual('1234') expect(widget.refsWrapper.className.indexOf(INVALID_CLASS)).toNotEqual(-1) expect(onInvalidCalled).toEqual( true, "Must trigger 'invalid' if the initial value is longer than the maxLength" ) done() }, 50) }) it('renders as invalid if the value does not match a pattern', (done) => { let onInvalidCalled = false function testInvalidEvent() { onInvalidCalled = true } let widget = TestUtils.renderIntoDocument( ) setTimeout(() => { expect(widget.refsWrapper.className.indexOf(INVALID_CLASS)).toNotEqual(-1) expect(onInvalidCalled).toEqual(true) done() }, 50) }) it('does not render as invalid if the value does match a pattern', (done) => { let onInvalidCalled = false function testInvalidEvent() { onInvalidCalled = true } let widget = TestUtils.renderIntoDocument( ) setTimeout(() => { expect(widget.refsWrapper.className.indexOf(INVALID_CLASS)).toEqual(-1) expect(onInvalidCalled).toEqual(false) done() }, 50) }) it('handles setCustomValidity()', (done) => { let onInvalidCalled = false let validationError = null function testInvalidEvent(msg) { onInvalidCalled = true validationError = msg } let widget = TestUtils.renderIntoDocument( ) widget.refsInput.value = "abc" widget.refsInput.setCustomValidity("This is a test") TestUtils.Simulate.change(widget.refsInput) setTimeout(() => { expect(widget.refsWrapper.className.indexOf(INVALID_CLASS)).toNotEqual(-1) expect(onInvalidCalled).toEqual(true) expect(validationError).toEqual("This is a test") done() }, 50) }) it('does not call onValid multiple times in sequence', (done) => { let _called = 0 let widget = TestUtils.renderIntoDocument( _called += 1 }/>) expect(_called).toEqual(1, "Must call the onValid callback when the initial render produces valid value") widget.setState({ value: 5 }) expect(widget.refs.NumericInput.refsInput.value).toEqual('5') expect(_called).toEqual(1, "Must not call the onValid callback after setting valid value") widget.setState({ maxLength: 5 }) expect(widget.refs.NumericInput.refsInput.maxLength).toEqual(5) expect(_called).toEqual(1, "Must not call the onValid callback after setting big enough maxLength") widget.setState({ required: true }) expect(widget.refs.NumericInput.refsInput.required).toEqual(true) expect(_called).toEqual(1, "Must not call the onValid callback after setting required to true while the value is not empty") widget.setState({ value: 6 }) expect(widget.refs.NumericInput.refsInput.value).toEqual('6') expect(_called).toEqual(1, "Must not call the onValid callback after transition to another valid value") done() }) it('does not call onInvalid multiple times in sequence') })