@@ -89,6 +89,7 @@ function makeMockMx(overrides: Record<string, unknown> = {}) {
8989 store : {
9090 setSyncData : vi . fn ( ) . mockResolvedValue ( undefined ) ,
9191 save : vi . fn ( ) . mockResolvedValue ( undefined ) ,
92+ removeRoom : vi . fn ( ) ,
9293 } ,
9394 ...overrides ,
9495 } as unknown as import ( '$types/matrix-sdk' ) . MatrixClient ;
@@ -169,6 +170,24 @@ describe('SlidingSyncManager — timeline pruning on unsubscribe', () => {
169170 expect ( payload . rooms . join [ '!room:example.com' ] . timeline . limited ) . toBe ( true ) ;
170171 } ) ;
171172
173+ it ( 'evicts room from store cache when persist fails' , async ( ) => {
174+ const room = makeMockRoom ( PRUNE_THRESHOLD + 1 ) ;
175+ const mx = makeMockMx ( { getRoom : vi . fn ( ) . mockReturnValue ( room ) } ) ;
176+ // Make setSyncData reject to simulate an IndexedDB write failure.
177+ (
178+ mx as unknown as { store : { setSyncData : ReturnType < typeof vi . fn > } }
179+ ) . store . setSyncData . mockRejectedValue ( new Error ( 'IndexedDB write failed' ) ) ;
180+ const manager = makeManager ( mx ) ;
181+
182+ manager . unsubscribeFromRoom ( '!room:example.com' ) ;
183+ await flushPromises ( ) ;
184+
185+ const { store } = mx as unknown as {
186+ store : { removeRoom : ReturnType < typeof vi . fn > } ;
187+ } ;
188+ expect ( store . removeRoom ) . toHaveBeenCalledWith ( '!room:example.com' ) ;
189+ } ) ;
190+
172191 it ( 'does not reset when event count equals the threshold exactly' , ( ) => {
173192 const room = makeMockRoom ( PRUNE_THRESHOLD ) ;
174193 const mx = makeMockMx ( { getRoom : vi . fn ( ) . mockReturnValue ( room ) } ) ;
@@ -205,13 +224,16 @@ describe('SlidingSyncManager — membership leave auto-unsubscribe', () => {
205224 mx : ReturnType < typeof makeMockMx > ,
206225 membership : string ,
207226 roomId = '!room:example.com' ,
208- userId = '@user:example.com' ,
227+ userId = '@user:example.com'
209228 ) {
210229 const onCall = ( mx . on as ReturnType < typeof vi . fn > ) . mock . calls . find (
211- ( [ event ] : [ string ] ) => event === 'RoomMember.membership' ,
230+ ( args : unknown [ ] ) => args [ 0 ] === 'RoomMember.membership'
212231 ) ;
213232 if ( ! onCall ) throw new Error ( 'onMembershipLeave listener not registered' ) ;
214- const [ , handler ] = onCall as [ string , ( e : unknown , m : { userId : string ; roomId : string ; membership : string } ) => void ] ;
233+ const [ , handler ] = onCall as [
234+ string ,
235+ ( e : unknown , m : { userId : string ; roomId : string ; membership : string } ) => void ,
236+ ] ;
215237 handler ( undefined , { userId, roomId, membership } ) ;
216238 }
217239
@@ -275,4 +297,3 @@ describe('SlidingSyncManager — membership leave auto-unsubscribe', () => {
275297 expect ( room . _resetLiveTimeline ) . not . toHaveBeenCalled ( ) ;
276298 } ) ;
277299} ) ;
278-
0 commit comments