import { expect } from 'chai'; import { number } from 'prop-types'; import React from 'react'; import { valuesOf } from '..'; import callValidator from './_callValidator'; describe('valuesOf', () => { it('returns a function', () => { expect(typeof valuesOf(() => {})).to.equal('function'); }); it('throws when not given a function', () => { expect(() => valuesOf()).to.throw(TypeError); expect(() => valuesOf(null)).to.throw(TypeError); expect(() => valuesOf(undefined)).to.throw(TypeError); expect(() => valuesOf([])).to.throw(TypeError); expect(() => valuesOf({})).to.throw(TypeError); expect(() => valuesOf('')).to.throw(TypeError); expect(() => valuesOf(42)).to.throw(TypeError); expect(() => valuesOf(true)).to.throw(TypeError); }); function assertPasses(validator, element, propName) { expect(callValidator(validator, element, propName, '"valuesOf" passing test')).to.equal(null); } function assertFails(validator, element, propName) { expect(callValidator(validator, element, propName, '"valuesOf" failing test')).to.be.instanceOf(Error); } it('passes on null/undefined', () => { const validator = valuesOf(() => {}); assertPasses(validator, (
), 'foo'); assertPasses(validator, (), 'foo'); }); it('fails on null/undefined when required', () => { const validator = valuesOf(() => {}).isRequired; assertFails(validator, (), 'foo'); assertFails(validator, (), 'foo'); }); it('passes when the validator passes on all values', () => { const validator = valuesOf(number); assertPasses( validator, ( ), 'foo', ); }); it('behaves on null values', () => { assertPasses( valuesOf(number), (), 'foo', ); assertPasses( valuesOf(number).isRequired, (), 'foo', ); assertFails( valuesOf(number.isRequired), (), 'foo', ); assertFails( valuesOf(number.isRequired).isRequired, (), 'foo', ); }); it('fails when any value fails', () => { const validator = valuesOf(number); assertFails( validator, (), 'foo', ); assertFails( validator.isRequired, (), 'foo', ); }); it('passes on non-nullary primitives', () => { const validator = valuesOf(number.isRequired); assertPasses(validator, (), 'a'); assertPasses(validator, (), 'a'); assertPasses(validator, (), 'a'); assertPasses(validator, (), 'a'); assertPasses(validator, (), 'a'); assertPasses(validator, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); }); it('passes on functions and arrays', () => { const validator = valuesOf(number.isRequired); assertPasses(validator, (