eslint-plugin-ava
Version:
ESLint rules for AVA
81 lines (67 loc) • 1.79 kB
JavaScript
const {visitIf} = require('enhance-visitors');
const util = require('../util');
const createAvaRule = require('../create-ava-rule');
const MAX_ASSERTIONS_DEFAULT = 5;
const notAssertionMethods = new Set(['plan', 'end']);
const create = context => {
const ava = createAvaRule();
// TODO: Convert options to object JSON Schema default works properly
// https://github.com/avajs/eslint-plugin-ava/issues/260
const maxAssertions = context.options[0] ?? MAX_ASSERTIONS_DEFAULT;
let assertionCount = 0;
let nodeToReport;
return ava.merge({
CallExpression: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
const {callee} = node;
if (callee.type !== 'MemberExpression') {
return;
}
if (
callee.property
&& !notAssertionMethods.has(callee.property.name)
&& util.getNameOfRootNodeObject(callee) === 't'
) {
const firstNonSkipMember = util.getMembers(callee).find(name => name !== 'skip');
if (!util.assertionMethods.has(firstNonSkipMember)) {
return;
}
assertionCount++;
if (assertionCount === maxAssertions + 1) {
nodeToReport = node;
}
}
}),
'CallExpression:exit': visitIf([ava.isTestNode])(() => {
// Leaving test function
if (assertionCount > maxAssertions) {
context.report({
node: nodeToReport,
message: `Expected at most ${maxAssertions} assertions, but found ${assertionCount}.`,
});
}
assertionCount = 0;
nodeToReport = undefined;
}),
});
};
const schema = [
{
type: 'integer',
default: MAX_ASSERTIONS_DEFAULT,
},
];
module.exports = {
create,
meta: {
type: 'suggestion',
docs: {
description: 'Enforce a limit on the number of assertions in a test.',
url: util.getDocsUrl(__filename),
},
schema,
},
};
;