Skip to content

Commit b7cbd99

Browse files
authored
100% code coverage (#1011)
1 parent b64afb5 commit b7cbd99

11 files changed

+49
-22
lines changed

rules/consistent-function-scoping.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,13 @@ function checkReferences(scope, parent, scopeManager) {
4646
const identifierScope = scopeManager.acquire(identifier);
4747

4848
// If we have a scope, the earlier checks should have worked so ignore them here
49+
/* istanbul ignore next: Hard to test */
4950
if (identifierScope) {
5051
return false;
5152
}
5253

5354
const identifierParentScope = scopeManager.acquire(identifier.parent);
55+
/* istanbul ignore next: Hard to test */
5456
if (!identifierParentScope) {
5557
return false;
5658
}
@@ -119,9 +121,6 @@ function checkNode(node, scopeManager) {
119121
}
120122

121123
let parentNode = node.parent;
122-
if (!parentNode) {
123-
return true;
124-
}
125124

126125
// Skip over junk like the block statement inside of a function declaration
127126
// or the various pieces of an arrow function.

rules/custom-error-definition.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,6 @@ const customErrorDefinition = (context, node) => {
161161
};
162162

163163
const customErrorExport = (context, node) => {
164-
if (!node.left.object || node.left.object.name !== 'exports') {
165-
return;
166-
}
167-
168-
if (!node.left.property) {
169-
return;
170-
}
171-
172164
const exportsName = node.left.property.name;
173165

174166
const maybeError = node.right;
@@ -203,7 +195,7 @@ const create = context => {
203195
return {
204196
ClassDeclaration: node => customErrorDefinition(context, node),
205197
'AssignmentExpression[right.type="ClassExpression"]': node => customErrorDefinition(context, node.right),
206-
'AssignmentExpression[left.type="MemberExpression"]': node => customErrorExport(context, node)
198+
'AssignmentExpression[left.type="MemberExpression"][left.object.type="Identifier"][left.object.name="exports"]': node => customErrorExport(context, node)
207199
};
208200
};
209201

rules/expiring-todo-comments.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ function reachedDate(past) {
187187
}
188188

189189
function tryToCoerceVersion(rawVersion) {
190+
/* istanbul ignore if: version in `package.json` and comment can't be empty */
190191
if (!rawVersion) {
191192
return false;
192193
}
@@ -209,10 +210,12 @@ function tryToCoerceVersion(rawVersion) {
209210

210211
// Get only the first member for cases such as `1.0.0 - 2.9999.9999`
211212
const parts = version.split(' ');
213+
/* istanbul ignore if: We don't have this `package.json` to test */
212214
if (parts.length > 1) {
213215
version = parts[0];
214216
}
215217

218+
/* istanbul ignore if: We don't have this `package.json` to test */
216219
if (semver.valid(version)) {
217220
return version;
218221
}
@@ -222,6 +225,7 @@ function tryToCoerceVersion(rawVersion) {
222225
// But coerce can't parse pre-releases.
223226
return semver.parse(version) || semver.coerce(version);
224227
} catch {
228+
/* istanbul ignore next: We don't have this `package.json` to test */
225229
return false;
226230
}
227231
}
@@ -395,6 +399,7 @@ const create = context => {
395399
const todoVersion = tryToCoerceVersion(dependency.version);
396400
const targetPackageVersion = tryToCoerceVersion(targetPackageRawVersion);
397401

402+
/* istanbul ignore if: Can't test in Node.js */
398403
if (!hasTargetPackage || !targetPackageVersion) {
399404
// Can't compare `¯\_(ツ)_/¯`
400405
continue;
@@ -422,6 +427,7 @@ const create = context => {
422427
const targetPackageRawEngineVersion = packageEngines.node;
423428
const hasTargetEngine = Boolean(targetPackageRawEngineVersion);
424429

430+
/* istanbul ignore if: Can't test in this repo */
425431
if (!hasTargetEngine) {
426432
continue;
427433
}

rules/no-keyword-prefix.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ function checkObjectPattern(report, node, options) {
5555
const {name, parent} = node;
5656
const keyword = findKeywordPrefix(name, options);
5757

58+
/* istanbul ignore next: Can't find a case to cover this line */
5859
if (parent.shorthand && parent.value.left && Boolean(keyword)) {
5960
report(node, keyword);
6061
}

rules/prefer-query-selector.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,39 +88,36 @@ const hasValue = node => {
8888
return true;
8989
};
9090

91-
const fix = (node, identifierName, preferedSelector) => {
91+
const fix = (node, identifierName, preferredSelector) => {
9292
const nodeToBeFixed = node.arguments[0];
9393
if (identifierName === 'getElementsByTagName' || !hasValue(nodeToBeFixed)) {
94-
return fixer => fixer.replaceText(node.callee.property, preferedSelector);
94+
return fixer => fixer.replaceText(node.callee.property, preferredSelector);
9595
}
9696

9797
const getArgumentFix = nodeToBeFixed.type === 'Literal' ? getLiteralFix : getTemplateLiteralFix;
9898
return function * (fixer) {
9999
yield * getArgumentFix(fixer, nodeToBeFixed, identifierName);
100-
yield fixer.replaceText(node.callee.property, preferedSelector);
100+
yield fixer.replaceText(node.callee.property, preferredSelector);
101101
};
102102
};
103103

104104
const create = context => {
105105
return {
106106
[selector](node) {
107107
const method = node.callee.property.name;
108-
const preferedSelector = forbiddenIdentifierNames.get(method);
109-
if (!preferedSelector) {
110-
return;
111-
}
108+
const preferredSelector = forbiddenIdentifierNames.get(method);
112109

113110
const problem = {
114111
node: node.callee.property,
115112
messageId: MESSAGE_ID,
116113
data: {
117-
replacement: preferedSelector,
114+
replacement: preferredSelector,
118115
method
119116
}
120117
};
121118

122119
if (canBeFixed(node.arguments[0])) {
123-
problem.fix = fix(node, method, preferedSelector);
120+
problem.fix = fix(node, method, preferredSelector);
124121
}
125122

126123
context.report(problem);

rules/utils/avoid-capture.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const indexifyName = (name, index) => name + '_'.repeat(index);
66

77
const scopeHasArgumentsSpecial = scope => {
88
while (scope) {
9+
/* istanbul ignore next: `someScopeHasVariableName` seems already handle this */
910
if (scope.taints.get('arguments')) {
1011
return true;
1112
}

test/expiring-todo-comments.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ test({
119119
code: `/*
120120
* TODO [2000-01-01]: Yet
121121
* TODO [2000-01-01]: Another
122-
* TODO [2000-01-01]: Way
122+
* TODO [2000-01-01] Way
123123
*/`,
124124
errors: [
125125
expiredTodoError('2000-01-01', 'Yet'),

test/no-for-loop.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,15 @@ ruleTester.run('no-for-loop', rule, {
182182
for (let i = 0; i < arr.length; i++) {
183183
arr[i] = i + 2;
184184
}
185+
`,
186+
187+
// Child scope
188+
outdent`
189+
for (let i = 0; i < cities.length; i++) {
190+
const foo = function () {
191+
console.log(cities)
192+
}
193+
}
185194
`
186195
],
187196

test/no-unused-properties.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,15 @@ test({
390390
console.log(foo.b);
391391
`,
392392
errors: [error]
393+
},
394+
395+
{
396+
code: outdent`
397+
const foo = {
398+
[foo.bar]: 1
399+
};
400+
`,
401+
errors: [error]
393402
}
394403
]
395404
});

test/package.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,11 @@ test('Every deprecated rules listed in docs/deprecated-rules.md', t => {
116116
const content = fs.readFileSync('docs/deprecated-rules.md', 'utf8');
117117
const rulesInMarkdown = content.match(/(?<=^## ).*?$/gm);
118118
t.deepEqual(deprecatedRules, rulesInMarkdown);
119+
120+
for (const name of deprecatedRules) {
121+
const rule = index.rules[name];
122+
t.is(typeof rule.create, 'function', `${name} create is not function`);
123+
t.deepEqual(rule.create(), {}, `${name} create should return empty object`);
124+
t.true(rule.meta.deprecated, `${name} meta.deprecated should be true`);
125+
}
119126
});

0 commit comments

Comments
 (0)