@@ -512,4 +512,89 @@ test.describe('Change Request Flow', () => {
512512 changeCard . getByText ( 'Reordered' , { exact : true } ) ,
513513 ) . toBeVisible ( ) ;
514514 } ) ;
515+
516+ test ( 'should navigate to published page after merging from space editor' , async ( {
517+ page,
518+ request,
519+ } ) => {
520+ await page . goto ( '/wiki/spaces' ) ;
521+ await page . waitForLoadState ( 'networkidle' ) ;
522+
523+ const timestamp = Date . now ( ) ;
524+ const spaceName = `CR Merge Nav Space ${ timestamp } ` ;
525+ const spaceRoute = `cr-merge-nav-${ timestamp } ` ;
526+ const pageTitle = `merge-nav-page-${ timestamp } ` ;
527+ const pageContent = `Merge nav content ${ timestamp } ` ;
528+
529+ // Create a new space
530+ await page . getByRole ( 'button' , { name : 'New Space' } ) . click ( ) ;
531+ await page . waitForSelector ( '[role="dialog"]' , { state : 'visible' } ) ;
532+ await page . getByLabel ( 'Space Name' ) . fill ( spaceName ) ;
533+ await page . getByLabel ( 'Route' ) . fill ( spaceRoute ) ;
534+ await page
535+ . getByRole ( 'dialog' )
536+ . getByRole ( 'button' , { name : 'Create' } )
537+ . click ( ) ;
538+ await page . waitForLoadState ( 'networkidle' ) ;
539+ await expect ( page ) . toHaveURL ( / \/ w i k i \/ s p a c e s \/ / ) ;
540+
541+ // Create a new page draft
542+ const createFirstPage = page . getByRole ( 'button' , {
543+ name : 'Create First Page' ,
544+ } ) ;
545+ const newPageButton = page . getByRole ( 'button' , { name : 'New Page' } ) ;
546+
547+ if ( await createFirstPage . isVisible ( { timeout : 2000 } ) . catch ( ( ) => false ) ) {
548+ await createFirstPage . click ( ) ;
549+ } else {
550+ await newPageButton . click ( ) ;
551+ }
552+
553+ await page . getByLabel ( 'Title' ) . fill ( pageTitle ) ;
554+ await page
555+ . getByRole ( 'dialog' )
556+ . getByRole ( 'button' , { name : 'Save Draft' } )
557+ . click ( ) ;
558+ await page . waitForTimeout ( 500 ) ;
559+
560+ // Open the draft page from sidebar
561+ await page . locator ( 'aside' ) . getByText ( pageTitle , { exact : true } ) . click ( ) ;
562+ await page . waitForURL ( / \/ d r a f t \/ [ ^ / ? # ] + / ) ;
563+
564+ // Add content
565+ const editor = page
566+ . locator ( '.ProseMirror, [contenteditable="true"]' )
567+ . first ( ) ;
568+ await expect ( editor ) . toBeVisible ( { timeout : 10000 } ) ;
569+ await page . waitForFunction ( ( ) => window . wikiEditor !== undefined , {
570+ timeout : 10000 ,
571+ } ) ;
572+ await page . evaluate ( ( content ) => {
573+ window . wikiEditor . commands . setContent ( content , {
574+ contentType : 'markdown' ,
575+ } ) ;
576+ } , pageContent ) ;
577+ await editor . click ( ) ;
578+ await page . getByRole ( 'button' , { name : 'Save Draft' } ) . click ( ) ;
579+ await page . waitForTimeout ( 500 ) ;
580+
581+ // Merge directly from within the space editor (manager can merge Draft CRs)
582+ const mergeButton = page . getByRole ( 'button' , { name : 'Merge' } ) ;
583+ await expect ( mergeButton ) . toBeVisible ( { timeout : 10000 } ) ;
584+ await mergeButton . click ( ) ;
585+ await expect (
586+ page . locator ( 'text=Change request merged' ) . first ( ) ,
587+ ) . toBeVisible ( { timeout : 15000 } ) ;
588+
589+ // The fix: after merge, URL should navigate to the published page route
590+ // and NOT remain on the /draft/ route
591+ await page . waitForURL ( / \/ p a g e \/ / , { timeout : 10000 } ) ;
592+ expect ( page . url ( ) ) . toMatch ( / \/ s p a c e s \/ [ ^ / ] + \/ p a g e \/ / ) ;
593+ expect ( page . url ( ) ) . not . toMatch ( / \/ d r a f t \/ / ) ;
594+
595+ // The published page content should be visible without needing a hard refresh
596+ await expect ( page . getByText ( pageContent ) ) . toBeVisible ( {
597+ timeout : 10000 ,
598+ } ) ;
599+ } ) ;
515600} ) ;
0 commit comments