/* global React, describe, it */ import expect from 'expect' import NumericInput from '../src/NumericInput.jsx' import React from 'react' import TestUtils from 'react-dom/test-utils' function testProp(cfg) { return Promise.all(cfg.map.map(entry => { return new Promise(resolve => { let props = { [cfg.propName] : entry.in } if (entry.otherProps) { props = { ...props, ...entry.otherProps} } let app = TestUtils.renderIntoDocument() let result = cfg.getValue(app) expect(result).toEqual( entry.out, `If the "${cfg.propName}" is set to "${String(entry.in)}" the result should be "${entry.out}" but got "${result}"` ) resolve() }) })) } function testInputProp(cfg) { cfg.getValue = cfg.getValue || (widget => widget.refsInput[cfg.propName]) return testProp(cfg).then(() => { let app = TestUtils.renderIntoDocument() let attrName = cfg.attrName || cfg.propName.toLowerCase() if (attrName == "pattern") { return new Promise(resolve => { expect(app.refsInput.outerHTML.search( new RegExp('\\bpattern="\\.\\*"') )).toNotEqual( -1, `If the "pattern" is not set the corresponding attribute should be set to ".*". The outerHTML was ${app.refsInput.outerHTML}.` ) resolve() }) } if (attrName == "value") { return new Promise(resolve => { expect(app.refsInput.outerHTML.search( new RegExp("\\bvalue=\"\"", "i") )).toNotEqual( -1, `If the "value" is not set the corresponding attribute should be set as "". The outerHTML was ${app.refsInput.outerHTML}.` ) resolve() }) } return new Promise(resolve => { expect(app.refsInput.outerHTML.search( new RegExp("\\b" + attrName + "=", "i") )).toEqual( -1, `If the "${cfg.propName}" is not set the corresponding attribute should not be set. The outerHTML was ${app.refsInput.outerHTML}.` ) resolve() }) }) } function testAllInputProps(cfgArr) { return Promise.all(cfgArr.map(testInputProp)) } describe('NumericInput', () => { it('handles properly all the props', done => { // These are all attached on the input testAllInputProps([ { propName: "name", map: [ { in: "" , out: "" }, { in: "a" , out: "a" }, { in: "b" , out: "b" }, { in: null , out: "" }, { in: undefined, out: "" }, { in: 123 , out: "123" } ] }, { propName: "disabled", map: [ { in: null , out: false }, { in: undefined, out: false }, { in: true , out: true }, { in: false , out: false } ] }, { propName: "required", map: [ { in: null , out: false }, { in: undefined, out: false }, { in: true , out: true }, { in: false , out: false } ] }, { propName: "maxLength", map: [ // { in: null , out: 524288 }, // { in: undefined, out: 524288 }, // { in: 0 , out: 524288 }, { in: 1 , out: 1 }, { in: 2 , out: 2 } ] }, { propName: "className", attrName: "class", map: [ { in: "" , out: "" }, { in: "a" , out: "a" }, { in: "b" , out: "b" }, { in: null , out: "" }, { in: undefined, out: "" } ] }, { propName: "readOnly", map: [ { in: null , out: false }, { in: undefined, out: false }, { in: true , out: true }, { in: false , out: false } ] }, { propName: "noValidate", map: [ { in: "novalidate", out: true }, { in: "whatever-string", out: true }, { in: null , out: false }, { in: undefined, out: false }, { in: true , out: true }, { in: false , out: false } ] }, { propName: "pattern", map: [ { in: "" , out: ".*" }, { in: "a" , out: "a" }, { in: "b" , out: "b" }, { in: null , out: ".*" }, { in: undefined, out: ".*" } ] }, { propName: "title", map: [ { in: "" , out: "" }, { in: "a" , out: "a" }, { in: "b" , out: "b" }, { in: null , out: "" }, { in: undefined, out: "" }, { in: 123 , out: "123" } ] }, { propName: "size", map: [ // { in: null , out: null }, // { in: undefined, out: null }, // { in: 0 , out: 0 }, { in: 1 , out: 1 }, { in: 2 , out: 2 } ] }, { propName: "value", map: [ { in: "" , out: "" , otherProps: { strict: true }}, { in: "" , out: "" , otherProps: { strict: false }}, { in: "a" , out: "" , otherProps: { strict: true }}, { in: "a" , out: "a" , otherProps: { strict: false }}, { in: "b" , out: "" , otherProps: { strict: true }}, { in: "b" , out: "b" , otherProps: { strict: false }}, { in: null , out: "" , otherProps: { strict: true }}, { in: null , out: "" , otherProps: { strict: false }}, { in: undefined, out: "" , otherProps: { strict: true }}, { in: undefined, out: "" , otherProps: { strict: false }}, { in: 123 , out: "123" , otherProps: { strict: true }}, { in: 123 , out: "123" , otherProps: { strict: false }} ] }, { propName: "defaultValue", // attrName: "value", getValue : (widget) => widget.refsInput.value, map: [ { in: "" , out: "" , otherProps: { strict: true }}, { in: "" , out: "" , otherProps: { strict: false }}, { in: "a" , out: "" , otherProps: { strict: true }}, { in: "a" , out: "a" , otherProps: { strict: false }}, { in: "b" , out: "" , otherProps: { strict: true }}, { in: "b" , out: "b" , otherProps: { strict: false }}, { in: null , out: "" , otherProps: { strict: true }}, { in: null , out: "" , otherProps: { strict: false }}, { in: undefined, out: "" , otherProps: { strict: true }}, { in: undefined, out: "" , otherProps: { strict: false }}, { in: 123 , out: "123" , otherProps: { strict: true }}, { in: 123 , out: "123" , otherProps: { strict: false }} ] }//, // { // propName: "step", // map: [ // { in: null , out: null }, // { in: undefined, out: null }, // { in: 0 , out: 0 }, // { in: 1 , out: 1 }, // { in: 2 , out: 2 } // ] // }, // { // propName: "min", // map: [ // { in: null , out: 524288 }, // { in: undefined, out: 524288 }, // { in: 0 , out: 524288 }, // { in: 1 , out: 1 }, // { in: 2 , out: 2 } // ] // }, // { // propName: "max", // map: [ // { in: null , out: 524288 }, // { in: undefined, out: 524288 }, // { in: 0 , out: 524288 }, // { in: 1 , out: 1 }, // { in: 2 , out: 2 } // ] // }, // { // propName: "precision", // map: [ // { in: null , out: 524288 }, // { in: undefined, out: 524288 }, // { in: 0 , out: 524288 }, // { in: 1 , out: 1 }, // { in: 2 , out: 2 } // ] // } ]) // TODO: Test props which are not passed to the input .then(() => {}) .then(() => done()) .catch(done) }); it('can disable inline styles', done => { let app = TestUtils.renderIntoDocument(); function walk(el, visitor) { visitor(el); if (el.childNodes) { for (let i = 0, l = el.childNodes.length; i < l; i++) { let child = el.childNodes[i] if (child.nodeType === 1) { walk(child, visitor) } } } } walk(app.refsWrapper, el => { expect(!el.getAttribute('style')).toEqual(true); }); app = TestUtils.renderIntoDocument(); walk(app.refsWrapper, el => { expect(!el.getAttribute('style')).toEqual(true); }); done(); }); })