From 4ecc31d156c37dd415f9c386249d0c222c8c0065 Mon Sep 17 00:00:00 2001 From: VelikovPetar Date: Mon, 9 Mar 2026 16:40:09 +0100 Subject: [PATCH] Ensure SyncManager respects messageLimit and memberLimit when restoring channel queries Co-Authored-By: Claude --- .../internal/QueryChannelsLogic.kt | 9 +-- .../internal/QueryChannelsLogicTest.kt | 58 +++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt index 55837a05359..e4923cea0e7 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt @@ -32,8 +32,6 @@ import io.getstream.log.taggedLogger import io.getstream.result.Result import kotlinx.coroutines.flow.StateFlow -private const val MESSAGE_LIMIT = 1 -private const val MEMBER_LIMIT = 30 private const val INITIAL_CHANNEL_OFFSET = 0 private const val CHANNEL_LIMIT = 30 @@ -154,13 +152,16 @@ internal class QueryChannelsLogic( */ internal suspend fun queryFirstPage(): Result> { logger.d { "[queryFirstPage] no args" } + val currentRequest = queryChannelsStateLogic.getState().currentRequest.value + val messageLimit = currentRequest?.messageLimit + val memberLimit = currentRequest?.memberLimit val request = QueryChannelsRequest( filter = filter, offset = INITIAL_CHANNEL_OFFSET, limit = CHANNEL_LIMIT, querySort = sort, - messageLimit = MESSAGE_LIMIT, - memberLimit = MEMBER_LIMIT, + messageLimit = messageLimit, + memberLimit = memberLimit, ) queryChannelsStateLogic.setCurrentRequest(request) diff --git a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt index b942afa0f5e..7e2f38c0f1f 100644 --- a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt +++ b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt @@ -17,6 +17,7 @@ package io.getstream.chat.android.state.plugin.logic.querychannels.internal import io.getstream.chat.android.client.ChatClient +import io.getstream.chat.android.client.api.models.QueryChannelsRequest import io.getstream.chat.android.client.query.QueryChannelsSpec import io.getstream.chat.android.client.query.pagination.AnyChannelPaginationRequest import io.getstream.chat.android.models.Channel @@ -26,6 +27,7 @@ import io.getstream.chat.android.models.querysort.QuerySortByField import io.getstream.chat.android.randomChannel import io.getstream.chat.android.state.plugin.state.querychannels.QueryChannelsState import io.getstream.chat.android.test.TestCoroutineRule +import io.getstream.chat.android.test.asCall import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -65,6 +67,7 @@ internal class QueryChannelsLogicTest { whenever(queryChannelsStateLogic.getState()) doReturn queryChannelsState whenever(queryChannelsState.recoveryNeeded) doReturn MutableStateFlow(false) + whenever(queryChannelsState.currentRequest) doReturn MutableStateFlow(null) whenever(queryChannelsStateLogic.getQuerySpecs()) doReturn queryChannelsSpec logic = QueryChannelsLogic( @@ -225,4 +228,59 @@ internal class QueryChannelsLogicTest { verify(queryChannelsStateLogic).addChannelsState(cachedChannels) verify(queryChannelsDatabaseLogic).insertQueryChannels(queryChannelsSpec) } + + // region queryFirstPage + + @Test + fun `queryFirstPage uses null messageLimit and memberLimit when no prior request exists`() = runTest { + // Given - currentRequest is null (default from setUp) + whenever(client.queryChannelsInternal(any())) + .thenReturn(emptyList().asCall()) + + // When + logic.queryFirstPage() + + // Then + val expectedRequest = QueryChannelsRequest( + filter = filter, + offset = 0, + limit = 30, + querySort = sort, + messageLimit = null, + memberLimit = null, + ) + verify(client).queryChannelsInternal(expectedRequest) + } + + @Test + fun `queryFirstPage uses messageLimit and memberLimit from prior request`() = runTest { + // Given + val priorRequest = QueryChannelsRequest( + filter = filter, + offset = 0, + limit = 30, + querySort = sort, + messageLimit = 5, + memberLimit = 50, + ) + whenever(queryChannelsState.currentRequest) doReturn MutableStateFlow(priorRequest) + whenever(client.queryChannelsInternal(any())) + .thenReturn(emptyList().asCall()) + + // When + logic.queryFirstPage() + + // Then + val expectedRequest = QueryChannelsRequest( + filter = filter, + offset = 0, + limit = 30, + querySort = sort, + messageLimit = 5, + memberLimit = 50, + ) + verify(client).queryChannelsInternal(expectedRequest) + } + + // endregion }