Skip to content

Commit

Permalink
Fix for #5468: Validate PropTypes.oneOf(Type) arguments early (#6316)
Browse files Browse the repository at this point in the history
* Fix for 5468: Validate proptype definitions sooner

Added typeCheckWarn() func and updated the oneOf/oneOfType tests
Added __DEV__ warning for invalid oneOf/OneOfType args

* Suppress redundant error on warn; typeCheckWarn() removed

* Return no-op

* Using emptyFunction module for consistency

* Remove createChainableTypeChecker() call

* Adjust test to assert type check passes when warned
  • Loading branch information
troydemonbreun authored and gaearon committed Jun 29, 2016
1 parent f949125 commit 6cc037b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 22 deletions.
15 changes: 5 additions & 10 deletions src/isomorphic/classic/types/ReactPropTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ var ReactPropTypeLocationNames = require('ReactPropTypeLocationNames');

var emptyFunction = require('emptyFunction');
var getIteratorFn = require('getIteratorFn');
var warning = require('warning');

/**
* Collection of methods that allow declaration and validation of props that are
Expand Down Expand Up @@ -226,11 +227,8 @@ function createInstanceTypeChecker(expectedClass) {

function createEnumTypeChecker(expectedValues) {
if (!Array.isArray(expectedValues)) {
return createChainableTypeChecker(function() {
return new Error(
`Invalid argument supplied to oneOf, expected an instance of array.`
);
});
warning(false, 'Invalid argument supplied to oneOf, expected an instance of array.');
return emptyFunction.thatReturnsNull;
}

function validate(props, propName, componentName, location, propFullName) {
Expand Down Expand Up @@ -288,11 +286,8 @@ function createObjectOfTypeChecker(typeChecker) {

function createUnionTypeChecker(arrayOfTypeCheckers) {
if (!Array.isArray(arrayOfTypeCheckers)) {
return createChainableTypeChecker(function() {
return new Error(
`Invalid argument supplied to oneOfType, expected an instance of array.`
);
});
warning(false, 'Invalid argument supplied to oneOfType, expected an instance of array.');
return emptyFunction.thatReturnsNull;
}

function validate(props, propName, componentName, location, propFullName) {
Expand Down
32 changes: 20 additions & 12 deletions src/isomorphic/classic/types/__tests__/ReactPropTypes-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -590,12 +590,16 @@ describe('ReactPropTypes', function() {
});

describe('OneOf Types', function() {
it('should fail for invalid argument', function() {
typeCheckFail(
PropTypes.oneOf('red', 'blue'),
'red',
'Invalid argument supplied to oneOf, expected an instance of array.'
);
it('should warn but not error for invalid argument', function() {
spyOn(console, 'error');

PropTypes.oneOf('red', 'blue');

expect(console.error).toHaveBeenCalled();
expect(console.error.calls.argsFor(0)[0])
.toContain('Invalid argument supplied to oneOf, expected an instance of array.');

typeCheckPass(PropTypes.oneOf('red', 'blue'), 'red');
});

it('should warn for invalid values', function() {
Expand Down Expand Up @@ -651,12 +655,16 @@ describe('ReactPropTypes', function() {
});

describe('Union Types', function() {
it('should fail for invalid argument', function() {
typeCheckFail(
PropTypes.oneOfType(PropTypes.string, PropTypes.number),
'red',
'Invalid argument supplied to oneOfType, expected an instance of array.'
);
it('should warn but not error for invalid argument', function() {
spyOn(console, 'error');

PropTypes.oneOfType(PropTypes.string, PropTypes.number);

expect(console.error).toHaveBeenCalled();
expect(console.error.calls.argsFor(0)[0])
.toContain('Invalid argument supplied to oneOfType, expected an instance of array.');

typeCheckPass(PropTypes.oneOf(PropTypes.string, PropTypes.number), []);
});

it('should warn if none of the types are valid', function() {
Expand Down

0 comments on commit 6cc037b

Please sign in to comment.