Skip to content

Commit c37ac4d

Browse files
authored
Merge pull request #439 from opentripplanner/dev
Release: 23 August 2021
2 parents 36328f5 + 16ca30c commit c37ac4d

File tree

17 files changed

+383
-114
lines changed

17 files changed

+383
-114
lines changed

.github/workflows/codespell.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ jobs:
1212
- uses: codespell-project/actions-codespell@master
1313
with:
1414
check_filenames: true
15-
skip: ./.git,yarn.lock
15+
# The a11y test file has a false positive and the ignore list does not work
16+
# see https://github.com/opentripplanner/otp-react-redux/pull/436/checks?check_run_id=3369380014
17+
skip: ./.git,yarn.lock,./a11y/a11y.test.js

__tests__/components/viewers/__snapshots__/stop-viewer.js.snap

+56
Original file line numberDiff line numberDiff line change
@@ -827,12 +827,15 @@ exports[`components > viewers > stop viewer should render countdown times after
827827
>
828828
<div
829829
className="route-row"
830+
role="table"
830831
>
831832
<div
832833
className="header"
834+
role="row"
833835
>
834836
<div
835837
className="route-name"
838+
role="columnheader"
836839
>
837840
<b>
838841
20
@@ -842,6 +845,7 @@ exports[`components > viewers > stop viewer should render countdown times after
842845
</div>
843846
<div
844847
className="next-trip-preview"
848+
role="columnheader"
845849
>
846850
<StopTimeCell
847851
homeTimezone="America/Los_Angeles"
@@ -928,6 +932,9 @@ exports[`components > viewers > stop viewer should render countdown times after
928932
className="expansion-button-container"
929933
>
930934
<button
935+
aria-controls="route-20"
936+
aria-expanded={false}
937+
aria-label="Expand all departures for Route 20"
931938
className="expansion-button"
932939
onClick={[Function]}
933940
>
@@ -1585,12 +1592,15 @@ exports[`components > viewers > stop viewer should render countdown times for st
15851592
>
15861593
<div
15871594
className="route-row"
1595+
role="table"
15881596
>
15891597
<div
15901598
className="header"
1599+
role="row"
15911600
>
15921601
<div
15931602
className="route-name"
1603+
role="columnheader"
15941604
>
15951605
<b>
15961606
20
@@ -1600,6 +1610,7 @@ exports[`components > viewers > stop viewer should render countdown times for st
16001610
</div>
16011611
<div
16021612
className="next-trip-preview"
1613+
role="columnheader"
16031614
>
16041615
<StopTimeCell
16051616
homeTimezone="America/Los_Angeles"
@@ -1686,6 +1697,9 @@ exports[`components > viewers > stop viewer should render countdown times for st
16861697
className="expansion-button-container"
16871698
>
16881699
<button
1700+
aria-controls="route-20"
1701+
aria-expanded={false}
1702+
aria-label="Expand all departures for Route 20"
16891703
className="expansion-button"
16901704
onClick={[Function]}
16911705
>
@@ -2631,12 +2645,15 @@ exports[`components > viewers > stop viewer should render times after midnight w
26312645
>
26322646
<div
26332647
className="route-row"
2648+
role="table"
26342649
>
26352650
<div
26362651
className="header"
2652+
role="row"
26372653
>
26382654
<div
26392655
className="route-name"
2656+
role="columnheader"
26402657
>
26412658
<b>
26422659
20
@@ -2646,6 +2663,7 @@ exports[`components > viewers > stop viewer should render times after midnight w
26462663
</div>
26472664
<div
26482665
className="next-trip-preview"
2666+
role="columnheader"
26492667
>
26502668
<StopTimeCell
26512669
homeTimezone="America/Los_Angeles"
@@ -2741,6 +2759,9 @@ exports[`components > viewers > stop viewer should render times after midnight w
27412759
className="expansion-button-container"
27422760
>
27432761
<button
2762+
aria-controls="route-20"
2763+
aria-expanded={false}
2764+
aria-label="Expand all departures for Route 20"
27442765
className="expansion-button"
27452766
onClick={[Function]}
27462767
>
@@ -4200,12 +4221,15 @@ exports[`components > viewers > stop viewer should render with OTP transit index
42004221
>
42014222
<div
42024223
className="route-row"
4224+
role="table"
42034225
>
42044226
<div
42054227
className="header"
4228+
role="row"
42064229
>
42074230
<div
42084231
className="route-name"
4232+
role="columnheader"
42094233
>
42104234
<b>
42114235
20
@@ -4215,6 +4239,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index
42154239
</div>
42164240
<div
42174241
className="next-trip-preview"
4242+
role="columnheader"
42184243
>
42194244
<StopTimeCell
42204245
homeTimezone="America/Los_Angeles"
@@ -4310,6 +4335,9 @@ exports[`components > viewers > stop viewer should render with OTP transit index
43104335
className="expansion-button-container"
43114336
>
43124337
<button
4338+
aria-controls="route-20"
4339+
aria-expanded={false}
4340+
aria-label="Expand all departures for Route 20"
43134341
className="expansion-button"
43144342
onClick={[Function]}
43154343
>
@@ -4452,12 +4480,15 @@ exports[`components > viewers > stop viewer should render with OTP transit index
44524480
>
44534481
<div
44544482
className="route-row"
4483+
role="table"
44554484
>
44564485
<div
44574486
className="header"
4487+
role="row"
44584488
>
44594489
<div
44604490
className="route-name"
4491+
role="columnheader"
44614492
>
44624493
<b>
44634494
36
@@ -4467,6 +4498,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index
44674498
</div>
44684499
<div
44694500
className="next-trip-preview"
4501+
role="columnheader"
44704502
>
44714503
<StopTimeCell
44724504
homeTimezone="America/Los_Angeles"
@@ -4562,6 +4594,9 @@ exports[`components > viewers > stop viewer should render with OTP transit index
45624594
className="expansion-button-container"
45634595
>
45644596
<button
4597+
aria-controls="route-36"
4598+
aria-expanded={false}
4599+
aria-label="Expand all departures for Route 36"
45654600
className="expansion-button"
45664601
onClick={[Function]}
45674602
>
@@ -4704,12 +4739,15 @@ exports[`components > viewers > stop viewer should render with OTP transit index
47044739
>
47054740
<div
47064741
className="route-row"
4742+
role="table"
47074743
>
47084744
<div
47094745
className="header"
4746+
role="row"
47104747
>
47114748
<div
47124749
className="route-name"
4750+
role="columnheader"
47134751
>
47144752
<b>
47154753
94
@@ -4719,6 +4757,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index
47194757
</div>
47204758
<div
47214759
className="next-trip-preview"
4760+
role="columnheader"
47224761
>
47234762
<StopTimeCell
47244763
homeTimezone="America/Los_Angeles"
@@ -4814,6 +4853,9 @@ exports[`components > viewers > stop viewer should render with OTP transit index
48144853
className="expansion-button-container"
48154854
>
48164855
<button
4856+
aria-controls="route-94"
4857+
aria-expanded={false}
4858+
aria-label="Expand all departures for Route 94"
48174859
className="expansion-button"
48184860
onClick={[Function]}
48194861
>
@@ -5010,12 +5052,15 @@ exports[`components > viewers > stop viewer should render with OTP transit index
50105052
>
50115053
<div
50125054
className="route-row"
5055+
role="table"
50135056
>
50145057
<div
50155058
className="header"
5059+
role="row"
50165060
>
50175061
<div
50185062
className="route-name"
5063+
role="columnheader"
50195064
>
50205065
<b>
50215066
94
@@ -5025,6 +5070,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index
50255070
</div>
50265071
<div
50275072
className="next-trip-preview"
5073+
role="columnheader"
50285074
>
50295075
<StopTimeCell
50305076
homeTimezone="America/Los_Angeles"
@@ -5120,6 +5166,9 @@ exports[`components > viewers > stop viewer should render with OTP transit index
51205166
className="expansion-button-container"
51215167
>
51225168
<button
5169+
aria-controls="route-94"
5170+
aria-expanded={false}
5171+
aria-label="Expand all departures for Route 94"
51235172
className="expansion-button"
51245173
onClick={[Function]}
51255174
>
@@ -6571,12 +6620,15 @@ exports[`components > viewers > stop viewer should render with TriMet transit in
65716620
>
65726621
<div
65736622
className="route-row"
6623+
role="table"
65746624
>
65756625
<div
65766626
className="header"
6627+
role="row"
65776628
>
65786629
<div
65796630
className="route-name"
6631+
role="columnheader"
65806632
>
65816633
<b>
65826634
20
@@ -6586,6 +6638,7 @@ exports[`components > viewers > stop viewer should render with TriMet transit in
65866638
</div>
65876639
<div
65886640
className="next-trip-preview"
6641+
role="columnheader"
65896642
>
65906643
<StopTimeCell
65916644
homeTimezone="America/Los_Angeles"
@@ -6681,6 +6734,9 @@ exports[`components > viewers > stop viewer should render with TriMet transit in
66816734
className="expansion-button-container"
66826735
>
66836736
<button
6737+
aria-controls="route-20"
6738+
aria-expanded={false}
6739+
aria-label="Expand all departures for Route 20"
66846740
className="expansion-button"
66856741
onClick={[Function]}
66866742
>

a11y/a11y.test.js

+62-19
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,39 @@ import path from 'path'
44
import puppeteer from 'puppeteer'
55
import execa from 'execa'
66

7+
import { routes } from '../lib/components/app/responsive-webapp'
8+
79
import { mockServer } from './mock-server'
810

911
const OTP_RR_CONFIG_FILE_PATH = './config.yml'
1012
const OTP_RR_CONFIG_BACKUP_PATH = './config.non-test.yml'
1113
const OTP_RR_TEST_CONFIG_PATH = './a11y/test-config.yml'
1214

13-
let server
15+
let browser, server
16+
// These rules aren't relevant to this project
17+
const disabledRules = [
18+
'region', // Leaflet does not comply
19+
'meta-viewport', // Leaflet does not comply
20+
'page-has-heading-one' // Heading is provided by logo
21+
]
22+
23+
/**
24+
* Runs a11y tests on a given OTP-RR path using the test build. Relies on
25+
* the puppeteer browser running
26+
*/
27+
async function runAxeTestOnPath (otpPath) {
28+
const page = await browser.newPage()
29+
const filePath = `file://${path.resolve(__dirname, '../index-for-puppeteer.html')}#${otpPath}`
30+
await Promise.all([
31+
page.goto(filePath),
32+
page.waitForNavigation({ waitUntil: 'networkidle2' })
33+
])
1434

15-
beforeEach(() => {
35+
await expect(page).toPassAxeTests({ disabledRules })
36+
return page
37+
}
38+
39+
beforeAll(async () => {
1640
// backup current config file
1741
if (fs.existsSync(OTP_RR_CONFIG_FILE_PATH)) {
1842
fs.renameSync(
@@ -37,9 +61,11 @@ beforeEach(() => {
3761
server = mockServer.listen(MOCK_SERVER_PORT, () => {
3862
console.log(`Mock response server running on http://localhost:${MOCK_SERVER_PORT}`)
3963
})
64+
// Web security is disabled to allow requests to the mock OTP server
65+
browser = await puppeteer.launch({args: ['--disable-web-security']})
4066
})
4167

42-
afterEach(async () => {
68+
afterAll(async () => {
4369
fs.unlinkSync(OTP_RR_CONFIG_FILE_PATH)
4470
if (fs.existsSync(OTP_RR_CONFIG_BACKUP_PATH)) {
4571
fs.renameSync(
@@ -49,23 +75,40 @@ afterEach(async () => {
4975
}
5076
console.log('Restored original OTP-RR config file')
5177
await server.close()
52-
console.log('Closed mock server')
78+
await browser.close()
79+
console.log('Closed mock server and headless browser')
5380
})
5481

55-
test('checks the test page with Axe', async () => {
56-
jest.setTimeout(600000)
57-
// Web security is disabled to allow requests to the mock OTP server
58-
const browser = await puppeteer.launch({args: ['--disable-web-security']})
59-
const page = await browser.newPage()
60-
await page.goto(`file://${path.resolve(__dirname, '../index-for-puppeteer.html')}#/?ui_activeSearch=0qoydlnut&ui_activeItinerary=0&fromPlace=1900%20Main%20Street%2C%20Houston%2C%20TX%2C%20USA%3A%3A29.750144%2C-95.370998&toPlace=800%20Congress%2C%20Houston%2C%20TX%2C%20USA%3A%3A29.76263%2C-95.362178&date=2021-08-04&time=08%3A14&arriveBy=false&mode=WALK%2CBUS%2CTRAM&showIntermediateStops=true&maxWalkDistance=1207&optimize=QUICK&walkSpeed=1.34&ignoreRealtimeUpdates=true&numItineraries=3&otherThanPreferredRoutesPenalty=900`)
82+
// Puppeteer can take a long time to load, espeically in some ci environments
83+
jest.setTimeout(600000)
84+
routes.forEach(route => {
85+
const {a11yIgnore, path: pathsToTest} = route
86+
if (a11yIgnore) {
87+
return
88+
}
6189

62-
// These rules aren't relevant to this project
63-
await expect(page).toPassAxeTests({
64-
disabledRules: [
65-
'region', // Leaflet does not comply
66-
'meta-viewport', // Leaflet does not comply
67-
'page-has-heading-one' // Heading is provided by logo
68-
]
69-
})
70-
await browser.close()
90+
if (Array.isArray(pathsToTest)) {
91+
// Run test on each path in list.
92+
pathsToTest.forEach(async (p) => {
93+
test(`${p} should pass Axe Tests`, async () => runAxeTestOnPath(p))
94+
})
95+
} else {
96+
// Otherwise run test on individual path
97+
test(`${pathsToTest} should pass Axe Tests`, async () => runAxeTestOnPath(pathsToTest))
98+
}
99+
})
100+
101+
test('Mocked Main Trip planner page should pass Axe Tests', async () => {
102+
await runAxeTestOnPath('/?ui_activeSearch=0qoydlnut&ui_activeItinerary=0&fromPlace=1900%20Main%20Street%2C%20Houston%2C%20TX%2C%20USA%3A%3A29.750144%2C-95.370998&toPlace=800%20Congress%2C%20Houston%2C%20TX%2C%20USA%3A%3A29.76263%2C-95.362178&date=2021-08-04&time=08%3A14&arriveBy=false&mode=WALK%2CBUS%2CTRAM&showIntermediateStops=true&maxWalkDistance=1207&optimize=QUICK&walkSpeed=1.34&ignoreRealtimeUpdates=true&numItineraries=3&otherThanPreferredRoutesPenalty=900')
103+
})
104+
105+
test('Mocked Stop Viewer and Dropdown should pass Axe tests', async () => {
106+
// Puppeteer can take a long time to load, espeically in some ci environments
107+
jest.setTimeout(600000)
108+
// Test stop viewer
109+
const stopViewerPage = await runAxeTestOnPath('/stop/Agency')
110+
await stopViewerPage.waitForTimeout(2000)
111+
await stopViewerPage.click('.expansion-button')
112+
await stopViewerPage.waitForTimeout(2000)
113+
await expect(stopViewerPage).toPassAxeTests({ disabledRules })
71114
})

0 commit comments

Comments
 (0)