import { expect } from 'chai'; import { array, number } from 'prop-types'; import React from 'react'; import { uniqueArrayOf } from '..'; import callValidator from './_callValidator'; describe('uniqueArrayOf', () => { it('is a function', () => { expect(typeof uniqueArrayOf).to.equal('function'); }); function assertPasses(validator, element, propName) { expect(callValidator(validator, element, propName, '"uniqueArrayOf" test')).to.equal(null); } function assertFails(validator, element, propName) { expect(callValidator(validator, element, propName, '"uniqueArrayOf" test')).to.be.instanceOf(Error); } function identityMapper(element) { return element; } function constantMapper(element) { return element ** 0; } function arrayMapper(element) { return element[0]; } it('throws if not given a type function', () => { expect(() => uniqueArrayOf()).to.throw(TypeError); expect(() => uniqueArrayOf(undefined)).to.throw(TypeError); expect(() => uniqueArrayOf(null)).to.throw(TypeError); expect(() => uniqueArrayOf([])).to.throw(TypeError); expect(() => uniqueArrayOf({})).to.throw(TypeError); expect(() => uniqueArrayOf('')).to.throw(TypeError); expect(() => uniqueArrayOf(42)).to.throw(TypeError); expect(() => uniqueArrayOf(NaN)).to.throw(TypeError); }); it('throws if given multiple mapping functions', () => { expect(() => uniqueArrayOf(() => {}, () => {}, () => {})).to.throw(TypeError); }); it('throws if given multiple name strings', () => { expect(() => uniqueArrayOf(() => {}, 'test', 'test')).to.throw(TypeError); }); it('throws if given more than 2 ...rest parameters', () => { expect(() => uniqueArrayOf(() => {}, 'test', 'test', 'test')).to.throw(TypeError); }); it('throws if ordering of [String, Function]', () => { expect(() => uniqueArrayOf(() => {}, 'test', arrayMapper)).to.throw(TypeError); }); it('throws if non string or function input', () => { expect(() => uniqueArrayOf(() => {}, 4)).to.throw(TypeError); }); it('returns a function', () => { expect(typeof uniqueArrayOf(() => {})).to.equal('function'); }); it('requires an array', () => assertFails( uniqueArrayOf(() => {}), (
), 'foo', )); it('is not required by default', () => assertPasses( uniqueArrayOf(() => {}), (
), 'missing', )); it('is required with .isRequired', () => assertFails( uniqueArrayOf(() => {}).isRequired, (
), 'missing', )); it('allows custom name', () => assertPasses( uniqueArrayOf(() => {}, 'test').isRequired, (
), 'foo', )); it('enforces the provided validator', () => { assertFails( uniqueArrayOf(number), (
), 'foo', ); assertPasses( uniqueArrayOf(number), (
), 'foo', ); }); it('enforces uniqueness', () => { assertFails( uniqueArrayOf(number), (
), 'foo', ); assertPasses( uniqueArrayOf(number), (
), 'foo', ); }); it('enforces uniqueness of objects too', () => { const arr = [1]; assertFails( uniqueArrayOf(array), (
), 'foo', ); assertPasses( uniqueArrayOf(array), (
), 'foo', ); }); describe('with mapper function', () => { it('requires an array', () => assertFails( uniqueArrayOf(() => {}, identityMapper), (
), 'foo', )); it('is not required by default', () => assertPasses( uniqueArrayOf(() => {}, identityMapper), (
), 'missing', )); it('is required with .isRequired', () => { assertFails( uniqueArrayOf(() => {}, identityMapper).isRequired, (
), 'missing', ); assertPasses( uniqueArrayOf(() => {}, identityMapper).isRequired, (
), 'foo', ); }); it('enforces the provided validator', () => { assertFails( uniqueArrayOf(number, identityMapper), (
), 'foo', ); assertPasses( uniqueArrayOf(number, identityMapper), (
), 'foo', ); }); it('enforces uniqueness', () => { assertFails( uniqueArrayOf(number, identityMapper), (
), 'foo', ); assertPasses( uniqueArrayOf(number, identityMapper), (
), 'foo', ); assertFails( uniqueArrayOf(number, constantMapper), (
), 'foo', ); }); it('enforces uniqueness of objects too', () => { assertFails( uniqueArrayOf(array, arrayMapper), (
), 'foo', ); assertFails( uniqueArrayOf(array, arrayMapper), (
), 'foo', ); assertPasses( uniqueArrayOf(array, arrayMapper), (
), 'foo', ); assertPasses( uniqueArrayOf(array, arrayMapper), (
), 'foo', ); }); }); describe('with mapper function and name', () => { it('enforces uniqueness of objects too', () => { assertFails( uniqueArrayOf(array, arrayMapper, 'test'), (
), 'foo', ); assertPasses( uniqueArrayOf(array, arrayMapper, 'test'), (
), 'foo', ); }); }); });