@@ -5,10 +5,10 @@ import path from "node:path"
55import { execSync } from "node:child_process"
66import { modKey , serverUrl } from "./utils"
77import {
8- sessionItemSelector ,
98 dropdownMenuTriggerSelector ,
109 dropdownMenuContentSelector ,
1110 projectMenuTriggerSelector ,
11+ projectCloseMenuSelector ,
1212 projectWorkspacesToggleSelector ,
1313 titlebarRightSelector ,
1414 popoverBodySelector ,
@@ -61,9 +61,9 @@ export async function closeDialog(page: Page, dialog: Locator) {
6161}
6262
6363export async function isSidebarClosed ( page : Page ) {
64- const main = page . locator ( "main" )
65- const classes = ( await main . getAttribute ( "class" ) ) ?? ""
66- return classes . includes ( "xl:border-l" )
64+ const button = page . getByRole ( "button" , { name : / t o g g l e s i d e b a r / i } ) . first ( )
65+ await expect ( button ) . toBeVisible ( )
66+ return ( await button . getAttribute ( "aria-expanded" ) ) !== "true"
6767}
6868
6969export async function toggleSidebar ( page : Page ) {
@@ -75,48 +75,34 @@ export async function openSidebar(page: Page) {
7575 if ( ! ( await isSidebarClosed ( page ) ) ) return
7676
7777 const button = page . getByRole ( "button" , { name : / t o g g l e s i d e b a r / i } ) . first ( )
78- const visible = await button
79- . isVisible ( )
80- . then ( ( x ) => x )
81- . catch ( ( ) => false )
82-
83- if ( visible ) await button . click ( )
84- if ( ! visible ) await toggleSidebar ( page )
78+ await button . click ( )
8579
86- const main = page . locator ( "main" )
87- const opened = await expect ( main )
88- . not . toHaveClass ( / x l : b o r d e r - l / , { timeout : 1500 } )
80+ const opened = await expect ( button )
81+ . toHaveAttribute ( "aria-expanded" , "true" , { timeout : 1500 } )
8982 . then ( ( ) => true )
9083 . catch ( ( ) => false )
9184
9285 if ( opened ) return
9386
9487 await toggleSidebar ( page )
95- await expect ( main ) . not . toHaveClass ( / x l : b o r d e r - l / )
88+ await expect ( button ) . toHaveAttribute ( "aria-expanded" , "true" )
9689}
9790
9891export async function closeSidebar ( page : Page ) {
9992 if ( await isSidebarClosed ( page ) ) return
10093
10194 const button = page . getByRole ( "button" , { name : / t o g g l e s i d e b a r / i } ) . first ( )
102- const visible = await button
103- . isVisible ( )
104- . then ( ( x ) => x )
105- . catch ( ( ) => false )
106-
107- if ( visible ) await button . click ( )
108- if ( ! visible ) await toggleSidebar ( page )
95+ await button . click ( )
10996
110- const main = page . locator ( "main" )
111- const closed = await expect ( main )
112- . toHaveClass ( / x l : b o r d e r - l / , { timeout : 1500 } )
97+ const closed = await expect ( button )
98+ . toHaveAttribute ( "aria-expanded" , "false" , { timeout : 1500 } )
11399 . then ( ( ) => true )
114100 . catch ( ( ) => false )
115101
116102 if ( closed ) return
117103
118104 await toggleSidebar ( page )
119- await expect ( main ) . toHaveClass ( / x l : b o r d e r - l / )
105+ await expect ( button ) . toHaveAttribute ( "aria-expanded" , "false" )
120106}
121107
122108export async function openSettings ( page : Page ) {
@@ -220,7 +206,7 @@ export function sessionIDFromUrl(url: string) {
220206}
221207
222208export async function hoverSessionItem ( page : Page , sessionID : string ) {
223- const sessionEl = page . locator ( sessionItemSelector ( sessionID ) ) . first ( )
209+ const sessionEl = page . locator ( `[data-session-id=" ${ sessionID } "]` ) . last ( )
224210 await expect ( sessionEl ) . toBeVisible ( )
225211 await sessionEl . hover ( )
226212 return sessionEl
@@ -570,32 +556,42 @@ export async function openProjectMenu(page: Page, projectSlug: string) {
570556 const trigger = page . locator ( projectMenuTriggerSelector ( projectSlug ) ) . first ( )
571557 await expect ( trigger ) . toHaveCount ( 1 )
572558
559+ const menu = page
560+ . locator ( dropdownMenuContentSelector )
561+ . filter ( { has : page . locator ( projectCloseMenuSelector ( projectSlug ) ) } )
562+ . first ( )
563+ const close = menu . locator ( projectCloseMenuSelector ( projectSlug ) ) . first ( )
564+
565+ const clicked = await trigger
566+ . click ( { timeout : 1500 } )
567+ . then ( ( ) => true )
568+ . catch ( ( ) => false )
569+
570+ if ( clicked ) {
571+ const opened = await menu
572+ . waitFor ( { state : "visible" , timeout : 1500 } )
573+ . then ( ( ) => true )
574+ . catch ( ( ) => false )
575+ if ( opened ) {
576+ await expect ( close ) . toBeVisible ( )
577+ return menu
578+ }
579+ }
580+
573581 await trigger . focus ( )
574582 await page . keyboard . press ( "Enter" )
575583
576- const menu = page . locator ( dropdownMenuContentSelector ) . first ( )
577584 const opened = await menu
578585 . waitFor ( { state : "visible" , timeout : 1500 } )
579586 . then ( ( ) => true )
580587 . catch ( ( ) => false )
581588
582589 if ( opened ) {
583- const viewport = page . viewportSize ( )
584- const x = viewport ? Math . max ( viewport . width - 5 , 0 ) : 1200
585- const y = viewport ? Math . max ( viewport . height - 5 , 0 ) : 800
586- await page . mouse . move ( x , y )
590+ await expect ( close ) . toBeVisible ( )
587591 return menu
588592 }
589593
590- await trigger . click ( { force : true } )
591-
592- await expect ( menu ) . toBeVisible ( )
593-
594- const viewport = page . viewportSize ( )
595- const x = viewport ? Math . max ( viewport . width - 5 , 0 ) : 1200
596- const y = viewport ? Math . max ( viewport . height - 5 , 0 ) : 800
597- await page . mouse . move ( x , y )
598- return menu
594+ throw new Error ( `Failed to open project menu: ${ projectSlug } ` )
599595}
600596
601597export async function setWorkspacesEnabled ( page : Page , projectSlug : string , enabled : boolean ) {
@@ -608,11 +604,18 @@ export async function setWorkspacesEnabled(page: Page, projectSlug: string, enab
608604
609605 if ( current === enabled ) return
610606
611- await openProjectMenu ( page , projectSlug )
607+ const flip = async ( timeout ?: number ) => {
608+ const menu = await openProjectMenu ( page , projectSlug )
609+ const toggle = menu . locator ( projectWorkspacesToggleSelector ( projectSlug ) ) . first ( )
610+ await expect ( toggle ) . toBeVisible ( )
611+ return toggle . click ( { force : true , timeout } )
612+ }
613+
614+ const flipped = await flip ( 1500 )
615+ . then ( ( ) => true )
616+ . catch ( ( ) => false )
612617
613- const toggle = page . locator ( projectWorkspacesToggleSelector ( projectSlug ) ) . first ( )
614- await expect ( toggle ) . toBeVisible ( )
615- await toggle . click ( { force : true } )
618+ if ( ! flipped ) await flip ( )
616619
617620 const expected = enabled ? "New workspace" : "New session"
618621 await expect ( page . getByRole ( "button" , { name : expected } ) . first ( ) ) . toBeVisible ( )
0 commit comments