no-disabled-tests.js 2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
'use strict';

const { getDocsUrl, getNodeName, scopeHasLocalReference } = require('./util');

module.exports = {
  meta: {
    docs: {
      url: getDocsUrl(__filename),
    },
  },
  create(context) {
    let suiteDepth = 0;
    let testDepth = 0;

    return {
      'CallExpression[callee.name="describe"]'() {
        suiteDepth++;
      },
      'CallExpression[callee.name=/^(it|test)$/]'() {
        testDepth++;
      },
      'CallExpression[callee.name=/^(it|test)$/][arguments.length<2]'(node) {
        context.report({
          message: 'Test is missing function argument',
          node,
        });
      },
      CallExpression(node) {
        const functionName = getNodeName(node.callee);

        switch (functionName) {
          case 'describe.skip':
            context.report({ message: 'Skipped test suite', node });
            break;

          case 'it.skip':
          case 'test.skip':
            context.report({ message: 'Skipped test', node });
            break;
        }
      },
      'CallExpression[callee.name="pending"]'(node) {
        if (scopeHasLocalReference(context.getScope(), 'pending')) {
          return;
        }

        if (testDepth > 0) {
          context.report({
            message: 'Call to pending() within test',
            node,
          });
        } else if (suiteDepth > 0) {
          context.report({
            message: 'Call to pending() within test suite',
            node,
          });
        } else {
          context.report({
            message: 'Call to pending()',
            node,
          });
        }
      },
      'CallExpression[callee.name="xdescribe"]'(node) {
        context.report({ message: 'Disabled test suite', node });
      },
      'CallExpression[callee.name=/^xit|xtest$/]'(node) {
        context.report({ message: 'Disabled test', node });
      },
      'CallExpression[callee.name="describe"]:exit'() {
        suiteDepth--;
      },
      'CallExpression[callee.name=/^it|test$/]:exit'() {
        testDepth--;
      },
    };
  },
};