nightwatch
Version:
Easy to use Node.js based end-to-end testing solution for web applications using the W3C WebDriver API.
189 lines (158 loc) • 5.26 kB
JavaScript
const CliTable = require('cli-table3');
const Utils = require('../utils');
const {Logger} = Utils;
const describeViolations = (violations) => {
const aggregate = {};
violations.map(({nodes}, index) => {
nodes.forEach(({target, html}) => {
const key = JSON.stringify(target) + html;
if (aggregate[key]) {
aggregate[key].violations = aggregate[key].violations || [];
aggregate[key].violations.push(index);
} else {
aggregate[key] = {
target: JSON.stringify(target),
html,
index: [index]
};
}
});
});
return Object.values(aggregate).map(({target, html, violations}) => {
return {target, html, violations: JSON.stringify(violations)};
});
};
const describePasses = (passes) => {
const aggregate = {};
passes.map(({nodes}, index) => {
nodes.forEach(({target, html}) => {
const key = JSON.stringify(target) + html;
aggregate[key] = {
target: JSON.stringify(target),
html
};
});
});
return Object.values(aggregate).map(({target, html}) => {
return {target, html};
});
};
module.exports = class AxeReport {
static createTable() {
const table = new CliTable({
chars: {
'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '',
'bottom': '═', 'bottom-mid': '', 'bottom-left': '╚', 'bottom-right': '╝'
}
});
table.push(
[
Logger.colors.light_cyan('ID'),
Logger.colors.light_cyan('Impact'),
Logger.colors.light_cyan('Description'),
Logger.colors.light_cyan('Nodes')
],
[
Logger.colors.stack_trace('─────────────────────'),
Logger.colors.stack_trace('──────────'), '',
Logger.colors.stack_trace('──────────')
]
);
return table;
}
constructor(report, {detailedReport = true, includeHtml = true} = {}) {
this.report = report;
this.detailedReport = detailedReport;
this.includeHtml = includeHtml;
}
hasViolations() {
return this.report.violations.length > 0;
}
printPasses() {
const table = new CliTable({
chars: {
'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': '',
'bottom': '═', 'bottom-mid': '', 'bottom-left': '╚', 'bottom-right': '═╝'
}
});
table.push(
[
Logger.colors.light_cyan('Rule'),
Logger.colors.light_cyan('Description'),
Logger.colors.light_cyan('Nodes')
],
[
Logger.colors.stack_trace('─────────────────────'),
Logger.colors.stack_trace('──────────'),
Logger.colors.stack_trace('───────')
]
);
const {passes} = this.report;
passes.forEach(({id, description, nodes}) => {
table.push([id, description, nodes.length]);
});
const nodes = describePasses(passes).map(({target, html}) => {
return {target, html};
});
table.push(
[
Logger.colors.stack_trace('─────────────────────'),
Logger.colors.stack_trace('────────────────────────'),
Logger.colors.stack_trace('───────')
],
[
Logger.colors.light_cyan('Target'),
{colSpan: 2, content: Logger.colors.light_cyan('Html')}
]
);
nodes.forEach(({target, html}) => {
table.push(
[
target,
{colSpan: 2, content: Logger.colors.stack_trace(html)}
]
);
});
// eslint-disable-next-line no-console
console.log(table.toString());
}
printViolations(component) {
// eslint-disable-next-line no-console
console.log('\n' + Logger.colors.light_red(`Accessibility violations for: ${component}`));
const {violations} = this.report;
const table = AxeReport.createTable();
violations.forEach(({id, impact, description, nodes}) => {
table.push([id, impact, description, nodes.length]);
});
// summary
if (this.detailedReport) {
const nodeViolations = describeViolations(violations).map(({target, html, violations}) => {
if (!this.includeHtml) {
return {
target,
violations
};
}
return {target, html, violations};
});
table.push(
[
Logger.colors.stack_trace('─────────────────────'),
Logger.colors.stack_trace('──────────'), '',
Logger.colors.stack_trace('──────────')
],
[{colSpan: 2, content: Logger.colors.light_cyan('Target')}, Logger.colors.light_cyan('Html'), Logger.colors.light_cyan('Violations')]
);
nodeViolations.forEach(({target, html, violations}) => {
table.push(
[{colSpan: 2, content: target}, Logger.colors.stack_trace(html), violations]
);
});
table.push([
{colSpan: 4, content: ''}
]);
}
// eslint-disable-next-line no-console
console.log(table.toString());
}
};