no-hooks.js 1.17 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
'use strict';

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

module.exports = {
  meta: {
    docs: {
      url: getDocsUrl(__filename),
    },
  },
  schema: [
    {
      type: 'object',
      properties: {
        allow: {
          type: 'array',
          contains: ['beforeAll', 'beforeEach', 'afterAll', 'afterEach'],
        },
      },
      additionalProperties: false,
    },
  ],
  create(context) {
    const testHookNames = Object.assign(Object.create(null), {
      beforeAll: true,
      beforeEach: true,
      afterAll: true,
      afterEach: true,
    });

    const whitelistedHookNames = (
      context.options[0] || { allow: [] }
    ).allow.reduce((hashMap, value) => {
      hashMap[value] = true;
      return hashMap;
    }, Object.create(null));

    const isHook = node => testHookNames[node.callee.name];
    const isWhitelisted = node => whitelistedHookNames[node.callee.name];

    return {
      CallExpression(node) {
        if (isHook(node) && !isWhitelisted(node)) {
          context.report({
            node,
            message: "Unexpected '{{ hookName }}' hook",
            data: { hookName: node.callee.name },
          });
        }
      },
    };
  },
};