@@ -20,18 +20,22 @@ vi.mock("../../kill-tree.js", () => ({
2020
2121function createStubPty ( pid = 1234 ) {
2222 let exitListener : ( ( event : { exitCode : number ; signal ?: number } ) => void ) | null = null ;
23+ const disposeData = vi . fn ( ) ;
24+ const disposeExit = vi . fn ( ) ;
2325 return {
2426 pid,
2527 write : vi . fn ( ) ,
26- onData : vi . fn ( ( ) => ( { dispose : vi . fn ( ) } ) ) ,
28+ onData : vi . fn ( ( ) => ( { dispose : disposeData } ) ) ,
2729 onExit : vi . fn ( ( listener : ( event : { exitCode : number ; signal ?: number } ) => void ) => {
2830 exitListener = listener ;
29- return { dispose : vi . fn ( ) } ;
31+ return { dispose : disposeExit } ;
3032 } ) ,
3133 kill : ( signal ?: string ) => ptyKillMock ( signal ) ,
3234 emitExit : ( event : { exitCode : number ; signal ?: number } ) => {
3335 exitListener ?.( event ) ;
3436 } ,
37+ disposeData,
38+ disposeExit,
3539 } ;
3640}
3741
@@ -151,6 +155,22 @@ describe("createPtyAdapter", () => {
151155 await expect ( adapter . wait ( ) ) . resolves . toEqual ( { code : 3 , signal : null } ) ;
152156 } ) ;
153157
158+ it ( "disposes PTY listeners" , async ( ) => {
159+ const stub = createStubPty ( ) ;
160+ spawnMock . mockReturnValue ( stub ) ;
161+
162+ const adapter = await createPtyAdapter ( {
163+ shell : "bash" ,
164+ args : [ "-lc" , "echo ok" ] ,
165+ } ) ;
166+ adapter . onStdout ( ( ) => undefined ) ;
167+
168+ adapter . dispose ( ) ;
169+
170+ expect ( stub . disposeData ) . toHaveBeenCalledTimes ( 1 ) ;
171+ expect ( stub . disposeExit ) . toHaveBeenCalledTimes ( 1 ) ;
172+ } ) ;
173+
154174 it ( "keeps inherited env when no override env is provided on non-Linux" , async ( ) => {
155175 const originalPlatform = Object . getOwnPropertyDescriptor ( process , "platform" ) ;
156176 Object . defineProperty ( process , "platform" , { value : "darwin" , configurable : true } ) ;
0 commit comments