import { expect } from 'chai'; import React from 'react'; import { restrictedProp } from '..'; import callValidator from './_callValidator'; describe('restrictedProp', () => { it('returns a function', () => { expect(typeof restrictedProp()).to.equal('function'); }); function assertPasses(validator, element, propName, location) { expect(callValidator(validator, element, propName, '"restrictedProp" test', location)).to.equal(null); } function assertFails(validator, element, propName, location) { expect(callValidator(validator, element, propName, '"restrictedProp" test', location)).to.be.instanceOf(Error); } it('passes on null/undefined', () => { assertPasses(restrictedProp(), (
), 'foo', 'prop'); assertPasses(restrictedProp(), (
), 'foo', 'prop'); }); it('fails on any other value', () => { assertFails(restrictedProp(), (
), 'foo', 'prop'); assertFails(restrictedProp(), (
), 'foo', 'prop'); assertFails(restrictedProp(), (
), 'foo', 'prop'); assertFails(restrictedProp(), (
), 'foo', 'prop'); assertFails(restrictedProp(), (
), 'foo', 'prop'); assertFails(restrictedProp(), (
), 'foo', 'prop'); assertFails(restrictedProp(), (
), 'foo', 'prop'); assertFails(restrictedProp(), (
{}} />), 'foo', 'prop'); assertFails(restrictedProp(), (
), 'foo', 'prop'); }); it('allows for custom error message', () => { assertPasses(restrictedProp(() => new TypeError('Custom Error')), (
), 'foo', 'prop'); assertPasses(restrictedProp(() => new TypeError('Custom Error')), (
), 'foo', 'prop'); assertPasses(restrictedProp(() => new TypeError('Custom Error')), (
), 'foo', 'prop'); assertFails(restrictedProp(() => new TypeError('Custom Error')), (
), 'foo', 'prop'); const messageFunction = (props, propName, componentName, location) => `[custom message] The ${propName} ${location} on ${componentName} is not allowed.`; expect(callValidator(restrictedProp(messageFunction), (
), 'foo', '"restrictedProp" test', 'prop')).to.exist .and.be.instanceof(Error) .and.have.property('message', '[custom message] The foo prop on "restrictedProp" test is not allowed.'); }); });