UNPKG

eslint-plugin-mocha

Version:

Eslint rules for mocha.

83 lines 2.98 kB
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