From 60d015596fe90c06f81708ae649d5c5edd53825e Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 5 Jan 2024 13:44:59 +0100 Subject: [PATCH] MatrixUserRepo : fix tests --- .../userlist/DefaultUserListPresenterTests.kt | 38 +++++++++++++------ .../invite/RoomInviteMembersPresenterTest.kt | 13 ++++--- .../usersearch/api/UserRepository.kt | 2 +- .../usersearch/api/UserSearchResult.kt | 4 +- .../usersearch/impl/MatrixUserRepository.kt | 10 ++--- .../usersearch/test/FakeUserRepository.kt | 8 ++-- 6 files changed, 45 insertions(+), 30 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 7f5eff5c30..8b0caf7d66 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,6 +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.test.FakeUserRepository import io.element.android.tests.testutils.WarmUpRule import kotlinx.collections.immutable.persistentListOf @@ -136,20 +137,33 @@ class DefaultUserListPresenterTests { skipItems(2) // When the user repository emits a result, it's copied to the state - userRepository.emitResult(listOf(UserSearchResult(aMatrixUser()))) - assertThat(awaitItem().searchResults).isEqualTo( - SearchBarResultState.Results( - persistentListOf(UserSearchResult(aMatrixUser())) - ) + val result = UserSearchResults( + results = listOf(UserSearchResult(aMatrixUser())), + isFetchingSearchResults = false, ) - + userRepository.emitResult(result) + awaitItem().also { state -> + assertThat(state.searchResults).isEqualTo( + SearchBarResultState.Results( + persistentListOf(UserSearchResult(aMatrixUser())) + ) + ) + assertThat(state.isFetchingSearchResults).isFalse() + } // When the user repository emits another result, it replaces the previous value - userRepository.emitResult(aMatrixUserList().map { UserSearchResult(it) }) - assertThat(awaitItem().searchResults).isEqualTo( - SearchBarResultState.Results( - aMatrixUserList().map { UserSearchResult(it) } - ) + val newResult = UserSearchResults( + results = aMatrixUserList().map { UserSearchResult(it) }, + isFetchingSearchResults = false, ) + userRepository.emitResult(newResult) + awaitItem().also { state -> + assertThat(state.searchResults).isEqualTo( + SearchBarResultState.Results( + aMatrixUserList().map { UserSearchResult(it) } + ) + ) + assertThat(state.isFetchingSearchResults).isFalse() + } } } @@ -175,7 +189,7 @@ class DefaultUserListPresenterTests { skipItems(2) // When the results list is empty, the state is set to NoResults - userRepository.emitResult(emptyList()) + userRepository.emitResult(UserSearchResults(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 7ecdccf7f1..3c801d9581 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 @@ -35,6 +35,7 @@ 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.test.FakeUserRepository import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.testCoroutineDispatchers @@ -111,7 +112,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(emptyList()) + repository.emitResult(UserSearchResults(results = emptyList())) skipItems(1) val resultState = awaitItem() @@ -137,7 +138,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(aMatrixUserList().map { UserSearchResult(it) }) + repository.emitResult(UserSearchResults(results =aMatrixUserList().map { UserSearchResult(it) })) skipItems(1) val resultState = awaitItem() @@ -189,7 +190,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult(aMatrixUserList().map { UserSearchResult(it) }) + repository.emitResult(UserSearchResults(results =aMatrixUserList().map { UserSearchResult(it) })) skipItems(1) val resultState = awaitItem() @@ -250,7 +251,7 @@ internal class RoomInviteMembersPresenterTest { assertThat(repository.providedQuery).isEqualTo("some query") val unresolvedUser = UserSearchResult(aMatrixUser(id = A_USER_ID.value), isUnresolved = true) - repository.emitResult(listOf(unresolvedUser) + aMatrixUserList().map { UserSearchResult(it) }) + repository.emitResult(UserSearchResults(results = listOf(unresolvedUser) + aMatrixUserList().map { UserSearchResult(it) })) skipItems(1) val resultState = awaitItem() @@ -318,7 +319,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult((aMatrixUserList() + selectedUser).map { UserSearchResult(it) }) + repository.emitResult(UserSearchResults(results = (aMatrixUserList() + selectedUser).map { UserSearchResult(it) })) skipItems(2) val resultState = awaitItem() @@ -358,7 +359,7 @@ internal class RoomInviteMembersPresenterTest { skipItems(1) assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitResult((aMatrixUserList() + selectedUser).map { UserSearchResult(it) }) + repository.emitResult(UserSearchResults(results =(aMatrixUserList() + selectedUser).map { UserSearchResult(it) })) skipItems(2) // And then a user is toggled 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 9b0af6d2b0..4108788cff 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 c3f7b7b966..95ede55f0c 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 UserSearchResultsState( +data class UserSearchResults( val results: List, - val isFetchingSearchResults: Boolean + val isFetchingSearchResults: Boolean = false, ) 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 ca06a6e83a..431f452cd9 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.UserSearchResultsState +import io.element.android.libraries.usersearch.api.UserSearchResults 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(UserSearchResultsState(isFetchingSearchResults = shouldFetchSearchResults, results = listOfNotNull(fakeSearchResult))) + emit(UserSearchResults(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): UserSearchResultsState { + private suspend fun fetchSearchResults(query: String, shouldQueryProfile: Boolean): UserSearchResults { // Debounce delay(DEBOUNCE_TIME_MILLIS) val results = dataSource @@ -73,7 +73,7 @@ class MatrixUserRepository @Inject constructor( ?: UserSearchResult(MatrixUser(UserId(query)), isUnresolved = true)) } - return UserSearchResultsState(results = results, isFetchingSearchResults = false) + return UserSearchResults(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 0911d86b36..e21c48a48b 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.UserSearchResult +import io.element.android.libraries.usersearch.api.UserSearchResults import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow @@ -26,14 +26,14 @@ class FakeUserRepository : UserRepository { var providedQuery: String? = null private set - private val flow = MutableSharedFlow>() + private val flow = MutableSharedFlow() - override suspend fun search(query: String): Flow> { + override fun search(query: String): Flow { providedQuery = query return flow } - suspend fun emitResult(result: List) { + suspend fun emitResult(result: UserSearchResults) { flow.emit(result) }