@@ -38,6 +38,16 @@ async function getCodeMirrorValue(editor: Locator) {
3838 } ) ;
3939}
4040
41+ async function openDropdownMenu ( page : Page , trigger : Locator ) {
42+ await expect ( trigger ) . toBeVisible ( ) ;
43+ await trigger . click ( ) ;
44+
45+ const menu = page . locator ( '[data-slot="dropdown-menu-content"]:visible' ) . last ( ) ;
46+ await expect ( menu ) . toBeVisible ( ) ;
47+
48+ return menu ;
49+ }
50+
4151function getPathname ( url : string ) : string {
4252 return url . replace ( / ^ [ a - z ] + : \/ \/ [ ^ / ] + / i, '' ) . split ( / [ ? # ] / ) [ 0 ] || '/' ;
4353}
@@ -116,8 +126,8 @@ async function destroyProjectByNameViaUI(page: Page, projectName: string) {
116126 return ;
117127 }
118128
119- await row . getByRole ( 'button' , { name : 'Open menu' } ) . click ( ) ;
120- await page . getByRole ( 'menuitem' , { name : 'Destroy' , exact : true } ) . click ( ) ;
129+ const menu = await openDropdownMenu ( page , row . getByRole ( 'button' , { name : 'Open menu' } ) ) ;
130+ await menu . getByRole ( 'menuitem' , { name : 'Destroy' , exact : true } ) . click ( ) ;
121131
122132 const dialog = page . getByRole ( 'dialog' ) ;
123133 await expect ( dialog ) . toBeVisible ( ) ;
@@ -180,23 +190,21 @@ test.describe('Projects Page', () => {
180190
181191 await page . waitForLoadState ( 'networkidle' ) ;
182192 const firstRow = page . locator ( 'tbody tr' ) . first ( ) ;
183- const menuButton = firstRow . getByRole ( 'button' , { name : 'Open menu' } ) ;
184- await expect ( menuButton ) . toBeVisible ( ) ;
185- await menuButton . click ( ) ;
193+ const menu = await openDropdownMenu ( page , firstRow . getByRole ( 'button' , { name : 'Open menu' } ) ) ;
186194
187- await expect ( page . getByRole ( 'menuitem' , { name : 'Edit' } ) ) . toBeVisible ( ) ;
195+ await expect ( menu . getByRole ( 'menuitem' , { name : 'Edit' } ) ) . toBeVisible ( ) ;
188196 // Check for at least one of the state action buttons (Up/Down/Restart)
189- const upItem = page . getByRole ( 'menuitem' , { name : 'Up' , exact : true } ) ;
190- const downItem = page . getByRole ( 'menuitem' , { name : 'Down' , exact : true } ) ;
191- const restartItem = page . getByRole ( 'menuitem' , {
197+ const upItem = menu . getByRole ( 'menuitem' , { name : 'Up' , exact : true } ) ;
198+ const downItem = menu . getByRole ( 'menuitem' , { name : 'Down' , exact : true } ) ;
199+ const restartItem = menu . getByRole ( 'menuitem' , {
192200 name : 'Restart' ,
193201 exact : true
194202 } ) ;
195203 const hasStateAction =
196204 ( await upItem . count ( ) ) > 0 || ( await downItem . count ( ) ) > 0 || ( await restartItem . count ( ) ) > 0 ;
197205 expect ( hasStateAction ) . toBe ( true ) ;
198- await expect ( page . getByRole ( 'menuitem' , { name : 'Pull & Redeploy' } ) ) . toBeVisible ( ) ;
199- await expect ( page . getByRole ( 'menuitem' , { name : 'Destroy' } ) ) . toBeVisible ( ) ;
206+ await expect ( menu . getByRole ( 'menuitem' , { name : 'Pull & Redeploy' } ) ) . toBeVisible ( ) ;
207+ await expect ( menu . getByRole ( 'menuitem' , { name : 'Destroy' } ) ) . toBeVisible ( ) ;
200208 } ) ;
201209
202210 test ( 'should navigate to project details when project name is clicked' , async ( { page } ) => {
@@ -580,14 +588,22 @@ test.describe('New Compose Project Page', () => {
580588
581589 const searchInput = page . getByPlaceholder ( 'Search…' ) ;
582590 await expect ( searchInput ) . toBeVisible ( ) ;
591+ const filteredProjectsResponse = page . waitForResponse ( ( response ) => {
592+ if ( response . request ( ) . method ( ) !== 'GET' ) return false ;
593+ return (
594+ / \/ a p i \/ e n v i r o n m e n t s \/ [ ^ / ] + \/ p r o j e c t s (?: \? | $ ) / . test ( response . url ( ) ) &&
595+ response . url ( ) . includes ( `search=${ projectName } ` )
596+ ) ;
597+ } ) ;
583598 await searchInput . fill ( projectName ) ;
599+ await filteredProjectsResponse ;
584600
585601 const row = page . locator ( 'tbody tr' ) . filter ( { hasText : projectName } ) . first ( ) ;
586602 await expect ( row ) . toBeVisible ( ) ;
587- await row . getByRole ( 'button' , { name : 'Open menu' } ) . click ( ) ;
588- const redeployMenuItem = page . getByRole ( 'menuitem' , { name : 'Pull & Redeploy' } ) . first ( ) ;
603+ const menu = await openDropdownMenu ( page , row . getByRole ( 'button' , { name : 'Open menu' } ) ) ;
604+ const redeployMenuItem = menu . getByRole ( 'menuitem' , { name : 'Pull & Redeploy' } ) ;
589605 await expect ( redeployMenuItem ) . toBeVisible ( ) ;
590- await redeployMenuItem . click ( { force : true } ) ;
606+ await redeployMenuItem . click ( ) ;
591607
592608 await expect
593609 . poll ( ( ) => redeployRequestStartedAt , {
0 commit comments