Avoid using fixture method in production code.
This commit is contained in:
parent
a4dd30d0b9
commit
ecaeb4b257
5 changed files with 28 additions and 26 deletions
|
|
@ -16,12 +16,12 @@
|
||||||
|
|
||||||
package io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles
|
package io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles
|
||||||
|
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
|
|
||||||
sealed interface ChangeRolesEvent {
|
sealed interface ChangeRolesEvent {
|
||||||
data object ToggleSearchActive : ChangeRolesEvent
|
data object ToggleSearchActive : ChangeRolesEvent
|
||||||
data class QueryChanged(val query: String?) : ChangeRolesEvent
|
data class QueryChanged(val query: String?) : ChangeRolesEvent
|
||||||
data class UserSelectionToggled(val roomMember: RoomMember) : ChangeRolesEvent
|
data class UserSelectionToggled(val matrixUser: MatrixUser) : ChangeRolesEvent
|
||||||
data object Save : ChangeRolesEvent
|
data object Save : ChangeRolesEvent
|
||||||
data object Exit : ChangeRolesEvent
|
data object Exit : ChangeRolesEvent
|
||||||
data object CancelExit : ChangeRolesEvent
|
data object CancelExit : ChangeRolesEvent
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||||
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
|
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
|
||||||
|
import io.element.android.libraries.matrix.api.room.toMatrixUser
|
||||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.services.analytics.api.AnalyticsService
|
import io.element.android.services.analytics.api.AnalyticsService
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
@ -129,11 +130,11 @@ class ChangeRolesPresenter @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
is ChangeRolesEvent.UserSelectionToggled -> {
|
is ChangeRolesEvent.UserSelectionToggled -> {
|
||||||
val newList = selectedUsers.value.toMutableList()
|
val newList = selectedUsers.value.toMutableList()
|
||||||
val index = newList.indexOfFirst { it.userId == event.roomMember.userId }
|
val index = newList.indexOfFirst { it.userId == event.matrixUser.userId }
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
newList.removeAt(index)
|
newList.removeAt(index)
|
||||||
} else {
|
} else {
|
||||||
newList.add(event.roomMember.toMatrixUser())
|
newList.add(event.matrixUser)
|
||||||
}
|
}
|
||||||
selectedUsers.value = newList.toImmutableList()
|
selectedUsers.value = newList.toImmutableList()
|
||||||
}
|
}
|
||||||
|
|
@ -183,12 +184,6 @@ class ChangeRolesPresenter @AssistedInject constructor(
|
||||||
return sortedWith(PowerLevelRoomMemberComparator()).toImmutableList()
|
return sortedWith(PowerLevelRoomMemberComparator()).toImmutableList()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun RoomMember.toMatrixUser() = MatrixUser(
|
|
||||||
userId = userId,
|
|
||||||
displayName = displayName,
|
|
||||||
avatarUrl = avatarUrl,
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun CoroutineScope.save(
|
private fun CoroutineScope.save(
|
||||||
usersWithRole: ImmutableList<MatrixUser>,
|
usersWithRole: ImmutableList<MatrixUser>,
|
||||||
selectedUsers: MutableState<ImmutableList<MatrixUser>>,
|
selectedUsers: MutableState<ImmutableList<MatrixUser>>,
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,6 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.compound.theme.ElementTheme
|
import io.element.android.compound.theme.ElementTheme
|
||||||
import io.element.android.features.roomdetails.impl.R
|
import io.element.android.features.roomdetails.impl.R
|
||||||
import io.element.android.features.roomdetails.impl.members.aRoomMember
|
|
||||||
import io.element.android.libraries.architecture.AsyncAction
|
import io.element.android.libraries.architecture.AsyncAction
|
||||||
import io.element.android.libraries.designsystem.components.ProgressDialog
|
import io.element.android.libraries.designsystem.components.ProgressDialog
|
||||||
import io.element.android.libraries.designsystem.components.async.AsyncActionView
|
import io.element.android.libraries.designsystem.components.async.AsyncActionView
|
||||||
|
|
@ -68,6 +67,7 @@ import io.element.android.libraries.designsystem.theme.components.TextButton
|
||||||
import io.element.android.libraries.designsystem.theme.components.TopAppBar
|
import io.element.android.libraries.designsystem.theme.components.TopAppBar
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||||
|
import io.element.android.libraries.matrix.api.room.toMatrixUser
|
||||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.matrix.ui.components.MatrixUserRow
|
import io.element.android.libraries.matrix.ui.components.MatrixUserRow
|
||||||
import io.element.android.libraries.matrix.ui.components.SelectedUsersRowList
|
import io.element.android.libraries.matrix.ui.components.SelectedUsersRowList
|
||||||
|
|
@ -143,7 +143,7 @@ fun ChangeRolesView(
|
||||||
searchResults = members,
|
searchResults = members,
|
||||||
selectedUsers = state.selectedUsers,
|
selectedUsers = state.selectedUsers,
|
||||||
canRemoveMember = state.canChangeMemberRole,
|
canRemoveMember = state.canChangeMemberRole,
|
||||||
onSelectionToggled = { state.eventSink(ChangeRolesEvent.UserSelectionToggled(it)) },
|
onSelectionToggled = { state.eventSink(ChangeRolesEvent.UserSelectionToggled(it.toMatrixUser())) },
|
||||||
selectedUsersList = {},
|
selectedUsersList = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -159,13 +159,13 @@ fun ChangeRolesView(
|
||||||
searchResults = (state.searchResults as? SearchBarResultState.Results)?.results ?: persistentListOf(),
|
searchResults = (state.searchResults as? SearchBarResultState.Results)?.results ?: persistentListOf(),
|
||||||
selectedUsers = state.selectedUsers,
|
selectedUsers = state.selectedUsers,
|
||||||
canRemoveMember = state.canChangeMemberRole,
|
canRemoveMember = state.canChangeMemberRole,
|
||||||
onSelectionToggled = { state.eventSink(ChangeRolesEvent.UserSelectionToggled(it)) },
|
onSelectionToggled = { state.eventSink(ChangeRolesEvent.UserSelectionToggled(it.toMatrixUser())) },
|
||||||
selectedUsersList = { users ->
|
selectedUsersList = { users ->
|
||||||
SelectedUsersRowList(
|
SelectedUsersRowList(
|
||||||
contentPadding = PaddingValues(start = 16.dp, end = 16.dp, bottom = 16.dp),
|
contentPadding = PaddingValues(start = 16.dp, end = 16.dp, bottom = 16.dp),
|
||||||
selectedUsers = users,
|
selectedUsers = users,
|
||||||
onUserRemoved = {
|
onUserRemoved = {
|
||||||
state.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(it.userId)))
|
state.eventSink(ChangeRolesEvent.UserSelectionToggled(it))
|
||||||
},
|
},
|
||||||
canDeselect = { state.canChangeMemberRole(it.userId) },
|
canDeselect = { state.canChangeMemberRole(it.userId) },
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ import app.cash.molecule.moleculeFlow
|
||||||
import app.cash.turbine.test
|
import app.cash.turbine.test
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import im.vector.app.features.analytics.plan.RoomModeration
|
import im.vector.app.features.analytics.plan.RoomModeration
|
||||||
import io.element.android.features.roomdetails.impl.members.aRoomMember
|
|
||||||
import io.element.android.features.roomdetails.impl.members.aRoomMemberList
|
import io.element.android.features.roomdetails.impl.members.aRoomMemberList
|
||||||
import io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles.ChangeRolesEvent
|
import io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles.ChangeRolesEvent
|
||||||
import io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles.ChangeRolesPresenter
|
import io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles.ChangeRolesPresenter
|
||||||
|
|
@ -30,6 +29,7 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
|
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||||
|
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
|
||||||
import io.element.android.libraries.matrix.test.A_USER_ID_2
|
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.test.room.FakeMatrixRoom
|
||||||
|
|
@ -154,10 +154,10 @@ class ChangeRolesPresenterTests {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.selectedUsers).hasSize(1)
|
assertThat(initialState.selectedUsers).hasSize(1)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
assertThat(awaitItem().selectedUsers).hasSize(2)
|
assertThat(awaitItem().selectedUsers).hasSize(2)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
assertThat(awaitItem().selectedUsers).hasSize(1)
|
assertThat(awaitItem().selectedUsers).hasSize(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -177,13 +177,13 @@ class ChangeRolesPresenterTests {
|
||||||
assertThat(initialState.hasPendingChanges).isFalse()
|
assertThat(initialState.hasPendingChanges).isFalse()
|
||||||
assertThat(initialState.selectedUsers).hasSize(1)
|
assertThat(initialState.selectedUsers).hasSize(1)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
with(awaitItem()) {
|
with(awaitItem()) {
|
||||||
assertThat(selectedUsers).hasSize(2)
|
assertThat(selectedUsers).hasSize(2)
|
||||||
assertThat(hasPendingChanges).isTrue()
|
assertThat(hasPendingChanges).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
with(awaitItem()) {
|
with(awaitItem()) {
|
||||||
assertThat(selectedUsers).hasSize(1)
|
assertThat(selectedUsers).hasSize(1)
|
||||||
assertThat(hasPendingChanges).isFalse()
|
assertThat(hasPendingChanges).isFalse()
|
||||||
|
|
@ -226,7 +226,7 @@ class ChangeRolesPresenterTests {
|
||||||
assertThat(initialState.hasPendingChanges).isFalse()
|
assertThat(initialState.hasPendingChanges).isFalse()
|
||||||
assertThat(initialState.exitState).isEqualTo(AsyncAction.Uninitialized)
|
assertThat(initialState.exitState).isEqualTo(AsyncAction.Uninitialized)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
|
|
||||||
awaitItem().eventSink(ChangeRolesEvent.Exit)
|
awaitItem().eventSink(ChangeRolesEvent.Exit)
|
||||||
val confirmingState = awaitItem()
|
val confirmingState = awaitItem()
|
||||||
|
|
@ -252,7 +252,7 @@ class ChangeRolesPresenterTests {
|
||||||
assertThat(initialState.hasPendingChanges).isFalse()
|
assertThat(initialState.hasPendingChanges).isFalse()
|
||||||
assertThat(initialState.exitState).isEqualTo(AsyncAction.Uninitialized)
|
assertThat(initialState.exitState).isEqualTo(AsyncAction.Uninitialized)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
val updatedState = awaitItem()
|
val updatedState = awaitItem()
|
||||||
assertThat(updatedState.hasPendingChanges).isTrue()
|
assertThat(updatedState.hasPendingChanges).isTrue()
|
||||||
skipItems(1)
|
skipItems(1)
|
||||||
|
|
@ -279,8 +279,7 @@ class ChangeRolesPresenterTests {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.selectedUsers).hasSize(1)
|
assertThat(initialState.selectedUsers).hasSize(1)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
|
|
||||||
awaitItem().eventSink(ChangeRolesEvent.Save)
|
awaitItem().eventSink(ChangeRolesEvent.Save)
|
||||||
val confirmingState = awaitItem()
|
val confirmingState = awaitItem()
|
||||||
assertThat(confirmingState.savingState).isEqualTo(AsyncAction.Confirming)
|
assertThat(confirmingState.savingState).isEqualTo(AsyncAction.Confirming)
|
||||||
|
|
@ -304,7 +303,7 @@ class ChangeRolesPresenterTests {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.selectedUsers).hasSize(1)
|
assertThat(initialState.selectedUsers).hasSize(1)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
|
|
||||||
awaitItem().eventSink(ChangeRolesEvent.Save)
|
awaitItem().eventSink(ChangeRolesEvent.Save)
|
||||||
val confirmingState = awaitItem()
|
val confirmingState = awaitItem()
|
||||||
|
|
@ -334,7 +333,7 @@ class ChangeRolesPresenterTests {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.selectedUsers).hasSize(1)
|
assertThat(initialState.selectedUsers).hasSize(1)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
|
|
||||||
awaitItem().eventSink(ChangeRolesEvent.Save)
|
awaitItem().eventSink(ChangeRolesEvent.Save)
|
||||||
assertThat(awaitItem().savingState).isEqualTo(AsyncAction.Success(Unit))
|
assertThat(awaitItem().savingState).isEqualTo(AsyncAction.Success(Unit))
|
||||||
|
|
@ -357,7 +356,7 @@ class ChangeRolesPresenterTests {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.selectedUsers).hasSize(1)
|
assertThat(initialState.selectedUsers).hasSize(1)
|
||||||
|
|
||||||
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(aRoomMember(A_USER_ID_2)))
|
initialState.eventSink(ChangeRolesEvent.UserSelectionToggled(MatrixUser(A_USER_ID_2)))
|
||||||
|
|
||||||
awaitItem().eventSink(ChangeRolesEvent.Save)
|
awaitItem().eventSink(ChangeRolesEvent.Save)
|
||||||
val failedState = awaitItem()
|
val failedState = awaitItem()
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
package io.element.android.libraries.matrix.api.room
|
package io.element.android.libraries.matrix.api.room
|
||||||
|
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
|
|
||||||
data class RoomMember(
|
data class RoomMember(
|
||||||
val userId: UserId,
|
val userId: UserId,
|
||||||
|
|
@ -78,3 +79,10 @@ enum class RoomMembershipState {
|
||||||
fun RoomMember.getBestName(): String {
|
fun RoomMember.getBestName(): String {
|
||||||
return displayName?.takeIf { it.isNotEmpty() } ?: userId.value
|
return displayName?.takeIf { it.isNotEmpty() } ?: userId.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun RoomMember.toMatrixUser() = MatrixUser(
|
||||||
|
userId = userId,
|
||||||
|
displayName = displayName,
|
||||||
|
avatarUrl = avatarUrl,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue