@@ -49,6 +49,59 @@ function makeBridge(options?: { currentSessionId?: string | null; open?: boolean
4949}
5050
5151describe ( 'restoreStoredSessionBinding' , ( ) => {
52+ it . each ( [ 'timeout' , 'connect error' , 'wait error' ] ) ( 'preserves the binding and transient state after a %s' , async ( failure ) => {
53+ const entry = { sessionId : 'stored-session' , workDir : '/original-project' , updatedAt : 1 }
54+ const store = makeStore ( entry )
55+ const bridge = makeBridge ( )
56+ const connect = bridge . connectSession
57+ const wait = bridge . waitForOpen
58+ if ( failure === 'connect error' ) bridge . connectSession = ( ) => { throw new Error ( 'connect failed' ) }
59+ else bridge . waitForOpen = async ( ) => {
60+ if ( failure === 'wait error' ) throw new Error ( 'wait failed' )
61+ return false
62+ }
63+ let cleared = 0
64+ const options = {
65+ chatId : 'chat-1' ,
66+ bridge,
67+ sessionStore : store ,
68+ httpClient : { sessionExists : async ( ) => true } ,
69+ onServerMessage : ( ) => { } ,
70+ logPrefix : '[Test]' ,
71+ clearTransientState : ( ) => { cleared += 1 } ,
72+ }
73+
74+ expect ( await restoreStoredSessionBinding ( options ) ) . toEqual ( { status : 'unavailable' , session : entry } )
75+ expect ( store . current ( ) ) . toEqual ( entry )
76+ expect ( cleared ) . toBe ( 0 )
77+ expect ( bridge . calls ) . not . toContain ( 'reset' )
78+
79+ bridge . connectSession = connect
80+ bridge . waitForOpen = wait
81+ expect ( await restoreStoredSessionBinding ( options ) ) . toEqual ( { status : 'restored' , session : entry } )
82+ expect ( store . current ( ) ) . toEqual ( entry )
83+ } )
84+
85+ it . each ( [ false , true ] ) ( 'keeps the binding when verification fails and reconnect returns %s' , async ( opened ) => {
86+ const entry = { sessionId : 'stored-session' , workDir : '/original-project' , updatedAt : 1 }
87+ const store = makeStore ( entry )
88+ const bridge = makeBridge ( )
89+ bridge . waitForOpen = async ( ) => opened
90+
91+ const result = await restoreStoredSessionBinding ( {
92+ chatId : 'chat-1' ,
93+ bridge,
94+ sessionStore : store ,
95+ httpClient : { sessionExists : async ( ) => { throw new Error ( 'HTTP timeout' ) } } ,
96+ onServerMessage : ( ) => { } ,
97+ logPrefix : '[Test]' ,
98+ } )
99+
100+ expect ( result ) . toEqual ( { status : opened ? 'restored' : 'unavailable' , session : entry } )
101+ expect ( store . current ( ) ) . toEqual ( entry )
102+ expect ( bridge . calls ) . toEqual ( [ 'connect:stored-session' , 'handler' ] )
103+ } )
104+
52105 it ( 'resets stale bridge memory when server-side delete removed the stored mapping' , async ( ) => {
53106 const store = makeStore ( null )
54107 const bridge = makeBridge ( { currentSessionId : 'deleted-session' , hasSession : true } )
@@ -66,7 +119,7 @@ describe('restoreStoredSessionBinding', () => {
66119 } ,
67120 } )
68121
69- expect ( restored ) . toBeNull ( )
122+ expect ( restored ) . toEqual ( { status : 'missing' } )
70123 expect ( bridge . calls ) . toEqual ( [ 'reset' ] )
71124 expect ( cleared ) . toBe ( 1 )
72125 } )
@@ -89,7 +142,7 @@ describe('restoreStoredSessionBinding', () => {
89142 } ,
90143 } )
91144
92- expect ( restored ) . toBeNull ( )
145+ expect ( restored ) . toEqual ( { status : 'missing' } )
93146 expect ( store . current ( ) ) . toBeNull ( )
94147 expect ( bridge . calls ) . toEqual ( [ ] )
95148 expect ( cleared ) . toBe ( 1 )
@@ -113,7 +166,7 @@ describe('restoreStoredSessionBinding', () => {
113166 } ,
114167 } )
115168
116- expect ( restored ) . toEqual ( entry )
169+ expect ( restored ) . toEqual ( { status : 'restored' , session : entry } )
117170 expect ( bridge . calls ) . toEqual ( [ 'reset' , 'connect:stored-session' , 'handler' , 'wait' ] )
118171 expect ( cleared ) . toBe ( 1 )
119172 } )
@@ -138,7 +191,7 @@ describe('restoreStoredSessionBinding', () => {
138191 logPrefix : '[Test]' ,
139192 } )
140193
141- expect ( restored ) . toEqual ( entry )
194+ expect ( restored ) . toEqual ( { status : 'restored' , session : entry } )
142195 expect ( checked ) . toBe ( 0 )
143196 expect ( bridge . calls ) . toEqual ( [ ] )
144197 } )
@@ -157,7 +210,7 @@ describe('restoreStoredSessionBinding', () => {
157210 logPrefix : '[Test]' ,
158211 } )
159212
160- expect ( restored ) . toEqual ( entry )
213+ expect ( restored ) . toEqual ( { status : 'restored' , session : entry } )
161214 expect ( bridge . calls ) . toEqual ( [ 'connect:stored-session' , 'handler' , 'wait' ] )
162215 } )
163216} )
0 commit comments