@sector-labs/seo-slip
Version:
Catches SEO regressions by sampling and checking a website against a set of rules
58 lines (48 loc) • 2.07 kB
JavaScript
const xpath = require('xpath-html');
const { newMessage, newEmptyItemResult } = require('../reporting');
const { isHtmlDocument, tryGetContentByXPath } = require('../html');
module.exports = (contentRules) => {
const name = 'contentChecker';
return {
analysis: (queueItem, responseBody, response) => {
const isHtmlDoc = isHtmlDocument(responseBody, response);
const rule = (contentRules || []).find((rule) => queueItem.url.match(rule.url));
const result = {
url: queueItem.url,
isHtmlDoc: isHtmlDoc,
contentCheckerFindings: {},
};
if (isHtmlDoc && rule) {
Object.keys(rule.expected).forEach((locator) => {
const expectedPattern = rule.expected[locator];
const body = xpath.fromPageSource(responseBody);
const actualValue = tryGetContentByXPath(body, locator).join(' ');
result.contentCheckerFindings[locator] = {
expected: expectedPattern,
actual: actualValue,
};
});
}
return result;
},
check: (analysis) => {
const result = newEmptyItemResult();
Object.keys(analysis.contentCheckerFindings).forEach((locator) => {
const url = analysis.url;
const expected = analysis.contentCheckerFindings[locator].expected;
const actual = analysis.contentCheckerFindings[locator].actual;
if (!actual.match(expected)) {
result.passed = false;
result.messages.push(
newMessage(
analysis.url,
name,
`For locator=${locator}, expected=${expected}, actual="${actual}"`
)
);
}
});
return result;
},
};
};