@@ -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 ] ?? ""
@@ -148,26 +142,35 @@ test.skip("non-git projects keep workspace mode disabled", async ({ page, withPr
148142 await fs . writeFile ( path . join ( nonGit , "README.md" ) , "# e2e nongit\n" )
149143
150144 try {
151- await withProject (
152- async ( ) => {
153- await openSidebar ( page )
145+ await withProject ( async ( ) => {
146+ await page . goto ( `/${ nonGitSlug } /session` )
147+
148+ await expect . poll ( ( ) => slugFromUrl ( page . url ( ) ) , { timeout : 30_000 } ) . not . toBe ( "" )
154149
155- const nonGitButton = page . locator ( projectSwitchSelector ( nonGitSlug ) ) . first ( )
156- await expect ( nonGitButton ) . toBeVisible ( )
157- await nonGitButton . click ( )
158- await expect ( page ) . toHaveURL ( new RegExp ( `/${ nonGitSlug } /session` ) )
150+ const activeDir = base64Decode ( slugFromUrl ( page . url ( ) ) )
151+ expect ( path . basename ( activeDir ) ) . toContain ( "opencode-e2e-project-nongit-" )
159152
160- const menu = await openProjectMenu ( page , nonGitSlug )
161- const toggle = menu . locator ( projectWorkspacesToggleSelector ( nonGitSlug ) ) . first ( )
153+ await openSidebar ( page )
154+ await expect ( page . getByRole ( "button" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
162155
163- await expect ( toggle ) . toBeVisible ( )
164- await expect ( toggle ) . toBeDisabled ( )
156+ const trigger = page . locator ( '[data-action="project-menu"]' ) . first ( )
157+ const hasMenu = await trigger
158+ . isVisible ( )
159+ . then ( ( x ) => x )
160+ . catch ( ( ) => false )
161+ if ( ! hasMenu ) return
165162
166- await expect ( menu . getByRole ( "menuitem" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
167- await expect ( page . getByRole ( "button" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
168- } ,
169- { extra : [ nonGit ] } ,
170- )
163+ await trigger . click ( { force : true } )
164+
165+ const menu = page . locator ( dropdownMenuContentSelector ) . first ( )
166+ await expect ( menu ) . toBeVisible ( )
167+
168+ const toggle = menu . locator ( '[data-action="project-workspaces-toggle"]' ) . first ( )
169+
170+ await expect ( toggle ) . toBeVisible ( )
171+ await expect ( toggle ) . toBeDisabled ( )
172+ await expect ( menu . getByRole ( "menuitem" , { name : "New workspace" } ) ) . toHaveCount ( 0 )
173+ } )
171174 } finally {
172175 await cleanupTestProject ( nonGit )
173176 }
@@ -267,14 +270,45 @@ test.skip("can delete a workspace", async ({ page, withProject }) => {
267270 await page . setViewportSize ( { width : 1400 , height : 800 } )
268271
269272 await withProject ( async ( project ) => {
270- const { rootSlug, slug } = await setupWorkspaceTest ( page , project )
273+ const sdk = createSdk ( project . directory )
274+ const { rootSlug, slug, directory } = await setupWorkspaceTest ( page , project )
275+
276+ await expect
277+ . poll (
278+ async ( ) => {
279+ const worktrees = await sdk . worktree
280+ . list ( )
281+ . then ( ( r ) => r . data ?? [ ] )
282+ . catch ( ( ) => [ ] as string [ ] )
283+ return worktrees . includes ( directory )
284+ } ,
285+ { timeout : 30_000 } ,
286+ )
287+ . toBe ( true )
271288
272289 const menu = await openWorkspaceMenu ( page , slug )
273290 await clickMenuItem ( menu , / ^ D e l e t e $ / i, { force : true } )
274291 await confirmDialog ( page , / ^ D e l e t e w o r k s p a c e $ / i)
275292
276293 await expect ( page ) . toHaveURL ( new RegExp ( `/${ rootSlug } /session` ) )
277- await expect ( page . locator ( workspaceItemSelector ( slug ) ) ) . toHaveCount ( 0 )
294+
295+ await expect
296+ . poll (
297+ async ( ) => {
298+ const worktrees = await sdk . worktree
299+ . list ( )
300+ . then ( ( r ) => r . data ?? [ ] )
301+ . catch ( ( ) => [ ] as string [ ] )
302+ return worktrees . includes ( directory )
303+ } ,
304+ { timeout : 60_000 } ,
305+ )
306+ . toBe ( false )
307+
308+ await project . gotoSession ( )
309+
310+ await openSidebar ( page )
311+ await expect ( page . locator ( workspaceItemSelector ( slug ) ) ) . toHaveCount ( 0 , { timeout : 60_000 } )
278312 await expect ( page . locator ( workspaceItemSelector ( rootSlug ) ) . first ( ) ) . toBeVisible ( )
279313 } )
280314} )
0 commit comments