noredink-ui/script/puppeteer-tests.js

143 lines
4.4 KiB
JavaScript
Raw Normal View History

2022-01-22 03:49:18 +03:00
const expect = require('expect');
const puppeteer = require('puppeteer');
const httpServer = require('http-server');
const percySnapshot = require('@percy/puppeteer');
const platform = require('os').platform();
// We need to change the args passed to puppeteer based on the platform they're using
const puppeteerArgs = /^win/.test(platform) ? [] : ['--single-process'];
const PORT = process.env.PORT_NUMBER || 8000;
const { AxePuppeteer } = require('@axe-core/puppeteer');
const assert = require('assert');
2022-04-14 20:18:13 +03:00
describe('UI tests', function () {
2022-01-22 03:49:18 +03:00
let page;
let server;
let browser;
before(async () => {
server = httpServer.createServer({ root: `${__dirname}/../public` });
server.listen(PORT);
browser = await puppeteer.launch({
headless: true,
timeout: 10000,
args: puppeteerArgs
});
});
after(() => {
server.close();
});
2019-11-15 14:16:10 +03:00
const handleAxeResults = function(name, results) {
const violations = results["violations"];
if (violations.length > 0) {
violations.map(function(violation) {
console.log("\n\n", violation["id"], ":", violation["description"])
console.log(violation["help"])
console.log(violation["helpUrl"])
console.table(violation["nodes"], ["html"])
});
assert.fail(`Expected no axe violations in ${name} but got ${violations.length} violations`)
}
}
const defaultProcessing = async (name, location) => {
await page.goto(location)
2022-01-22 03:52:25 +03:00
await page.waitFor(`#${name.replace(".", "-")}`)
2022-01-22 03:49:18 +03:00
await percySnapshot(page, name)
const results = await new AxePuppeteer(page).disableRules(skippedRules[name] || []).analyze();
handleAxeResults(name, results);
}
2022-01-22 03:49:18 +03:00
2022-03-22 01:06:15 +03:00
const iconProcessing = async(name, location) => {
await page.goto(location)
await page.waitFor(`#${name}`)
await percySnapshot(page, name)
// visible icon names snapshot
await page.click("label");
await page.waitForSelector(".checkbox-V5__Checked")
await percySnapshot(page, `${name} - display icon names`)
2022-04-14 20:34:13 +03:00
const results = await new AxePuppeteer(page).disableRules(skippedRules[name] || []).analyze();
handleAxeResults(name, results);
2022-03-22 01:06:15 +03:00
}
const skippedRules = {
2022-04-19 19:40:48 +03:00
// Loading's color contrast check seems to change behavior depending on whether Percy snapshots are taken or not
'Loading': ['color-contrast'],
'RadioButton': ['duplicate-id'],
}
const specialProcessing = {
'Modal': async (name, location) => {
2022-01-22 03:49:18 +03:00
await page.goto(location)
await page.waitFor(`#${name}`)
2020-09-09 02:13:30 +03:00
await page.click('#launch-modal')
await page.waitFor('[role="dialog"]')
2022-01-22 03:49:18 +03:00
await percySnapshot(page, 'Full Info Modal')
2022-04-14 20:36:23 +03:00
const results = await new AxePuppeteer(page).disableRules(skippedRules[name] || []).analyze();
handleAxeResults(name, results);
2022-04-14 20:36:23 +03:00
await page.click('[aria-label="Close modal"]')
2020-09-09 02:13:30 +03:00
await page.select('select', 'warning')
await page.click('#launch-modal')
await page.waitFor('[role="dialog"]')
2022-01-22 03:49:18 +03:00
await percySnapshot(page, 'Full Warning Modal')
await page.click('[aria-label="Close modal"]')
2022-03-22 01:06:15 +03:00
},
'AssignmentIcon': iconProcessing,
'UiIcon': iconProcessing,
'Logo': iconProcessing,
'Pennant': iconProcessing
}
2022-01-22 03:49:18 +03:00
it('All', async function () {
page = await browser.newPage();
await page.goto(`http://localhost:${PORT}`);
await page.$('#maincontent');
await percySnapshot(page, this.test.fullTitle());
const results = await new AxePuppeteer(page).
disableRules([
"aria-hidden-focus",
"color-contrast",
"duplicate-id-aria",
"duplicate-id",
]).analyze();
2022-01-22 03:49:18 +03:00
page.close();
handleAxeResults("index view", results);
2020-09-09 22:46:24 +03:00
});
2022-01-22 03:49:18 +03:00
it('Doodads', async function () {
page = await browser.newPage();
await page.goto(`http://localhost:${PORT}`);
await page.$('#maincontent');
let links = await page.evaluate(() => {
let nodes = Array.from(document.querySelectorAll("[data-nri-description='doodad-link']"));
return nodes.map(node => [node.text, node.href])
})
await links.reduce((acc, [name, location]) => {
return acc.then(() => {
if (process.env.ONLYDOODAD == "default" || process.env.ONLYDOODAD == name) {
console.log(`Testing ${name}`)
let handler = specialProcessing[name] || defaultProcessing;
return handler(name, location);
2022-01-22 03:49:18 +03:00
}
})
2022-01-22 03:49:18 +03:00
}, Promise.resolve())
page.close();
2022-01-22 03:49:18 +03:00
})
});