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'),
(
),
'children',
'span!',
));
it('fails expecting an SFC', () => assertFails(
childrenOfType(SFC),
(
),
'children',
'SFC!',
));
it('fails expecting a Component', () => assertFails(
childrenOfType(Component),
(
),
'children',
'Component!',
));
});
});