UNPKG

eslint-plugin-mocha

Version:
88 lines (76 loc) 2.77 kB
'use strict'; /* eslint "complexity": [ "error", 5 ] */ const createAstUtils = require('../util/ast'); module.exports = { meta: { type: 'problem', docs: { description: 'Disallow tests to be nested within other tests', url: 'https://github.com/lo1tuma/eslint-plugin-mocha/blob/master/docs/rules/no-nested-tests.md' }, schema: [] }, create(context) { const astUtils = createAstUtils(context.settings); let testNestingLevel = 0; let hookCallNestingLevel = 0; const isTestCase = astUtils.buildIsTestCaseAnswerer(); const isDescribe = astUtils.buildIsDescribeAnswerer(); function report(callExpression, message) { context.report({ message, node: callExpression.callee }); } function isNestedTest(_isTestCase, _isDescribe, nestingLevel) { const isNested = nestingLevel > 0; const isTest = _isTestCase || _isDescribe; return isNested && isTest; } function checkForAndReportErrors( node, _isTestCase, _isDescribe, isHookCall ) { if (isNestedTest(_isTestCase, _isDescribe, testNestingLevel)) { const message = _isDescribe ? 'Unexpected suite nested within a test.' : 'Unexpected test nested within another test.'; report(node, message); } else if ( isNestedTest(_isTestCase, isHookCall, hookCallNestingLevel) ) { const message = isHookCall ? 'Unexpected test hook nested within a test hook.' : 'Unexpected test nested within a test hook.'; report(node, message); } } return { CallExpression(node) { const _isTestCase = isTestCase(node); const isHookCall = astUtils.isHookCall(node); const _isDescribe = isDescribe(node); checkForAndReportErrors( node, _isTestCase, _isDescribe, isHookCall ); if (_isTestCase) { testNestingLevel += 1; } else if (isHookCall) { hookCallNestingLevel += 1; } }, 'CallExpression:exit'(node) { if (isTestCase(node)) { testNestingLevel -= 1; } else if (astUtils.isHookCall(node)) { hookCallNestingLevel -= 1; } } }; } };