@@ -11,18 +11,12 @@ import {
1111 cleanupTestProject ,
1212 clickMenuItem ,
1313 confirmDialog ,
14- openProjectMenu ,
1514 openSidebar ,
1615 openWorkspaceMenu ,
1716 setWorkspacesEnabled ,
1817} from "../actions"
19- import {
20- inlineInputSelector ,
21- projectSwitchSelector ,
22- projectWorkspacesToggleSelector ,
23- workspaceItemSelector ,
24- } from "../selectors"
25- import { dirSlug } from "../utils"
18+ import { dropdownMenuContentSelector , inlineInputSelector , workspaceItemSelector } from "../selectors"
19+ import { createSdk , dirSlug } from "../utils"
2620
2721function slugFromUrl ( url : string ) {
2822 return / \/ ( [ ^ / ] + ) \/ s e s s i o n (?: \/ | $ ) / . exec ( url ) ?. [ 1 ] ?? ""
@@ -143,26 +137,35 @@ test("non-git projects keep workspace mode disabled", async ({ page, withProject
143137 await fs . writeFile ( path . join ( nonGit , "README.md" ) , "# e2e nongit\n" )
144138
145139 try {
146- await withProject (
147- async ( ) => {
148- await openSidebar ( page )
140+ await withProject ( async ( ) => {
141+ await page . goto ( `/${ nonGitSlug } /session` )
142+
143+ await expect . poll ( ( ) => slugFromUrl ( page . url ( ) ) , { timeout : 30_000 } ) . not . toBe ( "" )
149144
150- const nonGitButton = page . locator ( projectSwitchSelector ( nonGitSlug ) ) . first ( )
151- await expect ( nonGitButton ) . toBeVisible ( )
152- await nonGitButton . click ( )
153- await expect ( page ) . toHaveURL ( new RegExp ( `/${ nonGitSlug } /session` ) )
145+ const activeDir = base64Decode ( slugFromUrl ( page . url ( ) ) )
146+ expect ( path . basename ( activeDir ) ) . toContain ( "opencode-e2e-project-nongit-" )
154147
155- const menu = await openProjectMenu ( page , nonGitSlug )
156- const toggle = menu . locator ( projectWorkspacesToggleSelector ( nonGitSlug ) ) . first ( )
148+ await openSidebar ( page )
149+ await expect ( page . getByRole ( "button" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
157150
158- await expect ( toggle ) . toBeVisible ( )
159- await expect ( toggle ) . toBeDisabled ( )
151+ const trigger = page . locator ( '[data-action="project-menu"]' ) . first ( )
152+ const hasMenu = await trigger
153+ . isVisible ( )
154+ . then ( ( x ) => x )
155+ . catch ( ( ) => false )
156+ if ( ! hasMenu ) return
160157
161- await expect ( menu . getByRole ( "menuitem" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
162- await expect ( page . getByRole ( "button" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
163- } ,
164- { extra : [ nonGit ] } ,
165- )
158+ await trigger . click ( { force : true } )
159+
160+ const menu = page . locator ( dropdownMenuContentSelector ) . first ( )
161+ await expect ( menu ) . toBeVisible ( )
162+
163+ const toggle = menu . locator ( '[data-action="project-workspaces-toggle"]' ) . first ( )
164+
165+ await expect ( toggle ) . toBeVisible ( )
166+ await expect ( toggle ) . toBeDisabled ( )
167+ await expect ( menu . getByRole ( "menuitem" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
168+ } )
166169 } finally {
167170 await cleanupTestProject ( nonGit )
168171 }
@@ -256,14 +259,45 @@ test("can delete a workspace", async ({ page, withProject }) => {
256259 await page . setViewportSize ( { width : 1400 , height : 800 } )
257260
258261 await withProject ( async ( project ) => {
259- const { rootSlug, slug } = await setupWorkspaceTest ( page , project )
262+ const sdk = createSdk ( project . directory )
263+ const { rootSlug, slug, directory } = await setupWorkspaceTest ( page , project )
264+
265+ await expect
266+ . poll (
267+ async ( ) => {
268+ const worktrees = await sdk . worktree
269+ . list ( )
270+ . then ( ( r ) => r . data ?? [ ] )
271+ . catch ( ( ) => [ ] as string [ ] )
272+ return worktrees . includes ( directory )
273+ } ,
274+ { timeout : 30_000 } ,
275+ )
276+ . toBe ( true )
260277
261278 const menu = await openWorkspaceMenu ( page , slug )
262279 await clickMenuItem ( menu , / ^ D e l e t e $ / i, { force : true } )
263280 await confirmDialog ( page , / ^ D e l e t e w o r k s p a c e $ / i)
264281
265282 await expect ( page ) . toHaveURL ( new RegExp ( `/${ rootSlug } /session` ) )
266- await expect ( page . locator ( workspaceItemSelector ( slug ) ) ) . toHaveCount ( 0 )
283+
284+ await expect
285+ . poll (
286+ async ( ) => {
287+ const worktrees = await sdk . worktree
288+ . list ( )
289+ . then ( ( r ) => r . data ?? [ ] )
290+ . catch ( ( ) => [ ] as string [ ] )
291+ return worktrees . includes ( directory )
292+ } ,
293+ { timeout : 60_000 } ,
294+ )
295+ . toBe ( false )
296+
297+ await project . gotoSession ( )
298+
299+ await openSidebar ( page )
300+ await expect ( page . locator ( workspaceItemSelector ( slug ) ) ) . toHaveCount ( 0 , { timeout : 60_000 } )
267301 await expect ( page . locator ( workspaceItemSelector ( rootSlug ) ) . first ( ) ) . toBeVisible ( )
268302 } )
269303} )
0 commit comments