Skip to content

Commit 20ae351

Browse files
committed
Additional tests for prop-types and no-unused-prop-types
1 parent fb745ab commit 20ae351

File tree

4 files changed

+306
-33
lines changed

4 files changed

+306
-33
lines changed

lib/rules/no-unused-prop-types.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ module.exports = {
146146
function mustBeValidated(component) {
147147
return Boolean(
148148
component &&
149-
!component.ignorePropsValidation
149+
!component.ignoreUnusedPropTypesValidation
150150
);
151151
}
152152

@@ -397,7 +397,7 @@ module.exports = {
397397

398398
const component = components.get(utils.getParentComponent());
399399
const usedPropTypes = component && component.usedPropTypes || [];
400-
let ignorePropsValidation = component && component.ignorePropsValidation || false;
400+
let ignoreUnusedPropTypesValidation = component && component.ignoreUnusedPropTypesValidation || false;
401401

402402
switch (type) {
403403
case 'direct':
@@ -414,7 +414,7 @@ module.exports = {
414414
case 'destructuring':
415415
for (let k = 0, l = (properties || []).length; k < l; k++) {
416416
if (hasSpreadOperator(properties[k]) || properties[k].computed) {
417-
ignorePropsValidation = true;
417+
ignoreUnusedPropTypesValidation = true;
418418
break;
419419
}
420420
const propName = getKeyValue(properties[k]);
@@ -441,7 +441,7 @@ module.exports = {
441441

442442
components.set(component ? component.node : node, {
443443
usedPropTypes: usedPropTypes,
444-
ignorePropsValidation: ignorePropsValidation
444+
ignoreUnusedPropTypesValidation: ignoreUnusedPropTypesValidation
445445
});
446446
}
447447

lib/util/propTypes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ module.exports = function propTypesInstructions(context, components, utils) {
669669
JSXSpreadAttribute: function(node) {
670670
const component = components.get(utils.getParentComponent());
671671
components.set(component ? component.node : node, {
672-
ignorePropsValidation: true
672+
ignoreUnusedPropTypesValidation: true
673673
});
674674
},
675675

tests/lib/rules/no-unused-prop-types.js

Lines changed: 209 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,23 @@ ruleTester.run('no-unused-prop-types', rule, {
812812
'}'
813813
].join('\n'),
814814
parser: 'babel-eslint'
815+
}, {
816+
code: [
817+
'import type {BasePerson} from \'./types\'',
818+
'type Props = {',
819+
' person: {',
820+
' ...$Exact<BasePerson>,',
821+
' lastname: string',
822+
' }',
823+
'};',
824+
'class Hello extends React.Component {',
825+
' props: Props;',
826+
' render () {',
827+
' return <div>Hello {this.props.person.firstname}</div>;',
828+
' }',
829+
'}'
830+
].join('\n'),
831+
parser: 'babel-eslint'
815832
}, {
816833
code: [
817834
'type Props = {name: Object;};',
@@ -1801,34 +1818,6 @@ ruleTester.run('no-unused-prop-types', rule, {
18011818
' bar: PropTypes.bool',
18021819
'};'
18031820
].join('\n')
1804-
}, {
1805-
code: [
1806-
'type Person = {',
1807-
' ...data,',
1808-
' lastname: string',
1809-
'};',
1810-
'class Hello extends React.Component {',
1811-
' props: Person;',
1812-
' render () {',
1813-
' return <div>Hello {this.props.firstname}</div>;',
1814-
' }',
1815-
'}'
1816-
].join('\n'),
1817-
parser: 'babel-eslint'
1818-
}, {
1819-
code: [
1820-
'type Person = {|',
1821-
' ...data,',
1822-
' lastname: string',
1823-
'|};',
1824-
'class Hello extends React.Component {',
1825-
' props: Person;',
1826-
' render () {',
1827-
' return <div>Hello {this.props.firstname}</div>;',
1828-
' }',
1829-
'}'
1830-
].join('\n'),
1831-
parser: 'babel-eslint'
18321821
}, {
18331822
// The next two test cases are related to: https://github.com/yannickcr/eslint-plugin-react/issues/1183
18341823
code: [
@@ -2470,6 +2459,20 @@ ruleTester.run('no-unused-prop-types', rule, {
24702459
'}'
24712460
].join('\n'),
24722461
parser: 'babel-eslint'
2462+
}, {
2463+
code: [
2464+
'const foo = {};',
2465+
'class Hello extends React.Component {',
2466+
' render() {',
2467+
' const {firstname, lastname} = this.props.name;',
2468+
' return <div>{firstname} {lastname}</div>;',
2469+
' }',
2470+
'}',
2471+
'Hello.propTypes = {',
2472+
' name: PropTypes.shape(foo)',
2473+
'};'
2474+
].join('\n'),
2475+
parser: 'babel-eslint'
24732476
}, {
24742477
// issue #933
24752478
code: [
@@ -4475,6 +4478,48 @@ ruleTester.run('no-unused-prop-types', rule, {
44754478
errors: [{
44764479
message: '\'lastname\' PropType is defined but prop is never used'
44774480
}]
4481+
}, {
4482+
code: `
4483+
type Person = string;
4484+
class Hello extends React.Component<{ person: Person }> {
4485+
render () {
4486+
return <div />;
4487+
}
4488+
}
4489+
`,
4490+
settings: {react: {flowVersion: '0.53'}},
4491+
errors: [{
4492+
message: '\'person\' PropType is defined but prop is never used'
4493+
}],
4494+
parser: 'babel-eslint'
4495+
}, {
4496+
code: `
4497+
type Person = string;
4498+
class Hello extends React.Component<void, { person: Person }, void> {
4499+
render () {
4500+
return <div />;
4501+
}
4502+
}
4503+
`,
4504+
settings: {react: {flowVersion: '0.52'}},
4505+
errors: [{
4506+
message: '\'person\' PropType is defined but prop is never used'
4507+
}],
4508+
parser: 'babel-eslint'
4509+
}, {
4510+
code: `
4511+
function higherOrderComponent<P: { foo: string }>() {
4512+
return class extends React.Component<P> {
4513+
render() {
4514+
return <div />;
4515+
}
4516+
}
4517+
}
4518+
`,
4519+
errors: [{
4520+
message: '\'foo\' PropType is defined but prop is never used'
4521+
}],
4522+
parser: 'babel-eslint'
44784523
}, {
44794524
// issue #1506
44804525
code: [
@@ -4665,6 +4710,142 @@ ruleTester.run('no-unused-prop-types', rule, {
46654710
}, {
46664711
message: '\'a.b.c\' PropType is defined but prop is never used'
46674712
}]
4713+
}, {
4714+
code: `
4715+
type Props = { foo: string }
4716+
function higherOrderComponent<Props>() {
4717+
return class extends React.Component<Props> {
4718+
render() {
4719+
return <div />;
4720+
}
4721+
}
4722+
}
4723+
`,
4724+
parser: 'babel-eslint',
4725+
errors: [{
4726+
message: '\'foo\' PropType is defined but prop is never used'
4727+
}]
4728+
}, {
4729+
code: [
4730+
'type Person = {',
4731+
' ...data,',
4732+
' lastname: string',
4733+
'};',
4734+
'class Hello extends React.Component {',
4735+
' props: Person;',
4736+
' render () {',
4737+
' return <div>Hello {this.props.firstname}</div>;',
4738+
' }',
4739+
'}'
4740+
].join('\n'),
4741+
parser: 'babel-eslint',
4742+
errors: [{
4743+
message: '\'lastname\' PropType is defined but prop is never used'
4744+
}]
4745+
}, {
4746+
code: [
4747+
'type Person = {|',
4748+
' ...data,',
4749+
' lastname: string',
4750+
'|};',
4751+
'class Hello extends React.Component {',
4752+
' props: Person;',
4753+
' render () {',
4754+
' return <div>Hello {this.props.firstname}</div>;',
4755+
' }',
4756+
'}'
4757+
].join('\n'),
4758+
parser: 'babel-eslint',
4759+
errors: [{
4760+
message: '\'lastname\' PropType is defined but prop is never used'
4761+
}]
4762+
}, {
4763+
code: [
4764+
'type Person = {',
4765+
' ...$Exact<data>,',
4766+
' lastname: string',
4767+
'};',
4768+
'class Hello extends React.Component {',
4769+
' props: Person;',
4770+
' render () {',
4771+
' return <div>Hello {this.props.firstname}</div>;',
4772+
' }',
4773+
'}'
4774+
].join('\n'),
4775+
parser: 'babel-eslint',
4776+
errors: [{
4777+
message: '\'lastname\' PropType is defined but prop is never used'
4778+
}]
4779+
}, {
4780+
code: [
4781+
'import type {Data} from \'./Data\'',
4782+
'type Person = {',
4783+
' ...Data,',
4784+
' lastname: string',
4785+
'};',
4786+
'class Hello extends React.Component {',
4787+
' props: Person;',
4788+
' render () {',
4789+
' return <div>Hello {this.props.bar}</div>;',
4790+
' }',
4791+
'}'
4792+
].join('\n'),
4793+
parser: 'babel-eslint',
4794+
errors: [{
4795+
message: '\'lastname\' PropType is defined but prop is never used'
4796+
}]
4797+
}, {
4798+
code: [
4799+
'import type {Data} from \'some-libdef-like-flow-typed-provides\'',
4800+
'type Person = {',
4801+
' ...Data,',
4802+
' lastname: string',
4803+
'};',
4804+
'class Hello extends React.Component {',
4805+
' props: Person;',
4806+
' render () {',
4807+
' return <div>Hello {this.props.bar}</div>;',
4808+
' }',
4809+
'}'
4810+
].join('\n'),
4811+
parser: 'babel-eslint',
4812+
errors: [{
4813+
message: '\'lastname\' PropType is defined but prop is never used'
4814+
}]
4815+
}, {
4816+
code: [
4817+
'type Person = {',
4818+
' ...data,',
4819+
' lastname: string',
4820+
'};',
4821+
'class Hello extends React.Component {',
4822+
' props: Person;',
4823+
' render () {',
4824+
' return <div>Hello {this.props.firstname}</div>;',
4825+
' }',
4826+
'}'
4827+
].join('\n'),
4828+
parser: 'babel-eslint',
4829+
errors: [{
4830+
message: '\'lastname\' PropType is defined but prop is never used'
4831+
}]
4832+
}, {
4833+
code: [
4834+
'type Person = {|',
4835+
' ...data,',
4836+
' lastname: string',
4837+
'|};',
4838+
'class Hello extends React.Component {',
4839+
' props: Person;',
4840+
' render () {',
4841+
' return <div>Hello {this.props.firstname}</div>;',
4842+
' }',
4843+
'}'
4844+
].join('\n'),
4845+
parser: 'babel-eslint',
4846+
errors: [{
4847+
message: '\'lastname\' PropType is defined but prop is never used'
4848+
}]
46684849
}
46694850

46704851
/* , {

0 commit comments

Comments
 (0)