prefer-to-have-length.js 1.29 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
'use strict';

const {
  getDocsUrl,
  expectCase,
  expectNotCase,
  expectResolveCase,
  expectRejectCase,
  method,
} = require('./util');

module.exports = {
  meta: {
    docs: {
      url: getDocsUrl(__filename),
    },
    fixable: 'code',
  },
  create(context) {
    return {
      CallExpression(node) {
        if (
          !(
            expectNotCase(node) ||
            expectResolveCase(node) ||
            expectRejectCase(node)
          ) &&
          expectCase(node) &&
          (method(node).name === 'toBe' || method(node).name === 'toEqual') &&
          node.arguments[0].property &&
          node.arguments[0].property.name === 'length'
        ) {
          const propertyDot = context
            .getSourceCode()
            .getFirstTokenBetween(
              node.arguments[0].object,
              node.arguments[0].property,
              token => token.value === '.'
            );
          context.report({
            fix(fixer) {
              return [
                fixer.remove(propertyDot),
                fixer.remove(node.arguments[0].property),
                fixer.replaceText(method(node), 'toHaveLength'),
              ];
            },
            message: 'Use toHaveLength() instead',
            node: method(node),
          });
        }
      },
    };
  },
};