import { expect } from 'chai'; import { arrayOf, bool, number, string, } from 'prop-types'; import React from 'react'; import { or, explicitNull } from '..'; import callValidator from './_callValidator'; describe('or', () => { it('returns a function', () => { expect(typeof or([string, bool])).to.equal('function'); }); it('throws if given a non-array', () => { expect(() => or()).to.throw(TypeError); expect(() => or(null)).to.throw(TypeError); expect(() => or(undefined)).to.throw(TypeError); expect(() => or({})).to.throw(TypeError); }); it('throws if given an array of zero or one items', () => { expect(() => or([])).to.throw(RangeError); expect(() => or([string])).to.throw(RangeError); }); function assertPasses(validator, element, propName) { expect(callValidator(validator, element, propName, '"or" test')).to.equal(null); } function assertFails(validator, element, propName) { expect(callValidator(validator, element, propName, '"or" test')).to.be.instanceOf(Error); } it('allows composing propTypes', () => { const validator = or([bool, number, arrayOf(string)]); assertPasses(validator, (
), 'a'); assertPasses(validator, (), 'a'); assertPasses(validator, (), 'a'); assertPasses(validator, (), 'a'); assertFails(validator, (), 'a'); assertFails(validator, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertPasses(validator.isRequired, (), 'a'); assertFails(validator.isRequired, (), 'a'); assertFails(validator.isRequired, (), 'a'); assertFails(validator.isRequired, (), 'a'); }); describe('works with explicitNull', () => { it('works when outer and inner are optional', () => { assertPasses(or([bool.isRequired, explicitNull()]), (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull()]), (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull()]), (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull()]), (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull()]), (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]), (), 'a'); }); it('works when outer is optional, inner is required', () => { assertPasses(or([bool.isRequired, explicitNull().isRequired]), (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull().isRequired]), (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull().isRequired]), (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull().isRequired]), (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]), (), 'a'); assertPasses(or([bool.isRequired, explicitNull().isRequired]), (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]), (), 'a'); }); it('works when outer is required, inner is optional', () => { assertPasses(or([bool.isRequired, explicitNull()]).isRequired, (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]).isRequired, (), 'a'); assertPasses(or([bool.isRequired, explicitNull()]).isRequired, (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]).isRequired, (), 'a'); assertPasses(or([bool.isRequired, explicitNull()]).isRequired, (), 'a'); assertPasses(or([explicitNull(), bool.isRequired]).isRequired, (), 'a'); assertFails(or([bool.isRequired, explicitNull()]).isRequired, (), 'a'); assertFails(or([explicitNull(), bool.isRequired]).isRequired, (), 'a'); assertFails(or([bool.isRequired, explicitNull()]).isRequired, (), 'a'); assertFails(or([explicitNull(), bool.isRequired]).isRequired, (), 'a'); }); it('works when outer is required, inner is required', () => { assertPasses(or([bool.isRequired, explicitNull().isRequired]).isRequired, (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]).isRequired, (), 'a'); assertPasses(or([bool.isRequired, explicitNull().isRequired]).isRequired, (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]).isRequired, (), 'a'); assertPasses(or([bool.isRequired, explicitNull().isRequired]).isRequired, (), 'a'); assertPasses(or([explicitNull().isRequired, bool.isRequired]).isRequired, (), 'a'); assertFails(or([bool.isRequired, explicitNull().isRequired]).isRequired, (), 'a'); assertFails(or([explicitNull().isRequired, bool.isRequired]).isRequired, (), 'a'); assertFails(or([bool.isRequired, explicitNull().isRequired]).isRequired, (), 'a'); assertFails(or([explicitNull().isRequired, bool.isRequired]).isRequired, (), 'a'); }); }); });