| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview Tests to ensure that the accessibility audit and mechanisms | 6 * @fileoverview Tests to ensure that the accessibility audit and mechanisms |
| 7 * to enable/disable it work as expected. | 7 * to enable/disable it work as expected. |
| 8 * @author aboxhall@google.com (Alice Boxhall) | 8 * @author aboxhall@google.com (Alice Boxhall) |
| 9 * @see test_api.js | 9 * @see test_api.js |
| 10 */ | 10 */ |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 | 33 |
| 34 /** | 34 /** |
| 35 * Number of expected accessibility warnings, if it should be checked, | 35 * Number of expected accessibility warnings, if it should be checked, |
| 36 * otherwise null. | 36 * otherwise null. |
| 37 * @type {?number} | 37 * @type {?number} |
| 38 */ | 38 */ |
| 39 expectedErrors: null, | 39 expectedErrors: null, |
| 40 | 40 |
| 41 isAsync: false, | 41 isAsync: false, |
| 42 | 42 |
| 43 accessibilityAuditConfig: function() { |
| 44 if (!this.accessibilityAuditConfig_) { |
| 45 testing.Test.prototype.accessibilityAuditConfig.call(this); |
| 46 } |
| 47 this.accessibilityAuditConfig_.auditRulesToRun = ['lowContrastElements', |
| 48 'badAriaRole', |
| 49 'controlsWithoutLabel']; |
| 50 return this.accessibilityAuditConfig_; |
| 51 }, |
| 52 |
| 43 tearDown: function() { | 53 tearDown: function() { |
| 44 var accessibilityResults = this.getAccessibilityResults(); | 54 var accessibilityResults = this.getAccessibilityResults(); |
| 45 var numAccessibilityErrors = 0; | 55 var numAccessibilityErrors = 0; |
| 46 var numAccessibilityWarnings = 0; | 56 var numAccessibilityWarnings = 0; |
| 47 for (var i = 0; i < accessibilityResults.length; i++) { | 57 for (var i = 0; i < accessibilityResults.length; i++) { |
| 48 var result = accessibilityResults[i]; | 58 var result = accessibilityResults[i]; |
| 49 if (result.rule.severity == axs.constants.Severity.Warning) | 59 if (result.rule.severity == axs.constants.Severity.Warning) |
| 50 numAccessibilityWarnings++; | 60 numAccessibilityWarnings++; |
| 51 else | 61 else |
| 52 numAccessibilityErrors++; | 62 numAccessibilityErrors++; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 axs.Audit = audit.proxy(); | 144 axs.Audit = audit.proxy(); |
| 135 } | 145 } |
| 136 | 146 |
| 137 /** | 147 /** |
| 138 * Creates an expectation that the global axs.Audit object will have its run() | 148 * Creates an expectation that the global axs.Audit object will have its run() |
| 139 * method called |times| times. | 149 * method called |times| times. |
| 140 * This creates an interstitial mock axs.Audit object with the expectation, and | 150 * This creates an interstitial mock axs.Audit object with the expectation, and |
| 141 * delegates to the real axs.Audit object to run the actual audit. | 151 * delegates to the real axs.Audit object to run the actual audit. |
| 142 * @param {number} times The number of times the audit is expected to run. | 152 * @param {number} times The number of times the audit is expected to run. |
| 143 */ | 153 */ |
| 144 function expectAuditWillRun(times) { | 154 function expectAuditWillRun(times, auditConfig) { |
| 145 var audit = createMockAudit(); | 155 var audit = createMockAudit(); |
| 146 var realAudit = axs.Audit; | 156 var realAudit = axs.Audit; |
| 147 var expectedInvocation = audit.expects(exactly(times)).run(ANYTHING); | 157 var expectedInvocation = audit.expects(exactly(times)).run(ANYTHING); |
| 148 var willArgs = []; | 158 var willArgs = []; |
| 149 for (var i = 0; i < times; i++) | 159 for (var i = 0; i < times; i++) |
| 150 willArgs.push(callFunction(realAudit.run)); | 160 willArgs.push(callFunction(realAudit.run, auditConfig)); |
| 151 expectedInvocation.will.apply(expectedInvocation, willArgs); | 161 expectedInvocation.will.apply(expectedInvocation, willArgs); |
| 152 axs.Audit = audit.proxy(); | 162 axs.Audit = audit.proxy(); |
| 153 axs.Audit.createReport = realAudit.createReport; | 163 axs.Audit.createReport = realAudit.createReport; |
| 154 axs.Audit.auditResults = realAudit.auditResults; | 164 axs.Audit.auditResults = realAudit.auditResults; |
| 155 axs.Audit.accessibilityErrorMessage = realAudit.accessibilityErrorMessage; | 165 axs.Audit.accessibilityErrorMessage = realAudit.accessibilityErrorMessage; |
| 156 } | 166 } |
| 157 | 167 |
| 158 // Test that an audit failure causes a test failure, if both | 168 // Test that an audit failure causes a test failure, if both |
| 159 // |runAccessibilityChecks| and |accessibilityIssuesAreErrors| are true. | 169 // |runAccessibilityChecks| and |accessibilityIssuesAreErrors| are true. |
| 160 TEST_F('WebUIAccessibilityAuditBrowserTest_ShouldFail', 'testWithAuditFailures', | 170 TEST_F('WebUIAccessibilityAuditBrowserTest_ShouldFail', 'testWithAuditFailures', |
| 161 function() { | 171 function() { |
| 162 expectAuditWillRun(1); | 172 expectAuditWillRun(1, this.accessibilityAuditConfig()); |
| 163 addAuditFailures(); | 173 addAuditFailures(); |
| 164 }); | 174 }); |
| 165 | 175 |
| 166 // Test that the accessibility audit does not run if |runAccessibilityChecks| | 176 // Test that the accessibility audit does not run if |runAccessibilityChecks| |
| 167 // is false. | 177 // is false. |
| 168 TEST_F('WebUIAccessibilityAuditBrowserTest', | 178 TEST_F('WebUIAccessibilityAuditBrowserTest', |
| 169 'testWithAuditFailures_a11yChecksDisabled', | 179 'testWithAuditFailures_a11yChecksDisabled', |
| 170 function() { | 180 function() { |
| 171 expectAuditWillNotRun(); | 181 expectAuditWillNotRun(); |
| 172 this.disableAccessibilityChecks(); | 182 this.disableAccessibilityChecks(); |
| 173 addAuditFailures(); | 183 addAuditFailures(); |
| 174 }); | 184 }); |
| 175 | 185 |
| 176 // Tests that the accessibility audit will run but not cause a test failure when | 186 // Tests that the accessibility audit will run but not cause a test failure when |
| 177 // accessibilityIssuesAreErrors(false) is called in the test function | 187 // accessibilityIssuesAreErrors(false) is called in the test function |
| 178 TEST_F('WebUIAccessibilityAuditBrowserTest', | 188 TEST_F('WebUIAccessibilityAuditBrowserTest', |
| 179 'testWithAuditFailures_a11yIssuesAreWarnings', | 189 'testWithAuditFailures_a11yIssuesAreWarnings', |
| 180 function() { | 190 function() { |
| 181 this.accessibilityIssuesAreErrors = false; | 191 this.accessibilityIssuesAreErrors = false; |
| 182 expectAuditWillRun(1); | 192 expectAuditWillRun(1, this.accessibilityAuditConfig()); |
| 183 expectReportConsoleWarning(); | 193 expectReportConsoleWarning(); |
| 184 | 194 |
| 185 this.expectedWarnings = 1; | 195 this.expectedWarnings = 1; |
| 186 this.expectedErrors = 2; | 196 this.expectedErrors = 2; |
| 187 this.enableAccessibilityChecks(); | 197 this.enableAccessibilityChecks(); |
| 188 addAuditFailures(); | 198 addAuditFailures(); |
| 189 }); | 199 }); |
| 190 | 200 |
| 191 /** | 201 /** |
| 192 * Test fixture with |runAccessibilityChecks| set to false. | 202 * Test fixture with |runAccessibilityChecks| set to false. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 function() { | 238 function() { |
| 229 expectAuditWillNotRun(); | 239 expectAuditWillNotRun(); |
| 230 addAuditFailures(); | 240 addAuditFailures(); |
| 231 }); | 241 }); |
| 232 | 242 |
| 233 // Test that the accessibility audit does run if the enableAccessibilityChecks() | 243 // Test that the accessibility audit does run if the enableAccessibilityChecks() |
| 234 // method is called in the test function. | 244 // method is called in the test function. |
| 235 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture_ShouldFail', | 245 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture_ShouldFail', |
| 236 'testWithAuditFailures', | 246 'testWithAuditFailures', |
| 237 function() { | 247 function() { |
| 238 expectAuditWillRun(1); | 248 expectAuditWillRun(1, this.accessibilityAuditConfig()); |
| 239 this.enableAccessibilityChecks(); | 249 this.enableAccessibilityChecks(); |
| 240 addAuditFailures(); | 250 addAuditFailures(); |
| 241 }); | 251 }); |
| 242 | 252 |
| 243 // Test that the accessibility audit runs when the expectAccessibilityOk() | 253 // Test that the accessibility audit runs when the expectAccessibilityOk() |
| 244 // method is called. | 254 // method is called. |
| 245 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture', | 255 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture', |
| 246 'testRunningAuditManually_noErrors', | 256 'testRunningAuditManually_noErrors', |
| 247 function() { | 257 function() { |
| 248 expectAuditWillRun(1); | 258 expectAuditWillRun(1, this.accessibilityAuditConfig()); |
| 249 expectAccessibilityOk(); | 259 expectAccessibilityOk(); |
| 250 }); | 260 }); |
| 251 | 261 |
| 252 // Test that calling expectAccessibilityOk() when there are accessibility issues | 262 // Test that calling expectAccessibilityOk() when there are accessibility issues |
| 253 // on the page causes the test to fail. | 263 // on the page causes the test to fail. |
| 254 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture_ShouldFail', | 264 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture_ShouldFail', |
| 255 'testRunningAuditManually_withErrors', | 265 'testRunningAuditManually_withErrors', |
| 256 function() { | 266 function() { |
| 257 expectAuditWillRun(1); | 267 expectAuditWillRun(1, this.accessibilityAuditConfig()); |
| 258 addAuditFailures(); | 268 addAuditFailures(); |
| 259 expectAccessibilityOk(); | 269 expectAccessibilityOk(); |
| 260 }); | 270 }); |
| 261 | 271 |
| 262 // Test that calling expectAccessibilityOk() multiple times will cause the | 272 // Test that calling expectAccessibilityOk() multiple times will cause the |
| 263 // accessibility audit to run multiple times. | 273 // accessibility audit to run multiple times. |
| 264 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture', | 274 TEST_F('WebUIAccessibilityAuditBrowserTest_TestsDisabledInFixture', |
| 265 'testRunningAuditManuallySeveralTimes', function() { | 275 'testRunningAuditManuallySeveralTimes', function() { |
| 266 expectAuditWillRun(2); | 276 expectAuditWillRun(2, this.accessibilityAuditConfig()); |
| 267 expectAccessibilityOk(); | 277 expectAccessibilityOk(); |
| 268 expectAccessibilityOk(); | 278 expectAccessibilityOk(); |
| 269 }); | 279 }); |
| 270 | 280 |
| 271 /** | 281 /** |
| 272 * Test fixture with |accessibilityIssuesAreErrors| set to false. | 282 * Test fixture with |accessibilityIssuesAreErrors| set to false. |
| 273 * @constructor | 283 * @constructor |
| 274 * @extends {WebUIAccessibilityAuditBrowserTest} | 284 * @extends {WebUIAccessibilityAuditBrowserTest} |
| 275 */ | 285 */ |
| 276 function WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings() {} | 286 function WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings() {} |
| (...skipping 17 matching lines...) Expand all Loading... |
| 294 | 304 |
| 295 testShouldFail: true | 305 testShouldFail: true |
| 296 }; | 306 }; |
| 297 | 307 |
| 298 | 308 |
| 299 // Tests that the accessibility audit will run but not cause a test failure when | 309 // Tests that the accessibility audit will run but not cause a test failure when |
| 300 // |accessibilityIssuesAreErrors| is false in the test fixture. | 310 // |accessibilityIssuesAreErrors| is false in the test fixture. |
| 301 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings', | 311 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings', |
| 302 'testWithAuditFailures', | 312 'testWithAuditFailures', |
| 303 function() { | 313 function() { |
| 304 expectAuditWillRun(1); | 314 expectAuditWillRun(1, this.accessibilityAuditConfig()); |
| 305 expectReportConsoleWarning(); | 315 expectReportConsoleWarning(); |
| 306 this.expectedWarnings = 1; | 316 this.expectedWarnings = 1; |
| 307 this.expectedErrors = 2; | 317 this.expectedErrors = 2; |
| 308 | 318 |
| 309 this.enableAccessibilityChecks(); | 319 this.enableAccessibilityChecks(); |
| 310 addAuditFailures(); | 320 addAuditFailures(); |
| 311 }); | 321 }); |
| 312 | 322 |
| 313 // Tests that the accessibility audit will run and call a test failure when | 323 // Tests that the accessibility audit will run and call a test failure when |
| 314 // accessibilityIssuesAreErrors(true) is called in the test function. | 324 // accessibilityIssuesAreErrors(true) is called in the test function. |
| 315 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings_ShouldFail', | 325 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings_ShouldFail', |
| 316 'testWithAuditFailuresAndIssuesAreErrors', | 326 'testWithAuditFailuresAndIssuesAreErrors', |
| 317 function() { | 327 function() { |
| 318 expectAuditWillRun(1); | 328 expectAuditWillRun(1, this.accessibilityAuditConfig()); |
| 319 this.expectedWarnings = 1; | 329 this.expectedWarnings = 1; |
| 320 this.expectedErrors = 2; | 330 this.expectedErrors = 2; |
| 321 | 331 |
| 322 this.accessibilityIssuesAreErrors = true; | 332 this.accessibilityIssuesAreErrors = true; |
| 323 this.enableAccessibilityChecks(); | 333 this.enableAccessibilityChecks(); |
| 324 | 334 |
| 325 addAuditFailures(); | 335 addAuditFailures(); |
| 326 }); | 336 }); |
| 327 | 337 |
| 328 // Tests that the accessibility audit will run twice if expectAccessibilityOk() | 338 // Tests that the accessibility audit will run twice if expectAccessibilityOk() |
| 329 // is called during the test function and |runAccessibilityChecks| is true in | 339 // is called during the test function and |runAccessibilityChecks| is true in |
| 330 // the test fixture. | 340 // the test fixture. |
| 331 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings', | 341 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings', |
| 332 'testWithAuditFailuresAndExpectA11yOk', | 342 'testWithAuditFailuresAndExpectA11yOk', |
| 333 function() { | 343 function() { |
| 334 expectAuditWillRun(2); | 344 expectAuditWillRun(2, this.accessibilityAuditConfig()); |
| 335 | 345 |
| 336 expectAccessibilityOk(); | 346 expectAccessibilityOk(); |
| 337 | 347 |
| 338 this.expectedWarnings = 1; | 348 this.expectedWarnings = 1; |
| 339 this.expectedErrors = 2; | 349 this.expectedErrors = 2; |
| 340 expectReportConsoleWarning(); | 350 expectReportConsoleWarning(); |
| 341 | 351 |
| 342 this.enableAccessibilityChecks(); | 352 this.enableAccessibilityChecks(); |
| 343 | 353 |
| 344 addAuditFailures(); | 354 addAuditFailures(); |
| 345 }); | 355 }); |
| 346 | 356 |
| 347 // Tests that parts of the page can be ignored on a per-audit rule basis. | 357 // Tests that parts of the page can be ignored on a per-audit rule basis. |
| 348 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings', | 358 TEST_F('WebUIAccessibilityAuditBrowserTest_IssuesAreWarnings', |
| 349 'testCanIgnoreSelectors', | 359 'testCanIgnoreSelectors', |
| 350 function() { | 360 function() { |
| 351 this.disableAccessibilityChecks(); | 361 this.disableAccessibilityChecks(); |
| 352 | |
| 353 addAuditFailures(); | 362 addAuditFailures(); |
| 354 var accessibilityResults = []; | 363 var accessibilityResults = []; |
| 355 try { | 364 try { |
| 356 assertAccessibilityOk(accessibilityResults); | 365 assertAccessibilityOk(accessibilityResults); |
| 357 } catch (e) { | 366 } catch (e) { |
| 358 // Expected error from assertion | 367 // Expected error from assertion |
| 359 } | 368 } |
| 360 expectEquals(3, accessibilityResults.length); | 369 expectEquals(3, accessibilityResults.length); |
| 361 | 370 |
| 362 accessibilityResults.length = 0; | 371 accessibilityResults.length = 0; |
| 363 | 372 |
| 364 this.accessibilityAuditConfig().ignoreSelectors('lowContrastElements', 'P'); | 373 this.accessibilityAuditConfig().ignoreSelectors('lowContrastElements', 'P'); |
| 365 try { | 374 try { |
| 366 assertAccessibilityOk(accessibilityResults); | 375 assertAccessibilityOk(accessibilityResults); |
| 367 } catch (e) { | 376 } catch (e) { |
| 368 // Expected error from assertion | 377 // Expected error from assertion |
| 369 } | 378 } |
| 370 expectEquals(2, accessibilityResults.length); | 379 expectEquals(2, accessibilityResults.length); |
| 371 for (var i = 0; i < accessibilityResults.length; i++) { | 380 for (var i = 0; i < accessibilityResults.length; i++) { |
| 372 expectFalse(accessibilityResults[i].rule.name == 'lowContrastElements'); | 381 expectFalse(accessibilityResults[i].rule.name == 'lowContrastElements'); |
| 373 } | 382 } |
| 374 }); | 383 }); |
| OLD | NEW |