From dbfa9b0dc6e51f198d84f04f7f306e0a2d705eac Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 5 Jan 2024 15:28:18 +0100 Subject: [PATCH] Rename UserSearchResults as UserSearchResultState --- .../userlist/DefaultUserListPresenterTests.kt | 12 +++--- .../invite/RoomInviteMembersPresenterTest.kt | 38 +++++++++++++++---- .../usersearch/api/UserRepository.kt | 2 +- .../usersearch/api/UserSearchResult.kt | 4 +- .../usersearch/impl/MatrixUserRepository.kt | 10 ++--- .../usersearch/test/FakeUserRepository.kt | 10 ++--- 6 files changed, 49 insertions(+), 27 deletions(-) diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenterTests.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenterTests.kt index 8b0caf7d66..219a252b7b 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenterTests.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenterTests.kt @@ -24,7 +24,7 @@ import io.element.android.libraries.designsystem.theme.components.SearchBarResul import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.matrix.ui.components.aMatrixUserList import io.element.android.libraries.usersearch.api.UserSearchResult -import io.element.android.libraries.usersearch.api.UserSearchResults +import io.element.android.libraries.usersearch.api.UserSearchResultState import io.element.android.libraries.usersearch.test.FakeUserRepository import io.element.android.tests.testutils.WarmUpRule import kotlinx.collections.immutable.persistentListOf @@ -137,11 +137,11 @@ class DefaultUserListPresenterTests { skipItems(2) // When the user repository emits a result, it's copied to the state - val result = UserSearchResults( + val result = UserSearchResultState( results = listOf(UserSearchResult(aMatrixUser())), isFetchingSearchResults = false, ) - userRepository.emitResult(result) + userRepository.emitState(result) awaitItem().also { state -> assertThat(state.searchResults).isEqualTo( SearchBarResultState.Results( @@ -151,11 +151,11 @@ class DefaultUserListPresenterTests { assertThat(state.isFetchingSearchResults).isFalse() } // When the user repository emits another result, it replaces the previous value - val newResult = UserSearchResults( + val newResult = UserSearchResultState( results = aMatrixUserList().map { UserSearchResult(it) }, isFetchingSearchResults = false, ) - userRepository.emitResult(newResult) + userRepository.emitState(newResult) awaitItem().also { state -> assertThat(state.searchResults).isEqualTo( SearchBarResultState.Results( @@ -189,7 +189,7 @@ class DefaultUserListPresenterTests { skipItems(2) // When the results list is empty, the state is set to NoResults - userRepository.emitResult(UserSearchResults(results = emptyList(), isFetchingSearchResults = false)) + userRepository.emitState(UserSearchResultState(results = emptyList(), isFetchingSearchResults = false)) assertThat(awaitItem().searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java) } } diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenterTest.kt index fb36722f59..60ba78c725 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenterTest.kt @@ -29,13 +29,14 @@ import io.element.android.libraries.designsystem.theme.components.SearchBarResul import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.room.FakeMatrixRoom import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.matrix.ui.components.aMatrixUserList import io.element.android.libraries.usersearch.api.UserSearchResult -import io.element.android.libraries.usersearch.api.UserSearchResults +import io.element.android.libraries.usersearch.api.UserSearchResultState import io.element.android.libraries.usersearch.test.FakeUserRepository import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.consumeItemsUntilPredicate @@ -109,12 +110,12 @@ internal class RoomInviteMembersPresenterTest { val initialState = awaitItem() initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(UserSearchResults(results = emptyList(), isFetchingSearchResults = true)) + repository.emitState(UserSearchResultState(results = emptyList(), isFetchingSearchResults = true)) consumeItemsUntilPredicate { it.isFetchingSearchResults }.last().also { state -> assertThat(state.searchResults).isInstanceOf(SearchBarResultState.Empty::class.java) assertThat(state.isFetchingSearchResults).isTrue() } - repository.emitResult(UserSearchResults(results = emptyList(), isFetchingSearchResults = false)) + repository.emitState(results = emptyList(), isFetchingSearchResults = false) consumeItemsUntilPredicate { !it.isFetchingSearchResults }.last().also { state -> assertThat(state.searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java) assertThat(state.isFetchingSearchResults).isFalse() @@ -140,7 +141,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(UserSearchResults(results =aMatrixUserList().map { UserSearchResult(it) })) + repository.emitStateWithUsers(users = aMatrixUserList()) skipItems(1) val resultState = awaitItem() @@ -192,7 +193,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(UserSearchResults(results =aMatrixUserList().map { UserSearchResult(it) })) + repository.emitStateWithUsers(users = aMatrixUserList()) skipItems(1) val resultState = awaitItem() @@ -253,7 +254,7 @@ internal class RoomInviteMembersPresenterTest { assertThat(repository.providedQuery).isEqualTo("some query") val unresolvedUser = UserSearchResult(aMatrixUser(id = A_USER_ID.value), isUnresolved = true) - repository.emitResult(UserSearchResults(results = listOf(unresolvedUser) + aMatrixUserList().map { UserSearchResult(it) })) + repository.emitState(listOf(unresolvedUser) + aMatrixUserList().map { UserSearchResult(it) }) skipItems(1) val resultState = awaitItem() @@ -321,7 +322,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(UserSearchResults(results = (aMatrixUserList() + selectedUser).map { UserSearchResult(it) })) + repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) skipItems(2) val resultState = awaitItem() @@ -361,7 +362,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(UserSearchResults(results =(aMatrixUserList() + selectedUser).map { UserSearchResult(it) })) + repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) skipItems(2) // And then a user is toggled @@ -384,6 +385,27 @@ internal class RoomInviteMembersPresenterTest { } } + private suspend fun FakeUserRepository.emitStateWithUsers( + users: List, + isFetchingSearchResults: Boolean = false + ) { + emitState( + results = users.map { UserSearchResult(it) }, + isFetchingSearchResults = isFetchingSearchResults, + ) + } + + private suspend fun FakeUserRepository.emitState( + results: List, + isFetchingSearchResults: Boolean = false + ) { + val state = UserSearchResultState( + results = results, + isFetchingSearchResults = isFetchingSearchResults + ) + emitState(state) + } + private fun TestScope.createDataSource( matrixRoom: MatrixRoom = aMatrixRoom().apply { givenRoomMembersState(MatrixRoomMembersState.Ready(aRoomMemberList())) diff --git a/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserRepository.kt b/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserRepository.kt index 4108788cff..ed019fc5a5 100644 --- a/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserRepository.kt +++ b/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserRepository.kt @@ -20,5 +20,5 @@ import kotlinx.coroutines.flow.Flow interface UserRepository { - fun search(query: String): Flow + fun search(query: String): Flow } diff --git a/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserSearchResult.kt b/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserSearchResult.kt index 95ede55f0c..ebdfb7fedb 100644 --- a/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserSearchResult.kt +++ b/libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserSearchResult.kt @@ -23,7 +23,7 @@ data class UserSearchResult( val isUnresolved: Boolean = false, ) -data class UserSearchResults( +data class UserSearchResultState( val results: List, - val isFetchingSearchResults: Boolean = false, + val isFetchingSearchResults: Boolean, ) diff --git a/libraries/usersearch/impl/src/main/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepository.kt b/libraries/usersearch/impl/src/main/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepository.kt index 02a03f8be4..7ac3ec8380 100644 --- a/libraries/usersearch/impl/src/main/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepository.kt +++ b/libraries/usersearch/impl/src/main/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepository.kt @@ -25,7 +25,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.usersearch.api.UserListDataSource import io.element.android.libraries.usersearch.api.UserRepository import io.element.android.libraries.usersearch.api.UserSearchResult -import io.element.android.libraries.usersearch.api.UserSearchResults +import io.element.android.libraries.usersearch.api.UserSearchResultState import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow @@ -37,7 +37,7 @@ class MatrixUserRepository @Inject constructor( private val dataSource: UserListDataSource ) : UserRepository { - override fun search(query: String): Flow = flow { + override fun search(query: String): Flow = flow { val shouldQueryProfile = MatrixPatterns.isUserId(query) && !client.isMe(UserId(query)) val shouldFetchSearchResults = query.length >= MINIMUM_SEARCH_LENGTH // If the search term is a MXID that's not ours, we'll show a 'fake' result for that user, then update it when we get search results. @@ -47,7 +47,7 @@ class MatrixUserRepository @Inject constructor( null } if (shouldQueryProfile || shouldFetchSearchResults) { - emit(UserSearchResults(isFetchingSearchResults = shouldFetchSearchResults, results = listOfNotNull(fakeSearchResult))) + emit(UserSearchResultState(isFetchingSearchResults = shouldFetchSearchResults, results = listOfNotNull(fakeSearchResult))) } if (shouldFetchSearchResults) { val results = fetchSearchResults(query, shouldQueryProfile) @@ -55,7 +55,7 @@ class MatrixUserRepository @Inject constructor( } } - private suspend fun fetchSearchResults(query: String, shouldQueryProfile: Boolean): UserSearchResults { + private suspend fun fetchSearchResults(query: String, shouldQueryProfile: Boolean): UserSearchResultState { // Debounce delay(DEBOUNCE_TIME_MILLIS) val results = dataSource @@ -73,7 +73,7 @@ class MatrixUserRepository @Inject constructor( ?: UserSearchResult(MatrixUser(UserId(query)), isUnresolved = true)) } - return UserSearchResults(results = results, isFetchingSearchResults = false) + return UserSearchResultState(results = results, isFetchingSearchResults = false) } companion object { diff --git a/libraries/usersearch/test/src/main/kotlin/io/element/android/libraries/usersearch/test/FakeUserRepository.kt b/libraries/usersearch/test/src/main/kotlin/io/element/android/libraries/usersearch/test/FakeUserRepository.kt index e21c48a48b..3ca2320a26 100644 --- a/libraries/usersearch/test/src/main/kotlin/io/element/android/libraries/usersearch/test/FakeUserRepository.kt +++ b/libraries/usersearch/test/src/main/kotlin/io/element/android/libraries/usersearch/test/FakeUserRepository.kt @@ -17,7 +17,7 @@ package io.element.android.libraries.usersearch.test import io.element.android.libraries.usersearch.api.UserRepository -import io.element.android.libraries.usersearch.api.UserSearchResults +import io.element.android.libraries.usersearch.api.UserSearchResultState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow @@ -26,15 +26,15 @@ class FakeUserRepository : UserRepository { var providedQuery: String? = null private set - private val flow = MutableSharedFlow() + private val flow = MutableSharedFlow() - override fun search(query: String): Flow { + override fun search(query: String): Flow { providedQuery = query return flow } - suspend fun emitResult(result: UserSearchResults) { - flow.emit(result) + suspend fun emitState(state: UserSearchResultState) { + flow.emit(state) } }