From 3e355c482f1900e321f8006b477d85dcd7cc9670 Mon Sep 17 00:00:00 2001 From: Kevin Phelps Date: Tue, 24 Apr 2018 18:30:41 -0500 Subject: [PATCH] fix(rule): prevent error when parent class node does not exist --- src/noLifeCycleCallRule.ts | 15 +++------------ test/noLifeCycleCallRule.spec.ts | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/noLifeCycleCallRule.ts b/src/noLifeCycleCallRule.ts index c22642ccf..a29b77acd 100644 --- a/src/noLifeCycleCallRule.ts +++ b/src/noLifeCycleCallRule.ts @@ -14,7 +14,7 @@ export class Rule extends Lint.Rules.AbstractRule { typescriptOnly: true, }; - static FAILURE_STRING: string = 'Avoid explicitly calls to lifecycle hooks in class "%s"'; + static FAILURE_STRING: string = 'Avoid explicit calls to lifecycle hooks.'; public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { return this.applyWithWalker(new ExpressionCallMetadataWalker(sourceFile, this.getOptions())); @@ -55,17 +55,8 @@ export class ExpressionCallMetadataWalker extends NgWalker { const isSuperCall = expression && expression.kind === ts.SyntaxKind.SuperKeyword; const isLifecycleCall = name && ts.isIdentifier(name) && lifecycleHooksMethods.has(name.text as any); - if (isSuperCall || !isLifecycleCall) { - return; + if (isLifecycleCall && !isSuperCall) { + this.addFailureAtNode(node, Rule.FAILURE_STRING); } - - let currentNode = node as any; - - while (currentNode.parent.parent) { - currentNode = currentNode.parent; - } - - const failureConfig = [Rule.FAILURE_STRING, currentNode.name.text]; - this.addFailureAtNode(node, sprintf.apply(this, failureConfig)); } } diff --git a/test/noLifeCycleCallRule.spec.ts b/test/noLifeCycleCallRule.spec.ts index 763c593bd..9d8bdb176 100644 --- a/test/noLifeCycleCallRule.spec.ts +++ b/test/noLifeCycleCallRule.spec.ts @@ -61,13 +61,36 @@ describe(ruleName, () => { it(`should fail when explicitly calling ${lifecycleHookMethodCall}`, () => { assertAnnotated({ ruleName, - message: `Avoid explicitly calls to lifecycle hooks in class "${className}"`, + message: 'Avoid explicit calls to lifecycle hooks.', source }); }); }); }); } + + lifecycleHooksMethods.forEach(lifecycleHookMethod => { + const lifecycleHookMethodCall = `fixture.componentInstance.${lifecycleHookMethod}()`; + const totalTildes = '~'.repeat(lifecycleHookMethodCall.length); + const source = ` + it('should work', () => { + // test code... + + ${lifecycleHookMethodCall} + ${totalTildes} + + // more test code... + }) + `; + + it(`should fail when explicitly calling ${lifecycleHookMethod} outside of a class`, () => { + assertAnnotated({ + ruleName, + message: `Avoid explicit calls to lifecycle hooks.`, + source + }); + }); + }); }); describe('success', () => {