11import * as assert from 'assert' ;
22import * as vscode from 'vscode' ;
33import { BuilderTerminalLinkProvider } from '../terminal-link-provider.js' ;
4- import type { ConnectionManager } from '../connection-manager.js' ;
54import type { TerminalManager } from '../terminal-manager.js' ;
65
7- const fakeOutputChannel = ( ) : vscode . OutputChannel => ( {
8- name : 'test' ,
9- append : ( ) => { } ,
10- appendLine : ( ) => { } ,
11- clear : ( ) => { } ,
12- show : ( ) => { } ,
13- hide : ( ) => { } ,
14- dispose : ( ) => { } ,
15- replace : ( ) => { } ,
16- } ) ;
17-
186function fakeContext ( line : string ) : vscode . TerminalLinkContext {
197 return { line, terminal : undefined as unknown as vscode . Terminal } ;
208}
219
10+ // A TerminalManager that throws if any method is called from render.
11+ const guardedTerminalManager = {
12+ openBuilderByRoleOrId : ( ) => { throw new Error ( 'openBuilderByRoleOrId called from provideTerminalLinks' ) ; } ,
13+ openBuilder : ( ) => { throw new Error ( 'openBuilder called from provideTerminalLinks' ) ; } ,
14+ } as unknown as TerminalManager ;
15+
2216suite ( 'BuilderTerminalLinkProvider.provideTerminalLinks' , ( ) => {
2317 test ( 'matches a single builder role name' , ( ) => {
24- const provider = new BuilderTerminalLinkProvider (
25- { } as ConnectionManager ,
26- { } as TerminalManager ,
27- fakeOutputChannel ( ) ,
28- ) ;
18+ const provider = new BuilderTerminalLinkProvider ( guardedTerminalManager ) ;
2919 const links = provider . provideTerminalLinks ( fakeContext ( 'starting builder-spir-153 now' ) ) ;
3020 assert . strictEqual ( links . length , 1 ) ;
3121 assert . strictEqual ( links [ 0 ] . roleId , 'builder-spir-153' ) ;
3222 assert . strictEqual ( links [ 0 ] . length , 'builder-spir-153' . length ) ;
3323 } ) ;
3424
3525 test ( 'matches multiple builder role names on one line' , ( ) => {
36- const provider = new BuilderTerminalLinkProvider (
37- { } as ConnectionManager ,
38- { } as TerminalManager ,
39- fakeOutputChannel ( ) ,
40- ) ;
26+ const provider = new BuilderTerminalLinkProvider ( guardedTerminalManager ) ;
4127 const links = provider . provideTerminalLinks (
4228 fakeContext ( 'builders: builder-spir-153, builder-bugfix-42, builder-air-7' ) ,
4329 ) ;
@@ -48,36 +34,23 @@ suite('BuilderTerminalLinkProvider.provideTerminalLinks', () => {
4834 } ) ;
4935
5036 test ( 'does not match non-builder text' , ( ) => {
51- const provider = new BuilderTerminalLinkProvider (
52- { } as ConnectionManager ,
53- { } as TerminalManager ,
54- fakeOutputChannel ( ) ,
55- ) ;
37+ const provider = new BuilderTerminalLinkProvider ( guardedTerminalManager ) ;
5638 assert . strictEqual ( provider . provideTerminalLinks ( fakeContext ( 'no role here' ) ) . length , 0 ) ;
5739 assert . strictEqual ( provider . provideTerminalLinks ( fakeContext ( 'foo-bar-baz' ) ) . length , 0 ) ;
5840 } ) ;
5941
60- test ( 'does not call into ConnectionManager during render' , ( ) => {
42+ test ( 'does not call into TerminalManager during render' , ( ) => {
6143 // Regression pin for PR #682 review #2: provideTerminalLinks fires per
6244 // terminal paint, so it must stay pure. Tower lookup belongs in
63- // handleTerminalLink (click handler).
64- const guarded = {
65- getClient : ( ) => { throw new Error ( 'getClient called from provideTerminalLinks' ) ; } ,
66- getWorkspacePath : ( ) => { throw new Error ( 'getWorkspacePath called from provideTerminalLinks' ) ; } ,
67- } as unknown as ConnectionManager ;
68- const provider = new BuilderTerminalLinkProvider ( guarded , { } as TerminalManager , fakeOutputChannel ( ) ) ;
69-
45+ // handleTerminalLink (click handler) via openBuilderByRoleOrId.
46+ const provider = new BuilderTerminalLinkProvider ( guardedTerminalManager ) ;
7047 assert . doesNotThrow ( ( ) =>
7148 provider . provideTerminalLinks ( fakeContext ( 'builder-spir-1 builder-spir-2 builder-spir-3' ) ) ,
7249 ) ;
7350 } ) ;
7451
7552 test ( 'regex re-resets between calls (statefulness check)' , ( ) => {
76- const provider = new BuilderTerminalLinkProvider (
77- { } as ConnectionManager ,
78- { } as TerminalManager ,
79- fakeOutputChannel ( ) ,
80- ) ;
53+ const provider = new BuilderTerminalLinkProvider ( guardedTerminalManager ) ;
8154 // Module-level regex with /g flag carries lastIndex; provider must reset.
8255 const a = provider . provideTerminalLinks ( fakeContext ( 'builder-spir-1' ) ) ;
8356 const b = provider . provideTerminalLinks ( fakeContext ( 'builder-spir-2' ) ) ;
0 commit comments