1
1
import { BrowserContext , expect , Locator , Page } from "@playwright/test" ;
2
- import { TabDescription } from "./testInterfaces" ;
2
+ import { backpageHeader , TabDescription } from "./testInterfaces" ;
3
3
4
4
/* eslint-disable sonarjs/no-duplicate-string -- ignoring duplicate strings here */
5
5
@@ -432,6 +432,14 @@ export async function testClearAll(
432
432
}
433
433
}
434
434
435
+ const getRowLocatorByAccess = ( page : Page , access : string ) : Locator =>
436
+ page
437
+ . getByRole ( "row" )
438
+ . filter ( { has : page . getByRole ( "cell" , { name : access } ) } )
439
+ . first ( )
440
+ . getByRole ( "cell" )
441
+ . first ( ) ;
442
+
435
443
// Backpages tests
436
444
export async function testExportBackpage (
437
445
context : BrowserContext ,
@@ -442,12 +450,7 @@ export async function testExportBackpage(
442
450
await page . goto ( tab . url ) ;
443
451
await expect ( getFirstElementTextLocator ( page , 1 ) ) . toBeVisible ( ) ;
444
452
// Expect to find row with a granted status indicator
445
- const granted_row_locator = await page
446
- . getByRole ( "row" )
447
- . filter ( { has : page . getByRole ( "cell" , { name : "Granted" } ) } )
448
- . first ( )
449
- . getByRole ( "cell" )
450
- . first ( ) ;
453
+ const granted_row_locator = getRowLocatorByAccess ( page , "Granted" ) ;
451
454
await expect ( granted_row_locator ) . toBeVisible ( ) ;
452
455
// Click into the selected row
453
456
await granted_row_locator . click ( ) ;
@@ -478,7 +481,7 @@ export async function testExportBackpage(
478
481
) . toBeVisible ( ) ;
479
482
await expect (
480
483
page . getByText ( "Your Terra Workspace Link is Ready" , { exact : true } )
481
- ) . toBeVisible ( { timeout : 30000 } ) ;
484
+ ) . toBeVisible ( { timeout : 60000 } ) ;
482
485
const openTerraButton = page . getByRole ( "button" , { name : "Open Terra" } ) ;
483
486
await expect ( openTerraButton ) . toBeEnabled ( ) ;
484
487
// Click the "Open Terra" Button and await a new browser tab
@@ -487,8 +490,97 @@ export async function testExportBackpage(
487
490
const newPage = await pagePromise ;
488
491
// Expect the new browser tab to look like the Terra page
489
492
await expect (
490
- newPage . getByText ( "Welcome to Terra Community Workbench" )
493
+ newPage . getByText (
494
+ "If you are a new user or returning user, click sign in to continue."
495
+ )
491
496
) . toBeVisible ( ) ;
492
497
}
493
498
499
+ export async function testBackpageAccess (
500
+ page : Page ,
501
+ tab : TabDescription
502
+ ) : Promise < void > {
503
+ // Goto the specified tab
504
+ await page . goto ( tab . url ) ;
505
+ // Check that the first "Granted" tab has access granted
506
+ const grantedRowLocator = getRowLocatorByAccess ( page , "Granted" ) ;
507
+ await expect ( grantedRowLocator ) . toBeVisible ( ) ;
508
+ await grantedRowLocator . click ( ) ;
509
+ await expect ( page . getByText ( "Access Granted" ) ) . toBeVisible ( ) ;
510
+ await page . getByText ( "Export" , { exact : true } ) . click ( ) ;
511
+ await expect ( page ) . toHaveURL ( / \. * \/ e x p o r t - t o - t e r r a / ) ;
512
+ await expect ( page . getByRole ( "checkbox" ) . first ( ) ) . toBeVisible ( ) ;
513
+ const requestLinkButtonLocator = page . getByRole ( "button" , {
514
+ name : "Request Link" ,
515
+ } ) ;
516
+ await expect ( requestLinkButtonLocator ) . toBeEnabled ( ) ;
517
+ // Go back to the table page
518
+ await page . getByRole ( "link" , { name : "Datasets" } ) . click ( ) ;
519
+ // Check that the first "Required" tab does not have access granted
520
+ const requiredRowLocator = getRowLocatorByAccess ( page , "Required" ) ;
521
+ await expect ( requiredRowLocator ) . toBeVisible ( ) ;
522
+ await requiredRowLocator . click ( ) ;
523
+ await expect ( page . getByText ( "Access Required" ) ) . toBeVisible ( ) ;
524
+ await page . getByText ( "Export" , { exact : true } ) . click ( ) ;
525
+ await expect ( page ) . toHaveURL ( / \. * \/ e x p o r t - t o - t e r r a / ) ;
526
+ await expect (
527
+ page . getByText (
528
+ "To export this dataset, please sign in and, if necessary, request access." ,
529
+ { exact : true }
530
+ )
531
+ ) . toBeVisible ( ) ;
532
+ }
533
+
534
+ export async function testBackpageDetails (
535
+ page : Page ,
536
+ tab : TabDescription
537
+ ) : Promise < boolean > {
538
+ if ( tab ?. backpageHeaders === undefined ) {
539
+ return false ;
540
+ }
541
+ await page . goto ( tab . url ) ;
542
+ // Enable test columns
543
+ await testSelectableColumns ( page , tab ) ; //TODO: check if this funtion breaks if selectable columns don't load in order
544
+ const headers : { header : string ; value : string } [ ] = [ ] ;
545
+ const combinedColumns = tab . preselectedColumns . concat ( tab . selectableColumns ) ;
546
+ const filterString = ( x : string | undefined ) : x is string => x !== undefined ;
547
+ const headerCorrespondingColumns : string [ ] = tab . backpageHeaders
548
+ . map ( ( header ) => header ?. correspondingColumn ?. name )
549
+ . filter ( filterString )
550
+ . map ( ( x ) => x . trim ( ) ) ;
551
+ console . log ( headerCorrespondingColumns ) ;
552
+ for ( let i = 0 ; i < combinedColumns . length ; i ++ ) {
553
+ const headerColumnText = (
554
+ await page . getByRole ( "columnheader" ) . nth ( i ) . innerText ( )
555
+ ) . trim ( ) ;
556
+ if ( headerCorrespondingColumns . includes ( headerColumnText ) ) {
557
+ const headerEntryText = await getNthElementTextLocator (
558
+ page ,
559
+ 2 ,
560
+ i
561
+ ) . innerText ( ) ;
562
+ const correspondingHeaderName = tab . backpageHeaders . find (
563
+ ( header : backpageHeader ) =>
564
+ header ?. correspondingColumn ?. name === headerColumnText
565
+ ) ?. name ;
566
+ if ( correspondingHeaderName === undefined ) {
567
+ return false ;
568
+ }
569
+ headers . push ( { header : correspondingHeaderName , value : headerEntryText } ) ;
570
+ }
571
+ }
572
+ await getNthElementTextLocator ( page , 2 , 0 ) . click ( ) ;
573
+ await expect ( page . getByText ( "Dataset Details" ) ) . toBeVisible ( ) ;
574
+ for ( const headerValue of headers ) {
575
+ await expect (
576
+ page
577
+ . locator (
578
+ `:text('${ headerValue . value } '):below(:text('${ headerValue . header } '))`
579
+ )
580
+ . first ( )
581
+ ) . toBeVisible ( ) ;
582
+ }
583
+ return true ;
584
+ }
585
+
494
586
/* eslint-enable sonarjs/no-duplicate-string -- Checking duplicate strings again*/
0 commit comments