Merge pull request #5498 from element-hq/feature/bma/filterDirectInLeaveSpace

Filter out direct room in the leave space screen.
This commit is contained in:
Benoit Marty 2025-10-09 12:01:32 +02:00 committed by GitHub
commit 891485de50
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 48 additions and 2 deletions

View file

@ -66,7 +66,8 @@ class LeaveSpacePresenter(
.orEmpty()
.partition { it.spaceRoom.roomId == leaveSpaceHandle.id }
// By default select all rooms that can be left
selectedRoomIds = otherRooms
val otherRoomsExcludingDm = otherRooms.filter { it.spaceRoom.isDirect != true }
selectedRoomIds = otherRoomsExcludingDm
.filter { it.isLastAdmin.not() }
.map { it.spaceRoom.roomId }
leaveSpaceRooms = rooms.fold(
@ -74,7 +75,7 @@ class LeaveSpacePresenter(
AsyncData.Success(
LeaveSpaceRooms(
current = currentRoom.firstOrNull(),
others = otherRooms.toImmutableList(),
others = otherRoomsExcludingDm.toImmutableList(),
)
)
},

View file

@ -16,6 +16,7 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_ROOM_ID_2
import io.element.android.libraries.matrix.test.A_ROOM_ID_3
import io.element.android.libraries.matrix.test.A_SPACE_ID
import io.element.android.libraries.matrix.test.A_SPACE_NAME
import io.element.android.libraries.matrix.test.spaces.FakeLeaveSpaceHandle
@ -91,6 +92,50 @@ class LeaveSpacePresenterTest {
}
}
@Test
fun `present - direct rooms are filtered out`() = runTest {
val leaveResult = lambdaRecorder<List<RoomId>, Result<Unit>> { Result.success(Unit) }
val presenter = createLeaveSpacePresenter(
leaveSpaceHandle = FakeLeaveSpaceHandle(
roomsResult = {
Result.success(
listOf(
aLeaveSpaceRoom(spaceRoom = aSpace),
aLeaveSpaceRoom(
spaceRoom = aSpaceRoom(roomId = A_ROOM_ID, isDirect = false)
),
aLeaveSpaceRoom(
spaceRoom = aSpaceRoom(roomId = A_ROOM_ID_2, isDirect = true)
),
aLeaveSpaceRoom(
spaceRoom = aSpaceRoom(roomId = A_ROOM_ID_3, isDirect = null)
),
)
)
},
leaveResult = leaveResult,
)
)
presenter.test {
val state = awaitItem()
assertThat(state.spaceName).isNull()
skipItems(3)
val finalState = awaitItem()
// The current state is not in the sub room list
assertThat(finalState.selectableSpaceRooms.dataOrNull()!!.map { it.spaceRoom.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_3)
assertThat(finalState.selectedRoomsCount).isEqualTo(2)
// Leaving the space will not include the DM
finalState.eventSink(LeaveSpaceEvents.LeaveSpace)
val stateLeaving = awaitItem()
assertThat(stateLeaving.leaveSpaceAction).isEqualTo(AsyncAction.Loading)
val stateLeft = awaitItem()
assertThat(stateLeft.leaveSpaceAction.isSuccess()).isTrue()
leaveResult.assertions().isCalledOnce().with(
value(listOf(A_ROOM_ID, A_ROOM_ID_3))
)
}
}
@Test
fun `present - leave space and sub rooms`() = runTest {
val leaveResult = lambdaRecorder<List<RoomId>, Result<Unit>> { Result.success(Unit) }