@@ -9,12 +9,19 @@ const title = "Review terminal stacked"
99const branchDiffs = [
1010 fileDiff ( ".github/actions/setup-bun/action.yml" , 7 ) ,
1111 ...Array . from ( { length : 2_739 } , ( _ , index ) =>
12- fileDiff ( `src/branch/generated-${ String ( index ) . padStart ( 4 , "0" ) } .ts` , 100 ) ,
12+ fileDiff (
13+ `src/branch/d${ String ( Math . floor ( index / 100 ) ) . padStart ( 5 , "0" ) } /generated-${ String ( index ) . padStart ( 4 , "0" ) } .ts` ,
14+ 100 ,
15+ false ,
16+ ) ,
1317 ) ,
1418]
1519
1620test ( "keeps the review tree and terminal sized when both panels are open" , async ( { page } ) => {
1721 test . setTimeout ( 120_000 )
22+ const events : Array < { directory : string ; payload : Record < string , unknown > } > = [ ]
23+ let detailVersion = 1
24+ let detailFailures = 1
1825 await page . setViewportSize ( { width : 1400 , height : 900 } )
1926 await mockOpenCodeServer ( page , {
2027 directory,
@@ -48,7 +55,10 @@ test("keeps the review tree and terminal sized when both panels are open", async
4855 time : { created : 1700000000000 , updated : 1700000000000 } ,
4956 } ,
5057 ] ,
58+ sessionStatus : { [ sessionID ] : { type : "idle" } } ,
5159 pageMessages : ( ) => ( { items : [ ] } ) ,
60+ events : ( ) => events . splice ( 0 , 1 ) ,
61+ eventRetry : 16 ,
5262 } )
5363 await page . route ( / \/ v c s (?: \? .* ) ? $ / , ( route ) =>
5464 route . fulfill ( {
@@ -57,17 +67,25 @@ test("keeps the review tree and terminal sized when both panels are open", async
5767 body : JSON . stringify ( { branch : "review-pane-performance" , default_branch : "dev" } ) ,
5868 } ) ,
5969 )
60- await page . route ( "**/vcs/diff**" , ( route ) =>
61- route . fulfill ( {
70+ await page . route ( "**/vcs/diff**" , ( route ) => {
71+ const url = new URL ( route . request ( ) . url ( ) )
72+ const scope = url . searchParams . get ( "directory" ) ?. replaceAll ( "\\" , "/" )
73+ const detail = scope ?. endsWith ( "/src/branch/d00027" )
74+ if ( detail && detailFailures -- > 0 ) return route . fulfill ( { status : 500 , body : "retry detail" } )
75+ return route . fulfill ( {
6276 status : 200 ,
6377 contentType : "application/json" ,
6478 body : JSON . stringify (
65- new URL ( route . request ( ) . url ( ) ) . searchParams . get ( "mode" ) === "branch"
66- ? branchDiffs
79+ url . searchParams . get ( "mode" ) === "branch"
80+ ? detail
81+ ? branchDiffs
82+ . filter ( ( diff ) => diff . file . startsWith ( "src/branch/d00027/" ) )
83+ . map ( ( diff ) => fileDiff ( diff . file , diff . additions , true , detailVersion ) )
84+ : branchDiffs
6785 : Array . from ( { length : 7 } , ( _ , index ) => fileDiff ( `src/git-${ index } .ts` , 1 ) ) ,
6886 ) ,
69- } ) ,
70- )
87+ } )
88+ } )
7189 await page . route ( "**/pty" , ( route ) =>
7290 route . fulfill ( {
7391 status : 200 ,
@@ -96,7 +114,7 @@ test("keeps the review tree and terminal sized when both panels are open", async
96114 await expect ( page . getByRole ( "tab" , { name : "Review 2740" } ) ) . toBeVisible ( )
97115 await page . keyboard . press ( "Control+Backquote" )
98116 await expect ( page . locator ( "#terminal-panel" ) ) . toBeVisible ( )
99- await expectTree ( page , 2_745 , "action.yml" )
117+ await expectTree ( page , 2_773 , "action.yml" )
100118 await expectStackGeometry ( page )
101119
102120 const treeViewport = page . locator ( '#review-panel [data-slot="session-review-v2-sidebar-tree"] .scroll-view__viewport' )
@@ -113,41 +131,66 @@ test("keeps the review tree and terminal sized when both panels are open", async
113131 } )
114132 expect ( bottomGap ) . toBeGreaterThanOrEqual ( 0 )
115133 expect ( bottomGap ) . toBeLessThanOrEqual ( 16 )
134+ const lazyDiff = page . waitForRequest ( ( request ) => {
135+ const url = new URL ( request . url ( ) )
136+ return (
137+ url . pathname === "/vcs/diff" &&
138+ url . searchParams . get ( "directory" ) ?. replaceAll ( "\\" , "/" ) . endsWith ( "/src/branch/d00027" ) === true
139+ )
140+ } )
141+ await lastFile . click ( )
142+ await lazyDiff
143+ const preview = page . locator ( '[data-slot="session-review-v2-diff-scroll"]' )
144+ await expect ( preview ) . toContainText ( "after-1" )
145+ detailVersion = 2
146+ events . push ( statusEvent ( "busy" ) )
147+ await expect ( page . getByRole ( "button" , { name : "Stop" } ) ) . toBeVisible ( )
148+ const refreshedDiff = page . waitForRequest ( ( request ) => {
149+ const url = new URL ( request . url ( ) )
150+ return (
151+ url . pathname === "/vcs/diff" &&
152+ url . searchParams . get ( "directory" ) ?. replaceAll ( "\\" , "/" ) . endsWith ( "/src/branch/d00027" ) === true
153+ )
154+ } )
155+ events . push ( statusEvent ( "idle" ) )
156+ await refreshedDiff
157+ await expect ( preview ) . toContainText ( "after-2" )
116158 await selectMode ( page , "Branch changes" , "Git changes" )
117159 await expectTree ( page , 8 , "git-0.ts" )
160+ await page . getByRole ( "button" , { name : "git-0.ts" } ) . click ( )
118161 await selectMode ( page , "Git changes" , "Branch changes" )
119- await expectTree ( page , 2_745 , "action.yml" )
162+ await expectTree ( page , 2_773 , "action.yml" )
120163
121164 const filter = page . getByRole ( "searchbox" , { name : "Filter files" } )
122165 await filter . fill ( "generated-2738" )
123166 await expectTree ( page , 1 , "generated-2738.ts" )
124167 await filter . fill ( "" )
125- await expectTree ( page , 2_745 , "action.yml" )
168+ await expectTree ( page , 2_773 , "action.yml" )
126169
127170 await page . getByRole ( "button" , { name : "Toggle file tree" } ) . click ( )
128171 await expect ( page . locator ( '[data-slot="session-review-v2-sidebar"]' ) ) . toHaveAttribute ( "aria-hidden" , "true" )
129172 await expect ( page . locator ( '#review-panel [data-component="file-tree-v2"]' ) ) . toHaveCount ( 1 )
130173 await page . getByRole ( "button" , { name : "Toggle file tree" } ) . click ( )
131- await expectTree ( page , 2_745 , "action.yml" )
174+ await expectTree ( page , 2_773 , "action.yml" )
132175
133176 await page . keyboard . press ( "Control+Backquote" )
134177 await expect ( page . locator ( "#terminal-panel" ) ) . toHaveCount ( 0 )
135- await expectTree ( page , 2_745 , "action.yml" )
178+ await expectTree ( page , 2_773 , "action.yml" )
136179 await page . keyboard . press ( "Control+Backquote" )
137180 await expect ( page . locator ( "#terminal-panel" ) ) . toBeVisible ( )
138- await expectTree ( page , 2_745 , "action.yml" )
181+ await expectTree ( page , 2_773 , "action.yml" )
139182
140183 await page . getByRole ( "button" , { name : "Toggle review" } ) . click ( )
141184 await expect ( page . locator ( "#review-panel" ) ) . toHaveAttribute ( "aria-hidden" , "true" )
142185 await expect ( page . locator ( '#review-panel [data-component="file-tree-v2"]' ) ) . toHaveCount ( 1 )
143186 await page . getByRole ( "button" , { name : "Toggle review" } ) . click ( )
144- await expectTree ( page , 2_745 , "action.yml" )
187+ await expectTree ( page , 2_773 , "action.yml" )
145188 await page . setViewportSize ( { width : 1_000 , height : 700 } )
146- await expectTree ( page , 2_745 , "action.yml" )
189+ await expectTree ( page , 2_773 , "action.yml" )
147190 await expectStackGeometry ( page )
148191 await page . setViewportSize ( { width : 1_000 , height : 120 } )
149192 await page . setViewportSize ( { width : 1_400 , height : 900 } )
150- await expectTree ( page , 2_745 , "action.yml" )
193+ await expectTree ( page , 2_773 , "action.yml" )
151194 await expectStackGeometry ( page )
152195} )
153196
@@ -201,12 +244,21 @@ function base64Encode(value: string) {
201244 return Buffer . from ( value , "utf8" ) . toString ( "base64" ) . replace ( / \+ / g, "-" ) . replace ( / \/ / g, "_" ) . replace ( / = / g, "" )
202245}
203246
204- function fileDiff ( file : string , additions : number ) {
247+ function statusEvent ( type : "busy" | "idle" ) {
248+ return {
249+ directory,
250+ payload : { type : "session.status" , properties : { sessionID, status : { type } } } ,
251+ }
252+ }
253+
254+ function fileDiff ( file : string , additions : number , loaded = true , version = 1 ) {
205255 return {
206256 file,
207257 additions,
208258 deletions : 0 ,
209259 status : "modified" ,
210- patch : `diff --git a/${ file } b/${ file } \n--- a/${ file } \n+++ b/${ file } \n@@ -1 +1 @@\n-export const value = 'before'\n+export const value = 'after'\n` ,
260+ patch : loaded
261+ ? `diff --git a/${ file } b/${ file } \n--- a/${ file } \n+++ b/${ file } \n@@ -1 +1 @@\n-export const value = 'before'\n+export const value = 'after-${ version } '\n`
262+ : `diff --git a/${ file } b/${ file } \n--- a/${ file } \n+++ b/${ file } ` ,
211263 }
212264}
0 commit comments