@@ -168,7 +168,9 @@ test.describe("regression: session timeline local row state", () => {
168168 } ,
169169 } )
170170
171- await expect ( wrapper . locator ( '[data-slot="diff-changes-additions"]' ) . filter ( { hasText : "+2" } ) . first ( ) ) . toBeVisible ( { timeout : 10_000 } )
171+ await expect ( wrapper . locator ( '[data-slot="diff-changes-additions"]' ) . filter ( { hasText : "+2" } ) . first ( ) ) . toBeVisible (
172+ { timeout : 10_000 } ,
173+ )
172174 expect ( await readDiffProbe ( page ) ) . toEqual ( { fileMarker : "before" , shadowRoots : 0 , toolMarker : "before" } )
173175 } )
174176} )
@@ -194,23 +196,29 @@ async function expectExpanded(locator: Locator, expected: boolean) {
194196}
195197
196198async function readToolState ( page : Page ) {
197- return page . locator ( `[data-timeline-part-id="${ editPartID } "]` ) . first ( ) . evaluate ( ( element , textPartID ) => ( {
198- expanded : ( ( ) => {
199- const trigger = element . querySelector ( '[data-slot="collapsible-trigger"]' )
200- const aria = trigger ?. getAttribute ( "aria-expanded" )
201- if ( aria === "true" ) return true
202- if ( aria === "false" ) return false
203-
204- const root = element . querySelector ( '[data-component="collapsible"]' )
205- if ( root ?. hasAttribute ( "data-expanded" ) ) return true
206- if ( root ?. hasAttribute ( "data-closed" ) ) return false
207-
208- const content = element . querySelector < HTMLElement > ( '[data-slot="collapsible-content"]' )
209- return ! ! content && content . getBoundingClientRect ( ) . height > 0
210- } ) ( ) ,
211- row : element . closest ( "[data-timeline-row]" ) ?. getAttribute ( "data-timeline-row" ) ,
212- streamedTextVisible : ! ! document . querySelector ( `[data-timeline-part-id="${ textPartID } "]` ) ,
213- } ) , textPartID )
199+ return page
200+ . locator ( `[data-timeline-part-id="${ editPartID } "]` )
201+ . first ( )
202+ . evaluate (
203+ ( element , textPartID ) => ( {
204+ expanded : ( ( ) => {
205+ const trigger = element . querySelector ( '[data-slot="collapsible-trigger"]' )
206+ const aria = trigger ?. getAttribute ( "aria-expanded" )
207+ if ( aria === "true" ) return true
208+ if ( aria === "false" ) return false
209+
210+ const root = element . querySelector ( '[data-component="collapsible"]' )
211+ if ( root ?. hasAttribute ( "data-expanded" ) ) return true
212+ if ( root ?. hasAttribute ( "data-closed" ) ) return false
213+
214+ const content = element . querySelector < HTMLElement > ( '[data-slot="collapsible-content"]' )
215+ return ! ! content && content . getBoundingClientRect ( ) . height > 0
216+ } ) ( ) ,
217+ row : element . closest ( "[data-timeline-row]" ) ?. getAttribute ( "data-timeline-row" ) ,
218+ streamedTextVisible : ! ! document . querySelector ( `[data-timeline-part-id="${ textPartID } "]` ) ,
219+ } ) ,
220+ textPartID ,
221+ )
214222}
215223
216224async function installDiffProbe ( page : Page ) {
@@ -231,27 +239,33 @@ async function installDiffProbe(page: Page) {
231239}
232240
233241async function markDiffProbe ( page : Page ) {
234- await page . locator ( `[data-timeline-part-id="${ editPartID } "]` ) . first ( ) . evaluate ( ( element ) => {
235- const tool = element as HTMLElement
236- const file = tool . querySelector < HTMLElement > ( '[data-component="file"][data-mode="diff"]' )
237- if ( ! file ) throw new Error ( "missing edit diff file" )
238-
239- tool . dataset . timelineProbe = "before"
240- file . dataset . timelineProbe = "before"
241- window . __timelineDiffProbe . reset ( )
242- } )
242+ await page
243+ . locator ( `[data-timeline-part-id="${ editPartID } "]` )
244+ . first ( )
245+ . evaluate ( ( element ) => {
246+ const tool = element as HTMLElement
247+ const file = tool . querySelector < HTMLElement > ( '[data-component="file"][data-mode="diff"]' )
248+ if ( ! file ) throw new Error ( "missing edit diff file" )
249+
250+ tool . dataset . timelineProbe = "before"
251+ file . dataset . timelineProbe = "before"
252+ window . __timelineDiffProbe . reset ( )
253+ } )
243254}
244255
245256async function readDiffProbe ( page : Page ) {
246- return page . locator ( `[data-timeline-part-id="${ editPartID } "]` ) . first ( ) . evaluate ( ( element ) => {
247- const tool = element as HTMLElement
248- const file = tool . querySelector < HTMLElement > ( '[data-component="file"][data-mode="diff"]' )
249- return {
250- fileMarker : file ?. dataset . timelineProbe ,
251- shadowRoots : window . __timelineDiffProbe . shadowRoots ( ) ,
252- toolMarker : tool . dataset . timelineProbe ,
253- }
254- } )
257+ return page
258+ . locator ( `[data-timeline-part-id="${ editPartID } "]` )
259+ . first ( )
260+ . evaluate ( ( element ) => {
261+ const tool = element as HTMLElement
262+ const file = tool . querySelector < HTMLElement > ( '[data-component="file"][data-mode="diff"]' )
263+ return {
264+ fileMarker : file ?. dataset . timelineProbe ,
265+ shadowRoots : window . __timelineDiffProbe . shadowRoots ( ) ,
266+ toolMarker : tool . dataset . timelineProbe ,
267+ }
268+ } )
255269}
256270
257271function editPartWithAdditions ( additions : number ) {
@@ -292,10 +306,23 @@ async function mockServer(page: Page, events: EventPayload[]) {
292306
293307 const path = url . pathname
294308 if ( path === "/global/event" ) return sse ( route , events . splice ( 0 ) )
295- if ( path === "/global/config" || path === "/config" || path === "/provider/auth" || path === "/mcp" || path === "/session/status" ) return json ( route , { } )
296- if ( [ "/skill" , "/command" , "/lsp" , "/formatter" , "/permission" , "/question" , "/vcs/status" , "/vcs/diff" ] . includes ( path ) ) return json ( route , [ ] )
309+ if (
310+ path === "/global/config" ||
311+ path === "/config" ||
312+ path === "/provider/auth" ||
313+ path === "/mcp" ||
314+ path === "/session/status"
315+ )
316+ return json ( route , { } )
317+ if (
318+ [ "/skill" , "/command" , "/lsp" , "/formatter" , "/permission" , "/question" , "/vcs/status" , "/vcs/diff" ] . includes (
319+ path ,
320+ )
321+ )
322+ return json ( route , [ ] )
297323 if ( path === "/provider" ) return json ( route , provider ( ) )
298- if ( path === "/path" ) return json ( route , { state : directory , config : directory , worktree : directory , directory, home : "C:/OpenCode" } )
324+ if ( path === "/path" )
325+ return json ( route , { state : directory , config : directory , worktree : directory , directory, home : "C:/OpenCode" } )
299326 if ( path === "/project" ) return json ( route , [ project ( ) ] )
300327 if ( path === "/project/current" ) return json ( route , project ( ) )
301328 if ( path === "/agent" ) return json ( route , [ { name : "build" , mode : "primary" } ] )
@@ -309,11 +336,26 @@ async function mockServer(page: Page, events: EventPayload[]) {
309336}
310337
311338function project ( ) {
312- return { id : projectID , worktree : directory , vcs : "git" , name : "timeline-state-regression" , time : { created : 1700000000000 , updated : 1700000000000 } , sandboxes : [ ] }
339+ return {
340+ id : projectID ,
341+ worktree : directory ,
342+ vcs : "git" ,
343+ name : "timeline-state-regression" ,
344+ time : { created : 1700000000000 , updated : 1700000000000 } ,
345+ sandboxes : [ ] ,
346+ }
313347}
314348
315349function session ( ) {
316- return { id : sessionID , slug : "timeline-state-regression" , projectID, directory, title, version : "dev" , time : { created : 1700000000000 , updated : 1700000000000 } }
350+ return {
351+ id : sessionID ,
352+ slug : "timeline-state-regression" ,
353+ projectID,
354+ directory,
355+ title,
356+ version : "dev" ,
357+ time : { created : 1700000000000 , updated : 1700000000000 } ,
358+ }
317359}
318360
319361function provider ( ) {
0 commit comments