'use strict';
|
|
|
|
const createAstUtils = require('../util/ast');
|
|
|
|
function newLayer() {
|
|
return {
|
|
describeTitles: [],
|
|
testTitles: []
|
|
};
|
|
}
|
|
|
|
function isFirstArgLiteral(node) {
|
|
return node.arguments && node.arguments[0] && node.arguments[0].type === 'Literal';
|
|
}
|
|
|
|
module.exports = {
|
|
meta: {
|
|
type: 'suggestion',
|
|
docs: {
|
|
description: 'Disallow identical titles'
|
|
}
|
|
},
|
|
create(context) {
|
|
const astUtils = createAstUtils(context.settings);
|
|
const titleLayers = [ newLayer() ];
|
|
|
|
function handlTestCaseTitles(titles, node, title) {
|
|
if (astUtils.isTestCase(node)) {
|
|
if (titles.includes(title)) {
|
|
context.report({
|
|
node,
|
|
message: 'Test title is used multiple times in the same test suite.'
|
|
});
|
|
}
|
|
titles.push(title);
|
|
}
|
|
}
|
|
|
|
function handlTestSuiteTitles(titles, node, title) {
|
|
if (!astUtils.isDescribe(node)) {
|
|
return;
|
|
}
|
|
if (titles.includes(title)) {
|
|
context.report({
|
|
node,
|
|
message: 'Test suite title is used multiple times.'
|
|
});
|
|
}
|
|
titles.push(title);
|
|
}
|
|
|
|
return {
|
|
CallExpression(node) {
|
|
const currentLayer = titleLayers[titleLayers.length - 1];
|
|
|
|
if (astUtils.isDescribe(node)) {
|
|
titleLayers.push(newLayer());
|
|
}
|
|
if (!isFirstArgLiteral(node)) {
|
|
return;
|
|
}
|
|
|
|
const title = node.arguments[0].value;
|
|
handlTestCaseTitles(currentLayer.testTitles, node, title);
|
|
handlTestSuiteTitles(currentLayer.describeTitles, node, title);
|
|
},
|
|
'CallExpression:exit'(node) {
|
|
if (astUtils.isDescribe(node)) {
|
|
titleLayers.pop();
|
|
}
|
|
}
|
|
};
|
|
}
|
|
};
|