From bf1bab478c79193414d5179b1d16238d075054e8 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 11 Mar 2026 13:19:40 +0700 Subject: [PATCH] TF-4368 Add the `delete/shrink` regression case and assert the requested limit. --- .../thread_repository_impl_test.dart | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/test/features/thread/data/repository/thread_repository_impl_test.dart b/test/features/thread/data/repository/thread_repository_impl_test.dart index 0298f2d5c..95599ea89 100644 --- a/test/features/thread/data/repository/thread_repository_impl_test.dart +++ b/test/features/thread/data/repository/thread_repository_impl_test.dart @@ -1367,10 +1367,89 @@ void main() { }, ); + test( + 'should fetch first page with defaultLimit after changes shrink current list', + () async { + final cacheEmails = List.generate( + ThreadConstants.defaultLimit.value.toInt(), + (i) => Email(id: EmailId(Id('cache_$i'))), + ); + + final cacheAfterDestroyed = cacheEmails.skip(5).toList(); + + final destroyedIds = List.generate( + 5, + (i) => EmailId(Id('cache_$i')), + ); + + int cacheCall = 0; + + when(localDataSource.getAllEmailCache( + any, + any, + filterOption: anyNamed('filterOption'), + inMailboxId: anyNamed('inMailboxId'), + limit: anyNamed('limit'), + sort: anyNamed('sort'), + )).thenAnswer((_) async { + cacheCall++; + return cacheCall == 1 ? cacheEmails : cacheAfterDestroyed; + }); + + when(refreshChangesStateDataSource.getState(any, any, any)) + .thenAnswer((_) async => State('cache_state')); + + when(networkDataSource.getChanges( + any, + any, + any, + propertiesCreated: anyNamed('propertiesCreated'), + propertiesUpdated: anyNamed('propertiesUpdated'), + )).thenAnswer((_) async => EmailChangeResponse( + hasMoreChanges: false, + destroyed: destroyedIds, + newStateEmail: State('new_state'), + )); + + when(networkDataSource.getAllEmail( + any, + any, + limit: anyNamed('limit'), + position: anyNamed('position'), + sort: anyNamed('sort'), + filter: anyNamed('filter'), + properties: anyNamed('properties'), + )).thenAnswer((_) async => EmailsResponse( + emailList: [], + state: State('network_state'), + )); + + await refreshChangesThreadRepository + .refreshChanges( + SessionFixtures.aliceSession, + AccountFixtures.aliceAccountId, + State('initial'), + ) + .first; + + final capturedLimit = verify(networkDataSource.getAllEmail( + any, + any, + limit: captureAnyNamed('limit'), + position: anyNamed('position'), + sort: anyNamed('sort'), + filter: anyNamed('filter'), + properties: anyNamed('properties'), + )).captured.single; + + expect(capturedLimit, ThreadConstants.defaultLimit); + }, + ); + tearDown(() { reset(networkDataSource); reset(localDataSource); - reset(stateDataSource); + reset(refreshChangesStateDataSource); }); }); }