@@ -2,27 +2,47 @@ import { expect, Locator, Page } from "@playwright/test";
2
2
import { TabDescription } from "./testInterfaces" ;
3
3
4
4
/* eslint-disable sonarjs/no-duplicate-string -- ignoring duplicate strings here */
5
- // Run the "Expect each tab to appear as selected when the corresponding url is accessed" test
5
+
6
+ export const getNthElementTextLocator = (
7
+ page : Page ,
8
+ row_position : number ,
9
+ column_position : number
10
+ ) : Locator => {
11
+ return page
12
+ . getByRole ( "rowgroup" )
13
+ . nth ( 1 )
14
+ . getByRole ( "row" )
15
+ . nth ( row_position )
16
+ . getByRole ( "cell" )
17
+ . nth ( column_position ) ;
18
+ } ;
6
19
7
20
export const getFirstElementTextLocator = (
8
21
page : Page ,
9
- workColumnPosition : number
22
+ column_position : number
23
+ ) : Locator => getNthElementTextLocator ( page , 0 , column_position ) ;
24
+
25
+ export const getLastElementTextLocator = (
26
+ page : Page ,
27
+ column_position : number
10
28
) : Locator => {
11
29
return page
12
30
. getByRole ( "rowgroup" )
13
31
. nth ( 1 )
14
32
. getByRole ( "row" )
15
- . nth ( 0 )
33
+ . last ( )
16
34
. getByRole ( "cell" )
17
- . nth ( workColumnPosition ) ;
35
+ . nth ( column_position ) ;
18
36
} ;
19
37
20
38
export async function testUrl (
21
39
page : Page ,
22
40
tab : TabDescription ,
23
41
otherTabs : TabDescription [ ]
24
42
) : Promise < void > {
43
+ // Go to the selected tab
25
44
await page . goto ( tab . url ) ;
45
+ // Check that the selected tab appears selected and the other tabs appear deselected
26
46
await expect (
27
47
page . getByRole ( "tab" ) . getByText ( tab . tabName , { exact : true } )
28
48
) . toHaveAttribute ( "aria-selected" , "true" , { timeout : 25000 } ) ;
@@ -35,30 +55,30 @@ export async function testUrl(
35
55
}
36
56
}
37
57
38
- // Run the "Expect each tab to become selected, to go to the correct url, and to show all of its columns when selected" test
39
- export async function testTab ( page : Page , tab : TabDescription ) : Promise < void > {
40
- await expect (
41
- page
42
- . getByRole ( "rowgroup" )
43
- . nth ( 1 )
44
- . getByRole ( "row" )
45
- . nth ( 1 )
46
- . getByRole ( "cell" )
47
- . nth ( 1 )
48
- ) . toBeVisible ( ) ;
49
- await page . getByRole ( "tab" ) . getByText ( tab . tabName , { exact : true } ) . click ( ) ;
50
- await expect ( page ) . toHaveURL ( tab . url , { timeout : 25000 } ) ; // Long timeout because some tabs take a long time to load
51
- await expect ( page . getByRole ( "tab" ) . getByText ( tab . tabName ) ) . toHaveAttribute (
58
+ export async function testTab (
59
+ page : Page ,
60
+ startTab : TabDescription ,
61
+ endTab : TabDescription
62
+ ) : Promise < void > {
63
+ // Run the "Expect each tab to become selected, to go to the correct url, and to show all of its columns when selected" test
64
+ await page . goto ( startTab . url ) ;
65
+ await expect ( getFirstElementTextLocator ( page , 1 ) ) . toBeVisible ( ) ;
66
+ await page
67
+ . getByRole ( "tab" )
68
+ . getByText ( endTab . tabName , { exact : true } )
69
+ . click ( ) ;
70
+ await expect ( page ) . toHaveURL ( endTab . url , { timeout : 25000 } ) ; // Long timeout because some tabs take a long time to load
71
+ await expect ( page . getByRole ( "tab" ) . getByText ( endTab . tabName ) ) . toHaveAttribute (
52
72
"aria-selected" ,
53
73
"true"
54
74
) ;
55
- if ( tab . emptyFirstColumn ) {
75
+ if ( endTab . emptyFirstColumn ) {
56
76
await expect ( page . getByRole ( "columnheader" ) ) . toHaveText (
57
- [ " " ] . concat ( tab . preselectedColumns . map ( ( x ) => x . name ) )
77
+ [ " " ] . concat ( endTab . preselectedColumns . map ( ( x ) => x . name ) )
58
78
) ;
59
79
} else {
60
80
await expect ( page . getByRole ( "columnheader" ) ) . toHaveText (
61
- tab . preselectedColumns . map ( ( x ) => x . name )
81
+ endTab . preselectedColumns . map ( ( x ) => x . name )
62
82
) ;
63
83
}
64
84
}
@@ -85,21 +105,17 @@ export async function testSortAzul(
85
105
page ,
86
106
workColumnPosition
87
107
) ;
88
- const lastElementTextLocator = page
89
- . getByRole ( "rowgroup" )
90
- . nth ( 1 )
91
- . getByRole ( "row" )
92
- . last ( )
93
- . getByRole ( "cell" )
94
- . nth ( workColumnPosition ) ;
95
- // Locator for the sort buttonf
108
+ const lastElementTextLocator = getLastElementTextLocator (
109
+ page ,
110
+ workColumnPosition
111
+ ) ;
112
+ // Locator for the sort button
96
113
const columnSortLocator = page
97
114
. getByRole ( "columnheader" , {
98
115
exact : true ,
99
116
name : tab . preselectedColumns [ columnPosition ] . name ,
100
117
} )
101
118
. getByRole ( "button" ) ;
102
-
103
119
// Expect the first and last cells to be visible and have text
104
120
await expect ( firstElementTextLocator ) . toBeVisible ( ) ;
105
121
await expect ( lastElementTextLocator ) . toBeVisible ( ) ;
@@ -125,7 +141,6 @@ export async function testSortCatalog(
125
141
) : Promise < void > {
126
142
// Get the current tab, and go to it's URL
127
143
await page . goto ( tab . url ) ;
128
- // For each column
129
144
for (
130
145
let columnPosition = 0 ;
131
146
columnPosition < tab . preselectedColumns . length ;
@@ -148,9 +163,7 @@ export async function testSortCatalog(
148
163
name : tab . preselectedColumns [ columnPosition ] . name ,
149
164
} )
150
165
. getByRole ( "button" ) ;
151
-
152
166
await expect ( firstElementTextLocator ) . toBeVisible ( ) ;
153
-
154
167
// Click to sort
155
168
await columnSortLocator . click ( ) ;
156
169
// Expect the first and cells to still be visible
@@ -168,10 +181,14 @@ export async function testSelectableColumns(
168
181
page : Page ,
169
182
tab : TabDescription
170
183
) : Promise < void > {
184
+ // Navigate to the tab
171
185
await page . goto ( tab . url ) ;
186
+ // Select the "Edit Columns" menu
172
187
await page . getByRole ( "button" ) . getByText ( "Edit Columns" ) . click ( ) ;
173
188
await expect ( page . getByRole ( "menu" ) ) . toBeVisible ( ) ;
189
+ // Enable each selectable tab
174
190
for ( const column of tab . selectableColumns ) {
191
+ // Locate the checkbox for each column
175
192
const checkboxLocator = page
176
193
. getByRole ( "menu" )
177
194
. locator ( "*" )
@@ -181,13 +198,16 @@ export async function testSelectableColumns(
181
198
. filter ( { has : page . getByText ( column . name , { exact : true } ) } ) ,
182
199
} )
183
200
. getByRole ( "checkbox" ) ;
201
+ // Expect each column to be enabled and unchecked for selectable tabs
184
202
await expect ( checkboxLocator ) . toBeEnabled ( ) ;
185
203
await expect ( checkboxLocator ) . not . toBeChecked ( ) ;
204
+ // Expect clicking the checkbox to function
186
205
await checkboxLocator . click ( ) ;
187
206
await expect ( checkboxLocator ) . toBeChecked ( ) ;
188
207
}
189
208
await page . getByRole ( "document" ) . click ( ) ;
190
209
await expect ( page . getByRole ( "menu" ) ) . not . toBeVisible ( ) ;
210
+ // Expect all selectable tabs to be enabled
191
211
await expect ( page . getByRole ( "columnheader" ) ) . toContainText (
192
212
tab . selectableColumns . map ( ( x ) => x . name )
193
213
) ;
@@ -246,6 +266,7 @@ export const getNamedFilterButton = (
246
266
. getByRole ( "button" )
247
267
. filter ( { has : page . getByRole ( "checkbox" ) , hasText : filterName } ) ;
248
268
} ;
269
+
249
270
export const getFirstFilterButton = ( page : Page ) : Locator => {
250
271
return page
251
272
. getByRole ( "button" )
@@ -341,7 +362,7 @@ export async function testFilterBubbles(
341
362
tab : TabDescription ,
342
363
filters : string [ ]
343
364
) : Promise < void > {
344
- page . goto ( tab . url ) ;
365
+ await page . goto ( tab . url ) ;
345
366
for ( const filter of filters ) {
346
367
// Select a filter
347
368
await page . getByText ( filterRegex ( filter ) ) . dispatchEvent ( "click" ) ;
@@ -380,6 +401,7 @@ export async function testClearAll(
380
401
) : Promise < void > {
381
402
await page . goto ( tab . url ) ;
382
403
const selected_filter_list = [ ] ;
404
+ // Select each filter and get the names of the actual filter text
383
405
for ( const filter of filters ) {
384
406
await page . getByText ( filterRegex ( filter ) ) . dispatchEvent ( "click" ) ;
385
407
await getFirstFilterButton ( page ) . getByRole ( "checkbox" ) . click ( ) ;
@@ -393,12 +415,14 @@ export async function testClearAll(
393
415
) ;
394
416
await page . locator ( "body" ) . click ( ) ;
395
417
}
418
+ // Click the clear all button
396
419
await page . getByText ( "Clear All" ) . dispatchEvent ( "click" ) ;
397
420
for ( const filter of selected_filter_list ) {
398
421
await expect (
399
422
page . locator ( "#sidebar-positioner" ) . getByText ( filter )
400
423
) . toHaveCount ( 0 ) ;
401
424
}
425
+ // Ensure that the filters still show as unchecked
402
426
for ( let i = 0 ; i < filters . length ; i ++ ) {
403
427
await page . getByText ( filterRegex ( filters [ i ] ) ) . dispatchEvent ( "click" ) ;
404
428
await expect (
0 commit comments