import { expect } from 'chai'; import React from 'react'; import { childrenOfType } from '..'; import callValidator from './_callValidator'; function SFC() {} class Component extends React.Component {} // eslint-disable-line react/prefer-stateless-function describe('childrenOfType', () => { it('throws when not given a type', () => { expect(() => childrenOfType()).to.throw(TypeError); }); function assertPasses(validator, element, propName, componentName) { expect(callValidator(validator, element, propName, componentName)).to.equal(null); } function assertFails(validator, element, propName, componentName) { expect(callValidator(validator, element, propName, componentName)).to.be.instanceOf(Error); } describe('with no children', () => { it('passes when optional', () => { assertPasses( childrenOfType('span'), (
), 'children', 'empty', ); }); it('fails when required', () => { assertFails( childrenOfType('span').isRequired, (
), 'children', 'empty required', ); }); }); describe('with a single child of the specified type', () => { it('passes with *', () => assertPasses( childrenOfType('*'), (
), 'children', '*!', )); it('passes with * when required', () => assertPasses( childrenOfType('*').isRequired, (
), 'children', '*! required', )); it('passes with a DOM element', () => assertPasses( childrenOfType('span'), (
), 'children', 'span!', )); it('passes with a DOM element when required', () => assertPasses( childrenOfType('span').isRequired, (
), 'children', 'span! required', )); it('passes with an SFC', () => assertPasses( childrenOfType(SFC), (
), 'children', 'SFC!', )); it('passes with an SFC when required', () => assertPasses( childrenOfType(SFC).isRequired, (
), 'children', 'SFC! required', )); it('passes with a Component', () => assertPasses( childrenOfType(Component), (
), 'children', 'Component!', )); it('passes with a Component when required', () => assertPasses( childrenOfType(Component).isRequired, (
), 'children', 'Component! required', )); }); describe('with multiple children of the specified type', () => { it('passes with *', () => assertPasses( childrenOfType('*'), (
), 'children', '*!', )); it('passes with * when required', () => assertPasses( childrenOfType('*').isRequired, (
), 'children', '*! required', )); it('passes with a DOM element', () => assertPasses( childrenOfType('span'), (
), 'children', 'span!', )); it('passes with a DOM element when required', () => assertPasses( childrenOfType('span').isRequired, (
), 'children', 'span! required', )); it('passes with an SFC', () => assertPasses( childrenOfType(SFC), (
), 'children', 'SFC!', )); it('passes with an SFC when required', () => assertPasses( childrenOfType(SFC).isRequired, (
), 'children', 'SFC! required', )); it('passes with a Component', () => assertPasses( childrenOfType(Component), (
), 'children', 'Component!', )); it('passes with a Component when required', () => assertPasses( childrenOfType(Component).isRequired, (
), 'children', 'Component! required', )); }); describe('with children of the specified types passed as an array', () => { it('passes with *', () => assertPasses( childrenOfType('*').isRequired, (
{[ , , , ]}
), 'children', '*!', )); it('passes with *', () => assertPasses( childrenOfType('*').isRequired, (
{[ , , , ]}
), 'children', '*! required', )); it('passes with a DOM element', () => assertPasses( childrenOfType('span'), (
{[ , , , ]}
), 'children', 'span!', )); it('passes with an SFC', () => assertPasses( childrenOfType(SFC), (
{[ , , , ]}
), 'children', 'SFC!', )); it('passes with a Component', () => assertPasses( childrenOfType(Component), (
{[ , , , ]}
), 'children', 'Component!', )); it('passes with multiple types', () => assertPasses( childrenOfType(SFC, Component, 'span'), (
{[ , , , ]}
), 'children', 'all three', )); it('passes with multiple types when required', () => assertPasses( childrenOfType(SFC, Component, 'span').isRequired, (
{[ , , , ]}
), 'children', 'all three required', )); it('passes with multiple types including *', () => assertPasses( childrenOfType(SFC, '*'), (
{[ , , , 'text children', ]}
), 'children', 'SFC and *', )); it('passes with multiple types including * when required', () => assertPasses( childrenOfType(SFC, '*').isRequired, (
{[ , , , 'text children', ]}
), 'children', 'SFC and *', )); }); describe('when an unspecified type is provided as a child', () => { it('fails expecting a DOM element', () => assertFails( childrenOfType('span'), (
No way.
), 'children', 'span!', )); it('fails expecting an SFC', () => assertFails( childrenOfType(SFC), (
No way.
), 'children', 'SFC!', )); it('fails expecting a Component', () => assertFails( childrenOfType(Component), (
No way.
), 'children', 'Component!', )); }); });