@@ -603,6 +603,92 @@ describe('Test Run when signed in as tester', () => {
603
603
} ) ;
604
604
} ) ;
605
605
606
+ it ( 'enforces read-only and shows on-hold modal when report is On hold' , async ( ) => {
607
+ // Ensure the report is On hold as admin first, then switch to tester in same page
608
+ await getPage ( { role : 'admin' , url : '/test-queue' } , async page => {
609
+ const sectionButtonSelector = 'button#disclosure-btn-modal-dialog-0' ;
610
+ const tableSelector =
611
+ 'table[aria-label="Reports for Modal Dialog Example V24.06.07 in draft phase"]' ;
612
+
613
+ await page . waitForSelector ( sectionButtonSelector ) ;
614
+ await page . click ( sectionButtonSelector ) ;
615
+ await page . waitForSelector ( tableSelector ) ;
616
+
617
+ // Toggle to On hold if not already
618
+ const toggleWasClicked = await page . $eval ( tableSelector , el => {
619
+ const firstRow = el . querySelector ( 'tbody tr' ) ;
620
+ const actionsCell = firstRow . querySelectorAll ( 'td' ) [ 4 ] ;
621
+ const btn = Array . from ( actionsCell . querySelectorAll ( 'button' ) ) . find ( b =>
622
+ / P u t o n h o l d | R e a d y f o r t e s t i n g / i. test ( b . innerText )
623
+ ) ;
624
+ if ( ! btn ) return false ;
625
+ const isOnHold = / R e a d y f o r t e s t i n g / i. test ( btn . innerText ) ;
626
+ if ( ! isOnHold ) {
627
+ btn . click ( ) ;
628
+ return true ;
629
+ }
630
+ return false ;
631
+ } ) ;
632
+ if ( toggleWasClicked ) await page . waitForNetworkIdle ( ) ;
633
+
634
+ // Verify status shows On hold
635
+ const statusText = await page . $eval ( tableSelector , el => {
636
+ const firstRow = el . querySelector ( 'tbody tr' ) ;
637
+ const statusCell = firstRow . querySelectorAll ( 'td' ) [ 3 ] ;
638
+ return statusCell . innerText ;
639
+ } ) ;
640
+ expect ( statusText . includes ( 'On hold' ) ) . toBe ( true ) ;
641
+
642
+ // Sign in as tester within same session/transaction
643
+ await page . evaluate ( 'signMeInAsTester("joe-the-tester")' ) ;
644
+ await page . waitForSelector ( '::-p-text(Signed in)' ) ;
645
+
646
+ // Expand and assign self
647
+ await page . waitForSelector ( sectionButtonSelector ) ;
648
+ await page . click ( sectionButtonSelector ) ;
649
+ await page . waitForSelector ( tableSelector ) ;
650
+ await page . $eval ( tableSelector , el => {
651
+ // First button is Assign Yourself
652
+ el . querySelector ( 'button' ) . click ( ) ;
653
+ } ) ;
654
+ await page . waitForNetworkIdle ( ) ;
655
+ await page . waitForSelector ( '::-p-text(Unassign Yourself)' ) ;
656
+
657
+ // Start testing
658
+ await page . waitForSelector ( 'a[role="button"] ::-p-text(Start Testing)' ) ;
659
+ await page . click ( 'a[role="button"] ::-p-text(Start Testing)' ) ;
660
+ await page . waitForNavigation ( {
661
+ waitUntil : [ 'domcontentloaded' , 'networkidle0' ]
662
+ } ) ;
663
+
664
+ // Wait for Test Run to render
665
+ await page . waitForSelector ( 'h1 ::-p-text(Test 1:)' ) ;
666
+
667
+ // On hold modal should be visible
668
+ await page . waitForSelector ( '::-p-text(On hold)' ) ;
669
+
670
+ // Submit button should be disabled
671
+ await page . waitForSelector ( 'button ::-p-text(Submit Results)' ) ;
672
+ const submitDisabled = await page . $eval (
673
+ 'button[class="btn btn-primary"] ::-p-text(Submit Results)' ,
674
+ el => el . closest ( 'button' ) . disabled
675
+ ) ;
676
+ expect ( submitDisabled ) . toBe ( true ) ;
677
+
678
+ // Start Over should be disabled
679
+ const startOverDisabled = await page . $eval (
680
+ 'button ::-p-text(Start Over)' ,
681
+ el => el . closest ( 'button' ) . disabled
682
+ ) ;
683
+ expect ( startOverDisabled ) . toBe ( true ) ;
684
+
685
+ // Close label should be present (not Save and Close)
686
+ await page . waitForSelector ( 'button ::-p-text(Close)' ) ;
687
+ const hasSaveAndClose = await page . $ ( 'button ::-p-text(Save and Close)' ) ;
688
+ expect ( hasSaveAndClose ) . toBeNull ( ) ;
689
+ } ) ;
690
+ } ) ;
691
+
606
692
it ( 'focuses first assertion radio button when only top output is filled' , async ( ) => {
607
693
await getPage ( { role : 'tester' , url : '/test-queue' } , async page => {
608
694
await assignSelfAndNavigateToRun ( page ) ;
0 commit comments