import { expect } from 'chai'; import { any, bool } from 'prop-types'; import React from 'react'; import { mutuallyExclusiveProps } from '..'; import callValidator from './_callValidator'; describe('mutuallyExclusiveProps', () => { it('throws when not given a valid propType', () => { expect(() => mutuallyExclusiveProps()).to.throw(TypeError); expect(() => mutuallyExclusiveProps(null)).to.throw(TypeError); expect(() => mutuallyExclusiveProps({})).to.throw(TypeError); expect(() => mutuallyExclusiveProps([])).to.throw(TypeError); }); it('throws when given 0 props', () => { expect(() => mutuallyExclusiveProps(any)).to.throw(TypeError); }); it('returns a function', () => { expect(typeof mutuallyExclusiveProps(any, 'a', 'b')).to.equal('function'); }); function assertPasses(validator, element, propName) { expect(callValidator(validator, element, propName)).to.equal(null); } function assertFails(validator, element, propName) { expect(callValidator(validator, element, propName)).to.be.instanceOf(Error); } it('passes with one mutually exclusive prop', () => { assertPasses( mutuallyExclusiveProps(bool, 'b'), (
), 'a', ); assertPasses( mutuallyExclusiveProps(bool, 'a'), (), 'b', ); }); it('passes when mutually exclusive props are not both provided', () => { const prop1 = 'foo'; const prop2 = 'bar'; const validator = mutuallyExclusiveProps(bool, prop1, prop2); assertPasses(validator, , 'a'); assertPasses(validator.isRequired, , 'a'); assertPasses(validator, , prop1); assertPasses(validator.isRequired, , prop1); assertPasses(validator, , prop2); assertPasses(validator.isRequired, , prop2); }); it('fails when the provided propType fails', () => { const prop1 = 'foo'; const prop2 = 'bar'; const validator = mutuallyExclusiveProps(bool, prop1, prop2); assertFails(validator, , prop1); assertFails(validator, , prop2); }); it('fails when mutually exclusive props are provided', () => { const prop1 = 'foo'; const prop2 = 'bar'; const validator = mutuallyExclusiveProps(bool, prop1, prop2); assertFails(validator, , prop1); assertFails(validator, , prop2); }); it('passes when one of the exclusive props is null/undefined', () => { const prop1 = 'foo'; const prop2 = 'bar'; const validator = mutuallyExclusiveProps(bool, prop1, prop2); assertPasses(validator, (), prop1); assertPasses(validator, (), prop2); assertPasses(validator, (), prop1); assertPasses(validator, (), prop2); }); it('fails when required, and one of the exclusive props is null/undefined', () => { const prop1 = 'foo'; const prop2 = 'bar'; const validator = mutuallyExclusiveProps(bool, prop1, prop2).isRequired; assertFails(validator, (), prop2); assertFails(validator, (), prop1); assertFails(validator, (), prop2); assertFails(validator, (), prop1); }); });