blob: 256904b6275e9ce98e0bd5661a3abbb6a08fd693 [file] [log] [blame]
/**
* @license
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
(function(Mocha, chai, axs) {
Object.keys(Mocha.interfaces).forEach(function(iface) {
var orig = Mocha.interfaces[iface];
Mocha.interfaces[iface] = function(suite) {
orig.apply(this, arguments);
var Suite = Mocha.Suite;
var Test = Mocha.Test;
suite.on('pre-require', function(context, file, mocha) {
/**
* Runs the Chrome Accessibility Developer Tools Audit against a test-fixture
*
* @param {String} fixtureId ID of the fixture element in the document to use
* @param {Array?} ignoredRules Array of rules to ignore for this suite
*/
context.a11ySuite = function(fixtureId, ignoredRules) {
// capture a reference to the fixture element early
var fixtureElement = document.getElementById(fixtureId);
if (!fixtureElement) {
return;
}
// build an audit config to disable certain ignorable tests
var axsConfig = new axs.AuditConfiguration();
axsConfig.scope = document.body;
axsConfig.showUnsupportedRulesWarning = false;
axsConfig.auditRulesToIgnore = ignoredRules;
// build mocha suite
var a11ySuite = Suite.create(suite, 'A11y Audit - Fixture: ' + fixtureId);
// override the `eachTest` function to hackily create the tests
//
// eachTest is called right before test runs to calculate the total
// number of tests
a11ySuite.eachTest = function() {
// instantiate fixture
fixtureElement.create();
// run audit
var auditResults = axs.Audit.run(axsConfig);
// create tests for audit results
auditResults.forEach(function(result, index) {
// only show applicable tests
if (result.result !== 'NA') {
var title = result.rule.heading;
// fail test if audit result is FAIL
var error = result.result === 'FAIL' ? axs.Audit.accessibilityErrorMessage(result) : null;
var test = new Test(title, function() {
if (error) {
throw new Error(error);
}
});
test.file = file;
a11ySuite.addTest(test);
}
});
// teardown fixture
fixtureElement.restore();
suite.eachTest.apply(a11ySuite, arguments);
this.eachTest = suite.eachTest;
};
return a11ySuite;
};
});
};
});
chai.use(function(chai, util) {
var Assertion = chai.Assertion;
// assert
chai.assert.a11yLabel = function(node, exp, msg){
new Assertion(node).to.have.a11yLabel(exp, msg);
};
// expect / should
Assertion.addMethod('a11yLabel', function(str, msg) {
if (msg) {
util.flag(this, 'message', msg);
}
var node = this._obj;
// obj must be a Node
new Assertion(node).to.be.instanceOf(Node);
// vind the text alternative with the help of accessibility dev tools
var textAlternative = axs.properties.findTextAlternatives(node, {});
this.assert(
textAlternative === str,
'expected #{this} to have text alternative #{exp} but got #{act}',
'expected #{this} to not have text alternative #{act}',
str,
textAlternative,
true
);
});
});
})(window.Mocha, window.chai, window.axs);