1- import { base64Decode } from "@opencode-ai/util/encode"
21import type { Page } from "@playwright/test"
32import { test , expect } from "../fixtures"
4- import { openSidebar , sessionIDFromUrl , setWorkspacesEnabled , slugFromUrl , waitSlug } from "../actions"
3+ import { openSidebar , resolveSlug , sessionIDFromUrl , setWorkspacesEnabled , waitDir , waitSlug } from "../actions"
54import { promptSelector , workspaceItemSelector , workspaceNewSessionSelector } from "../selectors"
65import { createSdk } from "../utils"
76
8- async function waitWorkspaceReady ( page : Page , slug : string ) {
7+ function item ( space : { slug : string ; raw : string } ) {
8+ return `${ workspaceItemSelector ( space . slug ) } , ${ workspaceItemSelector ( space . raw ) } `
9+ }
10+
11+ function button ( space : { slug : string ; raw : string } ) {
12+ return `${ workspaceNewSessionSelector ( space . slug ) } , ${ workspaceNewSessionSelector ( space . raw ) } `
13+ }
14+
15+ async function waitWorkspaceReady ( page : Page , space : { slug : string ; raw : string } ) {
916 await openSidebar ( page )
1017 await expect
1118 . poll (
1219 async ( ) => {
13- const item = page . locator ( workspaceItemSelector ( slug ) ) . first ( )
20+ const row = page . locator ( item ( space ) ) . first ( )
1421 try {
15- await item . hover ( { timeout : 500 } )
22+ await row . hover ( { timeout : 500 } )
1623 return true
1724 } catch {
1825 return false
@@ -27,29 +34,30 @@ async function createWorkspace(page: Page, root: string, seen: string[]) {
2734 await openSidebar ( page )
2835 await page . getByRole ( "button" , { name : "New workspace" } ) . first ( ) . click ( )
2936
30- const slug = await waitSlug ( page , [ root , ...seen ] )
31- const directory = base64Decode ( slug )
32- if ( ! directory ) throw new Error ( `Failed to decode workspace slug: ${ slug } ` )
33- return { slug, directory }
37+ const next = await resolveSlug ( await waitSlug ( page , [ root , ...seen ] ) )
38+ await waitDir ( page , next . directory )
39+ return next
3440}
3541
36- async function openWorkspaceNewSession ( page : Page , slug : string ) {
37- await waitWorkspaceReady ( page , slug )
42+ async function openWorkspaceNewSession ( page : Page , space : { slug : string ; raw : string ; directory : string } ) {
43+ await waitWorkspaceReady ( page , space )
3844
39- const item = page . locator ( workspaceItemSelector ( slug ) ) . first ( )
40- await item . hover ( )
45+ const row = page . locator ( item ( space ) ) . first ( )
46+ await row . hover ( )
4147
42- const button = page . locator ( workspaceNewSessionSelector ( slug ) ) . first ( )
43- await expect ( button ) . toBeVisible ( )
44- await button . click ( { force : true } )
48+ const next = page . locator ( button ( space ) ) . first ( )
49+ await expect ( next ) . toBeVisible ( )
50+ await next . click ( { force : true } )
4551
46- const next = await waitSlug ( page )
47- await expect ( page ) . toHaveURL ( new RegExp ( `/${ next } /session(?:[/?#]|$)` ) )
48- return next
52+ return waitDir ( page , space . directory )
4953}
5054
51- async function createSessionFromWorkspace ( page : Page , slug : string , text : string ) {
52- const next = await openWorkspaceNewSession ( page , slug )
55+ async function createSessionFromWorkspace (
56+ page : Page ,
57+ space : { slug : string ; raw : string ; directory : string } ,
58+ text : string ,
59+ ) {
60+ const next = await openWorkspaceNewSession ( page , space )
5361
5462 const prompt = page . locator ( promptSelector )
5563 await expect ( prompt ) . toBeVisible ( )
@@ -60,13 +68,13 @@ async function createSessionFromWorkspace(page: Page, slug: string, text: string
6068 await expect . poll ( async ( ) => ( ( await prompt . textContent ( ) ) ?? "" ) . trim ( ) ) . toContain ( text )
6169 await prompt . press ( "Enter" )
6270
63- await expect . poll ( ( ) => slugFromUrl ( page . url ( ) ) ) . toBe ( next )
71+ await waitDir ( page , next . directory )
6472 await expect . poll ( ( ) => sessionIDFromUrl ( page . url ( ) ) ?? "" , { timeout : 30_000 } ) . not . toBe ( "" )
6573
6674 const sessionID = sessionIDFromUrl ( page . url ( ) )
6775 if ( ! sessionID ) throw new Error ( `Failed to parse session id from url: ${ page . url ( ) } ` )
68- await expect ( page ) . toHaveURL ( new RegExp ( `/${ next } / session/${ sessionID } (?:[/?#]|$)` ) )
69- return { sessionID, slug : next }
76+ await expect ( page ) . toHaveURL ( new RegExp ( `/session/${ sessionID } (?:[/?#]|$)` ) )
77+ return { sessionID, slug : next . slug }
7078}
7179
7280async function sessionDirectory ( directory : string , sessionID : string ) {
@@ -87,11 +95,11 @@ test("new sessions from sidebar workspace actions stay in selected workspace", a
8795
8896 const first = await createWorkspace ( page , root , [ ] )
8997 trackDirectory ( first . directory )
90- await waitWorkspaceReady ( page , first . slug )
98+ await waitWorkspaceReady ( page , first )
9199
92100 const second = await createWorkspace ( page , root , [ first . slug ] )
93101 trackDirectory ( second . directory )
94- await waitWorkspaceReady ( page , second . slug )
102+ await waitWorkspaceReady ( page , second )
95103
96104 const firstSession = await createSessionFromWorkspace ( page , first . slug , `workspace one ${ Date . now ( ) } ` )
97105 trackSession ( firstSession . sessionID , first . directory )
0 commit comments