blob: eda6605f21775078ec7555ee2e1fcfea92a996fc [file] [log] [blame]
Jack Franklin8b9aa2f2020-02-12 16:35:15 +00001'use strict';
2
3/* eslint "complexity": [ "error", 5 ] */
4
Tim van der Lippe16aca392020-11-13 11:37:13 +00005const createAstUtils = require('../util/ast');
Jack Franklin8b9aa2f2020-02-12 16:35:15 +00006
Tim van der Lippe16aca392020-11-13 11:37:13 +00007module.exports = {
8 meta: {
9 type: 'problem',
10 docs: {
Tim van der Lippe0ceb4652022-01-06 14:23:36 +010011 description: 'Disallow tests to be nested within other tests ',
12 url: 'https://github.com/lo1tuma/eslint-plugin-mocha/blob/master/docs/rules/no-nested-tests.md'
13 },
14 schema: []
Tim van der Lippe16aca392020-11-13 11:37:13 +000015 },
16 create(context) {
17 const astUtils = createAstUtils(context.settings);
18 let testNestingLevel = 0;
19 let hookCallNestingLevel = 0;
Tim van der Lippe2c891972021-07-29 16:22:50 +010020 const isTestCase = astUtils.buildIsTestCaseAnswerer();
21 const isDescribe = astUtils.buildIsDescribeAnswerer();
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000022
Tim van der Lippe16aca392020-11-13 11:37:13 +000023 function report(callExpression, message) {
24 context.report({
25 message,
26 node: callExpression.callee
27 });
28 }
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000029
Tim van der Lippe2c891972021-07-29 16:22:50 +010030 function isNestedTest(_isTestCase, _isDescribe, nestingLevel) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000031 const isNested = nestingLevel > 0;
Tim van der Lippe2c891972021-07-29 16:22:50 +010032 const isTest = _isTestCase || _isDescribe;
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000033
Tim van der Lippe16aca392020-11-13 11:37:13 +000034 return isNested && isTest;
35 }
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000036
Tim van der Lippe2c891972021-07-29 16:22:50 +010037 function checkForAndReportErrors(
38 node,
39 _isTestCase,
40 _isDescribe,
41 isHookCall
42 ) {
43 if (isNestedTest(_isTestCase, _isDescribe, testNestingLevel)) {
44 const message = _isDescribe ?
Tim van der Lippe16aca392020-11-13 11:37:13 +000045 'Unexpected suite nested within a test.' :
46 'Unexpected test nested within another test.';
47 report(node, message);
Tim van der Lippe2c891972021-07-29 16:22:50 +010048 } else if (
49 isNestedTest(_isTestCase, isHookCall, hookCallNestingLevel)
50 ) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000051 const message = isHookCall ?
52 'Unexpected test hook nested within a test hook.' :
53 'Unexpected test nested within a test hook.';
54 report(node, message);
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000055 }
56 }
Tim van der Lippe16aca392020-11-13 11:37:13 +000057
58 return {
59 CallExpression(node) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010060 const _isTestCase = isTestCase(node);
Tim van der Lippe16aca392020-11-13 11:37:13 +000061 const isHookCall = astUtils.isHookCall(node);
Tim van der Lippe2c891972021-07-29 16:22:50 +010062 const _isDescribe = isDescribe(node);
Tim van der Lippe16aca392020-11-13 11:37:13 +000063
Tim van der Lippe2c891972021-07-29 16:22:50 +010064 checkForAndReportErrors(
65 node,
66 _isTestCase,
67 _isDescribe,
68 isHookCall
69 );
Tim van der Lippe16aca392020-11-13 11:37:13 +000070
Tim van der Lippe2c891972021-07-29 16:22:50 +010071 if (_isTestCase) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000072 testNestingLevel += 1;
73 } else if (isHookCall) {
74 hookCallNestingLevel += 1;
75 }
76 },
77
78 'CallExpression:exit'(node) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010079 if (isTestCase(node)) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000080 testNestingLevel -= 1;
81 } else if (astUtils.isHookCall(node)) {
82 hookCallNestingLevel -= 1;
83 }
84 }
85 };
86 }
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000087};