eslint-plugin-mocha
Version:
Eslint rules for mocha.
83 lines • 2.98 kB
JavaScript
import { createMochaVisitors } from "../ast/mocha-visitors.js";
import { expectCallExpression, isLiteral } from "../ast/node-types.js";
import { getLastOrThrow } from "../list.js";
function newLayer() {
return {
suiteTitles: [],
testTitles: []
};
}
function extractTitleArgument(node) {
const [firstArg] = expectCallExpression(node).arguments;
if (firstArg !== undefined && isLiteral(firstArg)) {
return firstArg.value?.toString() ?? null;
}
return null;
}
export const noIdenticalTitleRule = {
meta: {
type: 'suggestion',
docs: {
description: 'Disallow identical titles',
recommended: true,
url: 'https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/documentation/rules/no-identical-title.md'
},
schema: [],
messages: {
duplicateTestTitle: 'Test title is used multiple times in the same test suite.',
duplicateSuiteTitle: 'Test suite title is used multiple times.'
},
languages: ['js/js']
},
create(context) {
const titleLayers = [newLayer()];
function handleTestCaseTitles(visitorContext, title) {
const currentLayer = getLastOrThrow(titleLayers);
const titles = currentLayer.testTitles;
if (titles.includes(title)) {
context.report({
node: visitorContext.node,
messageId: 'duplicateTestTitle'
});
}
titleLayers[titleLayers.length - 1] = {
...currentLayer,
testTitles: [...titles, title]
};
}
function handleTestSuiteTitles(visitorContext, title) {
const currentLayer = getLastOrThrow(titleLayers);
const titles = currentLayer.suiteTitles;
if (titles.includes(title)) {
context.report({
node: visitorContext.node,
messageId: 'duplicateSuiteTitle'
});
}
titleLayers[titleLayers.length - 1] = {
...currentLayer,
suiteTitles: [...titles, title]
};
}
return createMochaVisitors(context, {
suite(visitorContext) {
const title = extractTitleArgument(visitorContext.node);
if (title !== null) {
handleTestSuiteTitles(visitorContext, title);
}
titleLayers.push(newLayer());
},
'suite:exit'() {
titleLayers.pop();
},
testCase(visitorContext) {
const title = extractTitleArgument(visitorContext.node);
if (title === null) {
return;
}
handleTestCaseTitles(visitorContext, title);
}
});
}
};
//# sourceMappingURL=no-identical-title.js.map