blob: e554fb96b1a75bdd6e085c7832a2f40fe1b0dd77 [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: {
11 description: 'Disallow tests to be nested within other tests '
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000012 }
Tim van der Lippe16aca392020-11-13 11:37:13 +000013 },
14 create(context) {
15 const astUtils = createAstUtils(context.settings);
16 let testNestingLevel = 0;
17 let hookCallNestingLevel = 0;
Tim van der Lippe2c891972021-07-29 16:22:50 +010018 const isTestCase = astUtils.buildIsTestCaseAnswerer();
19 const isDescribe = astUtils.buildIsDescribeAnswerer();
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000020
Tim van der Lippe16aca392020-11-13 11:37:13 +000021 function report(callExpression, message) {
22 context.report({
23 message,
24 node: callExpression.callee
25 });
26 }
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000027
Tim van der Lippe2c891972021-07-29 16:22:50 +010028 function isNestedTest(_isTestCase, _isDescribe, nestingLevel) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000029 const isNested = nestingLevel > 0;
Tim van der Lippe2c891972021-07-29 16:22:50 +010030 const isTest = _isTestCase || _isDescribe;
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000031
Tim van der Lippe16aca392020-11-13 11:37:13 +000032 return isNested && isTest;
33 }
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000034
Tim van der Lippe2c891972021-07-29 16:22:50 +010035 function checkForAndReportErrors(
36 node,
37 _isTestCase,
38 _isDescribe,
39 isHookCall
40 ) {
41 if (isNestedTest(_isTestCase, _isDescribe, testNestingLevel)) {
42 const message = _isDescribe ?
Tim van der Lippe16aca392020-11-13 11:37:13 +000043 'Unexpected suite nested within a test.' :
44 'Unexpected test nested within another test.';
45 report(node, message);
Tim van der Lippe2c891972021-07-29 16:22:50 +010046 } else if (
47 isNestedTest(_isTestCase, isHookCall, hookCallNestingLevel)
48 ) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000049 const message = isHookCall ?
50 'Unexpected test hook nested within a test hook.' :
51 'Unexpected test nested within a test hook.';
52 report(node, message);
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000053 }
54 }
Tim van der Lippe16aca392020-11-13 11:37:13 +000055
56 return {
57 CallExpression(node) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010058 const _isTestCase = isTestCase(node);
Tim van der Lippe16aca392020-11-13 11:37:13 +000059 const isHookCall = astUtils.isHookCall(node);
Tim van der Lippe2c891972021-07-29 16:22:50 +010060 const _isDescribe = isDescribe(node);
Tim van der Lippe16aca392020-11-13 11:37:13 +000061
Tim van der Lippe2c891972021-07-29 16:22:50 +010062 checkForAndReportErrors(
63 node,
64 _isTestCase,
65 _isDescribe,
66 isHookCall
67 );
Tim van der Lippe16aca392020-11-13 11:37:13 +000068
Tim van der Lippe2c891972021-07-29 16:22:50 +010069 if (_isTestCase) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000070 testNestingLevel += 1;
71 } else if (isHookCall) {
72 hookCallNestingLevel += 1;
73 }
74 },
75
76 'CallExpression:exit'(node) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010077 if (isTestCase(node)) {
Tim van der Lippe16aca392020-11-13 11:37:13 +000078 testNestingLevel -= 1;
79 } else if (astUtils.isHookCall(node)) {
80 hookCallNestingLevel -= 1;
81 }
82 }
83 };
84 }
Jack Franklin8b9aa2f2020-02-12 16:35:15 +000085};