axe-core
Version:
Accessibility engine for automated Web UI testing
110 lines (100 loc) • 3.39 kB
JavaScript
import processMessage from './process-message';
import clone from './clone';
import findBy from './find-by';
import extendMetaData from './extend-meta-data';
import incompleteFallbackMessage from '../reporters/helpers/incomplete-fallback-msg';
/**
* Construct incomplete message from check.data
* @param {Object} checkData Check result with reason specified
* @param {Object} messages Source data object with message options
* @return {String}
* @private
*/
function getIncompleteReason(checkData, messages) {
function getDefaultMsg(messages) {
if (messages.incomplete && messages.incomplete.default) {
// fall back to the default message if no reason specified
return messages.incomplete.default;
} else {
return incompleteFallbackMessage();
}
}
if (checkData && checkData.missingData) {
try {
const msg = messages.incomplete[checkData.missingData[0].reason];
if (!msg) {
throw new Error();
}
return msg;
} catch (e) {
if (typeof checkData.missingData === 'string') {
// return a string with the appropriate reason
return messages.incomplete[checkData.missingData];
} else {
return getDefaultMsg(messages);
}
}
} else if (checkData && checkData.messageKey) {
return messages.incomplete[checkData.messageKey];
} else {
return getDefaultMsg(messages);
}
}
/**
* Extend checksData with the correct result message
* @param {Object} checksData The check result data
* @param {Boolean} shouldBeTrue Result of pass/fail check run
* @param {Object} rule The rule metadata
* @return {Function}
* @private
*/
function extender(checksData, shouldBeTrue, rule) {
return check => {
const sourceData = checksData[check.id] || {};
const messages = sourceData.messages || {};
const data = Object.assign({}, sourceData);
delete data.messages;
if (!rule.reviewOnFail && check.result === undefined) {
// handle old doT template
if (
typeof messages.incomplete === 'object' &&
!Array.isArray(check.data)
) {
data.message = getIncompleteReason(check.data, messages);
}
// fallback to new process message style
if (!data.message) {
data.message = messages.incomplete;
}
} else {
data.message =
check.result === shouldBeTrue ? messages.pass : messages.fail;
}
// don't process doT template functions
if (typeof data.message !== 'function') {
data.message = processMessage(data.message, check.data);
}
extendMetaData(check, data);
};
}
/**
* Publish metadata from axe._audit.data
* @param {RuleResult} result Result to publish to
* @private
*/
function publishMetaData(ruleResult) {
// TODO: es-modules_audit
const checksData = axe._audit.data.checks || {};
const rulesData = axe._audit.data.rules || {};
const rule = findBy(axe._audit.rules, 'id', ruleResult.id) || {};
ruleResult.tags = clone(rule.tags || []);
const shouldBeTrue = extender(checksData, true, rule);
const shouldBeFalse = extender(checksData, false, rule);
ruleResult.nodes.forEach(detail => {
detail.any.forEach(shouldBeTrue);
detail.all.forEach(shouldBeTrue);
detail.none.forEach(shouldBeFalse);
});
extendMetaData(ruleResult, clone(rulesData[ruleResult.id] || {}));
}
export default publishMetaData;