SpaceEvents -> SpaceEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:26:02 +02:00
parent 15cdd85357
commit d07eba9a20
7 changed files with 100 additions and 100 deletions
@@ -11,21 +11,21 @@ package io.element.android.features.space.impl.root
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.spaces.SpaceRoom import io.element.android.libraries.matrix.api.spaces.SpaceRoom
sealed interface SpaceEvents { sealed interface SpaceEvent {
data object LoadMore : SpaceEvents data object LoadMore : SpaceEvent
data class Join(val spaceRoom: SpaceRoom) : SpaceEvents data class Join(val spaceRoom: SpaceRoom) : SpaceEvent
data object ClearFailures : SpaceEvents data object ClearFailures : SpaceEvent
data class AcceptInvite(val spaceRoom: SpaceRoom) : SpaceEvents data class AcceptInvite(val spaceRoom: SpaceRoom) : SpaceEvent
data class DeclineInvite(val spaceRoom: SpaceRoom) : SpaceEvents data class DeclineInvite(val spaceRoom: SpaceRoom) : SpaceEvent
data class ShowTopicViewer(val topic: String) : SpaceEvents data class ShowTopicViewer(val topic: String) : SpaceEvent
data object HideTopicViewer : SpaceEvents data object HideTopicViewer : SpaceEvent
// Manage mode events // Manage mode events
data object EnterManageMode : SpaceEvents data object EnterManageMode : SpaceEvent
data object ExitManageMode : SpaceEvents data object ExitManageMode : SpaceEvent
data class ToggleRoomSelection(val roomId: RoomId) : SpaceEvents data class ToggleRoomSelection(val roomId: RoomId) : SpaceEvent
data object ConfirmRoomRemoval : SpaceEvents data object ConfirmRoomRemoval : SpaceEvent
data object RemoveSelectedRooms : SpaceEvents data object RemoveSelectedRooms : SpaceEvent
data object ClearRemoveAction : SpaceEvents data object ClearRemoveAction : SpaceEvent
} }
@@ -150,51 +150,51 @@ class SpacePresenter(
} }
} }
fun handleEvent(event: SpaceEvents) { fun handleEvent(event: SpaceEvent) {
when (event) { when (event) {
// SpaceRoomList is loaded automatically as backend is really slow. Event is kept for future. // SpaceRoomList is loaded automatically as backend is really slow. Event is kept for future.
SpaceEvents.LoadMore -> Unit SpaceEvent.LoadMore -> Unit
is SpaceEvents.Join -> { is SpaceEvent.Join -> {
sessionCoroutineScope.joinRoom(event.spaceRoom, joinActions, setJoinActions) sessionCoroutineScope.joinRoom(event.spaceRoom, joinActions, setJoinActions)
} }
SpaceEvents.ClearFailures -> { SpaceEvent.ClearFailures -> {
val failedActions = joinActions val failedActions = joinActions
.filterValues { it is AsyncAction.Failure } .filterValues { it is AsyncAction.Failure }
.mapValues { AsyncAction.Uninitialized } .mapValues { AsyncAction.Uninitialized }
setJoinActions(joinActions + failedActions) setJoinActions(joinActions + failedActions)
} }
is SpaceEvents.AcceptInvite -> { is SpaceEvent.AcceptInvite -> {
acceptDeclineInviteState.eventSink( acceptDeclineInviteState.eventSink(
AcceptDeclineInviteEvent.AcceptInvite(event.spaceRoom.toInviteData()) AcceptDeclineInviteEvent.AcceptInvite(event.spaceRoom.toInviteData())
) )
} }
is SpaceEvents.DeclineInvite -> { is SpaceEvent.DeclineInvite -> {
acceptDeclineInviteState.eventSink( acceptDeclineInviteState.eventSink(
AcceptDeclineInviteEvent.DeclineInvite(invite = event.spaceRoom.toInviteData(), shouldConfirm = true, blockUser = false) AcceptDeclineInviteEvent.DeclineInvite(invite = event.spaceRoom.toInviteData(), shouldConfirm = true, blockUser = false)
) )
} }
SpaceEvents.HideTopicViewer -> topicViewerState = TopicViewerState.Hidden SpaceEvent.HideTopicViewer -> topicViewerState = TopicViewerState.Hidden
is SpaceEvents.ShowTopicViewer -> topicViewerState = TopicViewerState.Shown(event.topic) is SpaceEvent.ShowTopicViewer -> topicViewerState = TopicViewerState.Shown(event.topic)
// Manage mode events // Manage mode events
SpaceEvents.EnterManageMode -> { SpaceEvent.EnterManageMode -> {
isManageMode = true isManageMode = true
selectedRoomIds = emptySet() selectedRoomIds = emptySet()
} }
SpaceEvents.ExitManageMode -> { SpaceEvent.ExitManageMode -> {
localCoroutineScope.launch { exitManageMode(shouldReset = removedRoomIds.isNotEmpty()) } localCoroutineScope.launch { exitManageMode(shouldReset = removedRoomIds.isNotEmpty()) }
} }
is SpaceEvents.ToggleRoomSelection -> { is SpaceEvent.ToggleRoomSelection -> {
selectedRoomIds = if (event.roomId in selectedRoomIds) { selectedRoomIds = if (event.roomId in selectedRoomIds) {
selectedRoomIds - event.roomId selectedRoomIds - event.roomId
} else { } else {
selectedRoomIds + event.roomId selectedRoomIds + event.roomId
} }
} }
SpaceEvents.RemoveSelectedRooms -> { SpaceEvent.RemoveSelectedRooms -> {
removeRoomsAction = AsyncAction.ConfirmingNoParams removeRoomsAction = AsyncAction.ConfirmingNoParams
} }
SpaceEvents.ConfirmRoomRemoval -> { SpaceEvent.ConfirmRoomRemoval -> {
localCoroutineScope.launch { localCoroutineScope.launch {
removeRoomsAction = AsyncAction.Loading removeRoomsAction = AsyncAction.Loading
val spaceId = spaceRoomList.spaceId val spaceId = spaceRoomList.spaceId
@@ -219,7 +219,7 @@ class SpacePresenter(
} }
} }
} }
SpaceEvents.ClearRemoveAction -> { SpaceEvent.ClearRemoveAction -> {
removeRoomsAction = AsyncAction.Uninitialized removeRoomsAction = AsyncAction.Uninitialized
} }
} }
@@ -32,7 +32,7 @@ data class SpaceState(
val selectedRoomIds: ImmutableSet<RoomId>, val selectedRoomIds: ImmutableSet<RoomId>,
val canEditSpaceGraph: Boolean, val canEditSpaceGraph: Boolean,
val removeRoomsAction: AsyncAction<Unit>, val removeRoomsAction: AsyncAction<Unit>,
val eventSink: (SpaceEvents) -> Unit val eventSink: (SpaceEvent) -> Unit
) { ) {
fun isJoining(spaceId: RoomId): Boolean = joinActions[spaceId] == AsyncAction.Loading fun isJoining(spaceId: RoomId): Boolean = joinActions[spaceId] == AsyncAction.Loading
fun isSelected(spaceId: RoomId): Boolean = selectedRoomIds.contains(spaceId) fun isSelected(spaceId: RoomId): Boolean = selectedRoomIds.contains(spaceId)
@@ -80,7 +80,7 @@ fun aSpaceState(
selectedRoomIds: Set<RoomId> = emptySet(), selectedRoomIds: Set<RoomId> = emptySet(),
canManageRooms: Boolean = true, canManageRooms: Boolean = true,
removeRoomsAction: AsyncAction<Unit> = AsyncAction.Uninitialized, removeRoomsAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (SpaceEvents) -> Unit = { }, eventSink: (SpaceEvent) -> Unit = { },
) = SpaceState( ) = SpaceState(
spaceInfo = spaceInfo, spaceInfo = spaceInfo,
children = children.toImmutableList(), children = children.toImmutableList(),
@@ -114,7 +114,7 @@ fun SpaceView(
var handledBack by remember { mutableStateOf(false) } var handledBack by remember { mutableStateOf(false) }
BackHandler(enabled = !handledBack) { BackHandler(enabled = !handledBack) {
if (state.isManageMode) { if (state.isManageMode) {
state.eventSink(SpaceEvents.ExitManageMode) state.eventSink(SpaceEvent.ExitManageMode)
} else { } else {
handledBack = true handledBack = true
onBackClick() onBackClick()
@@ -133,8 +133,8 @@ fun SpaceView(
ManageModeTopBar( ManageModeTopBar(
selectedCount = state.selectedCount, selectedCount = state.selectedCount,
isRemoveButtonEnabled = state.isRemoveButtonEnabled, isRemoveButtonEnabled = state.isRemoveButtonEnabled,
onCancelClick = { state.eventSink(SpaceEvents.ExitManageMode) }, onCancelClick = { state.eventSink(SpaceEvent.ExitManageMode) },
onRemoveClick = { state.eventSink(SpaceEvents.RemoveSelectedRooms) }, onRemoveClick = { state.eventSink(SpaceEvent.RemoveSelectedRooms) },
) )
} }
AnimatedVisibility( AnimatedVisibility(
@@ -152,7 +152,7 @@ fun SpaceView(
onSettingsClick = onSettingsClick, onSettingsClick = onSettingsClick,
onShareSpace = onShareSpace, onShareSpace = onShareSpace,
onViewMembersClick = onViewMembersClick, onViewMembersClick = onViewMembersClick,
onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) }, onManageRoomsClick = { state.eventSink(SpaceEvent.EnterManageMode) },
onAddRoomClick = onAddRoomClick, onAddRoomClick = onAddRoomClick,
onCreateRoomClick = onCreateRoomClick, onCreateRoomClick = onCreateRoomClick,
) )
@@ -168,13 +168,13 @@ fun SpaceView(
state = state, state = state,
onRoomClick = { spaceRoom -> onRoomClick = { spaceRoom ->
if (state.isManageMode) { if (state.isManageMode) {
state.eventSink(SpaceEvents.ToggleRoomSelection(spaceRoom.roomId)) state.eventSink(SpaceEvent.ToggleRoomSelection(spaceRoom.roomId))
} else { } else {
onRoomClick(spaceRoom) onRoomClick(spaceRoom)
} }
}, },
onTopicClick = { topic -> onTopicClick = { topic ->
state.eventSink(SpaceEvents.ShowTopicViewer(topic)) state.eventSink(SpaceEvent.ShowTopicViewer(topic))
}, },
onCreateRoomClick = onCreateRoomClick, onCreateRoomClick = onCreateRoomClick,
onAddRoomClick = onAddRoomClick, onAddRoomClick = onAddRoomClick,
@@ -187,8 +187,8 @@ fun SpaceView(
spaceDisplayName = state.spaceInfo.name ?: state.spaceInfo.id.value, spaceDisplayName = state.spaceInfo.name ?: state.spaceInfo.id.value,
removeRoomsAction = state.removeRoomsAction, removeRoomsAction = state.removeRoomsAction,
selectedCount = state.selectedCount, selectedCount = state.selectedCount,
onConfirm = { state.eventSink(SpaceEvents.ConfirmRoomRemoval) }, onConfirm = { state.eventSink(SpaceEvent.ConfirmRoomRemoval) },
onDismiss = { state.eventSink(SpaceEvents.ClearRemoveAction) }, onDismiss = { state.eventSink(SpaceEvent.ClearRemoveAction) },
) )
acceptDeclineInviteView() acceptDeclineInviteView()
} }
@@ -198,7 +198,7 @@ fun SpaceView(
TopicViewerBottomSheet( TopicViewerBottomSheet(
topicViewerState = state.topicViewerState, topicViewerState = state.topicViewerState,
onDismiss = { onDismiss = {
state.eventSink(SpaceEvents.HideTopicViewer) state.eventSink(SpaceEvent.HideTopicViewer)
} }
) )
} }
@@ -207,7 +207,7 @@ fun SpaceView(
@Composable @Composable
private fun JoinFailuresEffect( private fun JoinFailuresEffect(
hasAnyFailure: Boolean, hasAnyFailure: Boolean,
eventSink: (SpaceEvents) -> Unit, eventSink: (SpaceEvent) -> Unit,
) { ) {
val asyncIndicatorState = rememberAsyncIndicatorState() val asyncIndicatorState = rememberAsyncIndicatorState()
val updatedEventSink by rememberUpdatedState(eventSink) val updatedEventSink by rememberUpdatedState(eventSink)
@@ -218,7 +218,7 @@ private fun JoinFailuresEffect(
AsyncIndicator.Failure(text = stringResource(CommonStrings.common_something_went_wrong)) AsyncIndicator.Failure(text = stringResource(CommonStrings.common_something_went_wrong))
} }
delay(AsyncIndicator.DURATION_SHORT) delay(AsyncIndicator.DURATION_SHORT)
updatedEventSink(SpaceEvents.ClearFailures) updatedEventSink(SpaceEvent.ClearFailures)
} else { } else {
asyncIndicatorState.clear() asyncIndicatorState.clear()
} }
@@ -317,7 +317,7 @@ private fun SpaceViewContent(
} }
} else { } else {
spaceRoom.trailingAction(isCurrentlyJoining = isCurrentlyJoining) { spaceRoom.trailingAction(isCurrentlyJoining = isCurrentlyJoining) {
state.eventSink(SpaceEvents.Join(spaceRoom)) state.eventSink(SpaceEvent.Join(spaceRoom))
} }
}, },
bottomAction = if (state.isManageMode) { bottomAction = if (state.isManageMode) {
@@ -325,10 +325,10 @@ private fun SpaceViewContent(
} else { } else {
spaceRoom.inviteButtons( spaceRoom.inviteButtons(
onAcceptClick = { onAcceptClick = {
state.eventSink(SpaceEvents.AcceptInvite(spaceRoom)) state.eventSink(SpaceEvent.AcceptInvite(spaceRoom))
}, },
onDeclineClick = { onDeclineClick = {
state.eventSink(SpaceEvents.DeclineInvite(spaceRoom)) state.eventSink(SpaceEvent.DeclineInvite(spaceRoom))
} }
) )
} }
@@ -384,7 +384,7 @@ private fun EmptySpaceView(
@Composable @Composable
private fun LoadingMoreIndicator( private fun LoadingMoreIndicator(
eventSink: (SpaceEvents) -> Unit, eventSink: (SpaceEvent) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
Box( Box(
@@ -397,7 +397,7 @@ private fun LoadingMoreIndicator(
) )
val latestEventSink by rememberUpdatedState(eventSink) val latestEventSink by rememberUpdatedState(eventSink)
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
latestEventSink(SpaceEvents.LoadMore) latestEventSink(SpaceEvent.LoadMore)
} }
} }
} }
@@ -106,7 +106,7 @@ class SpacePresenterTest {
presenter.test { presenter.test {
val state = awaitItem() val state = awaitItem()
// LoadMore event should not cause any state change // LoadMore event should not cause any state change
state.eventSink(SpaceEvents.LoadMore) state.eventSink(SpaceEvent.LoadMore)
expectNoEvents() expectNoEvents()
} }
} }
@@ -181,7 +181,7 @@ class SpacePresenterTest {
skipItems(1) skipItems(1)
val state = awaitItem() val state = awaitItem()
assertThat(state.joinActions[A_ROOM_ID_2]).isNull() assertThat(state.joinActions[A_ROOM_ID_2]).isNull()
state.eventSink(SpaceEvents.Join(aNotJoinedRoom)) state.eventSink(SpaceEvent.Join(aNotJoinedRoom))
val joiningState = awaitItem() val joiningState = awaitItem()
assertThat(joiningState.joinActions[A_ROOM_ID_2]).isEqualTo(AsyncAction.Loading) assertThat(joiningState.joinActions[A_ROOM_ID_2]).isEqualTo(AsyncAction.Loading)
// Let the joinRoom call complete // Let the joinRoom call complete
@@ -234,14 +234,14 @@ class SpacePresenterTest {
skipItems(1) skipItems(1)
val state = awaitItem() val state = awaitItem()
assertThat(state.joinActions[A_ROOM_ID_2]).isNull() assertThat(state.joinActions[A_ROOM_ID_2]).isNull()
state.eventSink(SpaceEvents.Join(aNotJoinedRoom)) state.eventSink(SpaceEvent.Join(aNotJoinedRoom))
val joiningState = awaitItem() val joiningState = awaitItem()
assertThat(joiningState.joinActions[A_ROOM_ID_2]).isEqualTo(AsyncAction.Loading) assertThat(joiningState.joinActions[A_ROOM_ID_2]).isEqualTo(AsyncAction.Loading)
val errorState = awaitItem() val errorState = awaitItem()
// Joined room is removed from the join actions // Joined room is removed from the join actions
assertThat(errorState.joinActions[A_ROOM_ID_2]!!.isFailure()).isTrue() assertThat(errorState.joinActions[A_ROOM_ID_2]!!.isFailure()).isTrue()
// Clear error // Clear error
errorState.eventSink(SpaceEvents.ClearFailures) errorState.eventSink(SpaceEvent.ClearFailures)
val clearedState = awaitItem() val clearedState = awaitItem()
assertThat(clearedState.joinActions[A_ROOM_ID_2]).isEqualTo(AsyncAction.Uninitialized) assertThat(clearedState.joinActions[A_ROOM_ID_2]).isEqualTo(AsyncAction.Uninitialized)
} }
@@ -258,9 +258,9 @@ class SpacePresenterTest {
val state = awaitItem() val state = awaitItem()
assertThat(state.topicViewerState).isEqualTo(TopicViewerState.Hidden) assertThat(state.topicViewerState).isEqualTo(TopicViewerState.Hidden)
advanceUntilIdle() advanceUntilIdle()
state.eventSink(SpaceEvents.ShowTopicViewer("topic")) state.eventSink(SpaceEvent.ShowTopicViewer("topic"))
assertThat(awaitItem().topicViewerState).isEqualTo(TopicViewerState.Shown("topic")) assertThat(awaitItem().topicViewerState).isEqualTo(TopicViewerState.Shown("topic"))
state.eventSink(SpaceEvents.HideTopicViewer) state.eventSink(SpaceEvent.HideTopicViewer)
assertThat(awaitItem().topicViewerState).isEqualTo(TopicViewerState.Hidden) assertThat(awaitItem().topicViewerState).isEqualTo(TopicViewerState.Hidden)
} }
} }
@@ -300,14 +300,14 @@ class SpacePresenterTest {
val state = awaitItem() val state = awaitItem()
assertThat(state.joinActions[A_ROOM_ID_2]).isNull() assertThat(state.joinActions[A_ROOM_ID_2]).isNull()
if (acceptInvite) { if (acceptInvite) {
state.eventSink(SpaceEvents.AcceptInvite(anInvitedRoom)) state.eventSink(SpaceEvent.AcceptInvite(anInvitedRoom))
eventRecorder.assertSingle( eventRecorder.assertSingle(
AcceptDeclineInviteEvent.AcceptInvite( AcceptDeclineInviteEvent.AcceptInvite(
invite = anInvitedRoom.toInviteData(), invite = anInvitedRoom.toInviteData(),
) )
) )
} else { } else {
state.eventSink(SpaceEvents.DeclineInvite(anInvitedRoom)) state.eventSink(SpaceEvent.DeclineInvite(anInvitedRoom))
eventRecorder.assertSingle( eventRecorder.assertSingle(
AcceptDeclineInviteEvent.DeclineInvite( AcceptDeclineInviteEvent.DeclineInvite(
invite = anInvitedRoom.toInviteData(), invite = anInvitedRoom.toInviteData(),
@@ -325,7 +325,7 @@ class SpacePresenterTest {
presenter.test { presenter.test {
val state = awaitItem() val state = awaitItem()
assertThat(state.isManageMode).isFalse() assertThat(state.isManageMode).isFalse()
state.eventSink(SpaceEvents.EnterManageMode) state.eventSink(SpaceEvent.EnterManageMode)
val manageModeState = awaitItem() val manageModeState = awaitItem()
assertThat(manageModeState.isManageMode).isTrue() assertThat(manageModeState.isManageMode).isTrue()
assertThat(manageModeState.selectedRoomIds).isEmpty() assertThat(manageModeState.selectedRoomIds).isEmpty()
@@ -342,9 +342,9 @@ class SpacePresenterTest {
val presenter = createSpacePresenter(spaceRoomList = fakeSpaceRoomList) val presenter = createSpacePresenter(spaceRoomList = fakeSpaceRoomList)
presenter.test { presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(SpaceEvents.EnterManageMode) initialState.eventSink(SpaceEvent.EnterManageMode)
initialState.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) initialState.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
initialState.eventSink(SpaceEvents.ExitManageMode) initialState.eventSink(SpaceEvent.ExitManageMode)
advanceUntilIdle() advanceUntilIdle()
val finalState = expectMostRecentItem() val finalState = expectMostRecentItem()
assertThat(finalState.isManageMode).isFalse() assertThat(finalState.isManageMode).isFalse()
@@ -359,13 +359,13 @@ class SpacePresenterTest {
val presenter = createSpacePresenter() val presenter = createSpacePresenter()
presenter.test { presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(SpaceEvents.EnterManageMode) initialState.eventSink(SpaceEvent.EnterManageMode)
// Select a room // Select a room
initialState.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) initialState.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
var latestState = expectMostRecentItem() var latestState = expectMostRecentItem()
assertThat(latestState.selectedRoomIds).containsExactly(A_ROOM_ID) assertThat(latestState.selectedRoomIds).containsExactly(A_ROOM_ID)
// Deselect the room // Deselect the room
latestState.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) latestState.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
latestState = expectMostRecentItem() latestState = expectMostRecentItem()
assertThat(latestState.selectedRoomIds).isEmpty() assertThat(latestState.selectedRoomIds).isEmpty()
} }
@@ -397,10 +397,10 @@ class SpacePresenterTest {
advanceUntilIdle() advanceUntilIdle()
val stateWithChildren = awaitItem() val stateWithChildren = awaitItem()
assertThat(stateWithChildren.children).hasSize(1) assertThat(stateWithChildren.children).hasSize(1)
stateWithChildren.eventSink(SpaceEvents.EnterManageMode) stateWithChildren.eventSink(SpaceEvent.EnterManageMode)
stateWithChildren.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) stateWithChildren.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
stateWithChildren.eventSink(SpaceEvents.RemoveSelectedRooms) stateWithChildren.eventSink(SpaceEvent.RemoveSelectedRooms)
stateWithChildren.eventSink(SpaceEvents.ConfirmRoomRemoval) stateWithChildren.eventSink(SpaceEvent.ConfirmRoomRemoval)
advanceUntilIdle() advanceUntilIdle()
val successState = expectMostRecentItem() val successState = expectMostRecentItem()
assertThat(successState.removeRoomsAction).isEqualTo(AsyncAction.Success(Unit)) assertThat(successState.removeRoomsAction).isEqualTo(AsyncAction.Success(Unit))
@@ -442,11 +442,11 @@ class SpacePresenterTest {
advanceUntilIdle() advanceUntilIdle()
val stateWithChildren = awaitItem() val stateWithChildren = awaitItem()
assertThat(stateWithChildren.children).hasSize(2) assertThat(stateWithChildren.children).hasSize(2)
stateWithChildren.eventSink(SpaceEvents.EnterManageMode) stateWithChildren.eventSink(SpaceEvent.EnterManageMode)
stateWithChildren.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) stateWithChildren.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
stateWithChildren.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID_2)) stateWithChildren.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID_2))
stateWithChildren.eventSink(SpaceEvents.RemoveSelectedRooms) stateWithChildren.eventSink(SpaceEvent.RemoveSelectedRooms)
stateWithChildren.eventSink(SpaceEvents.ConfirmRoomRemoval) stateWithChildren.eventSink(SpaceEvent.ConfirmRoomRemoval)
advanceUntilIdle() advanceUntilIdle()
val failureState = expectMostRecentItem() val failureState = expectMostRecentItem()
assertThat(failureState.removeRoomsAction.isFailure()).isTrue() assertThat(failureState.removeRoomsAction.isFailure()).isTrue()
@@ -492,16 +492,16 @@ class SpacePresenterTest {
awaitItem() // Initial empty state awaitItem() // Initial empty state
advanceUntilIdle() advanceUntilIdle()
val stateWithChildren = awaitItem() val stateWithChildren = awaitItem()
stateWithChildren.eventSink(SpaceEvents.EnterManageMode) stateWithChildren.eventSink(SpaceEvent.EnterManageMode)
stateWithChildren.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) stateWithChildren.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
stateWithChildren.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID_2)) stateWithChildren.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID_2))
stateWithChildren.eventSink(SpaceEvents.RemoveSelectedRooms) stateWithChildren.eventSink(SpaceEvent.RemoveSelectedRooms)
stateWithChildren.eventSink(SpaceEvents.ConfirmRoomRemoval) stateWithChildren.eventSink(SpaceEvent.ConfirmRoomRemoval)
advanceUntilIdle() advanceUntilIdle()
val failureState = expectMostRecentItem() val failureState = expectMostRecentItem()
assertThat(failureState.removeRoomsAction.isFailure()).isTrue() assertThat(failureState.removeRoomsAction.isFailure()).isTrue()
// Exit manage mode after partial failure - reset should be called // Exit manage mode after partial failure - reset should be called
failureState.eventSink(SpaceEvents.ExitManageMode) failureState.eventSink(SpaceEvent.ExitManageMode)
advanceUntilIdle() advanceUntilIdle()
expectMostRecentItem() expectMostRecentItem()
assert(resetResult).isCalledOnce() assert(resetResult).isCalledOnce()
@@ -530,7 +530,7 @@ class SpacePresenterTest {
// Both room and space visible initially // Both room and space visible initially
assertThat(stateWithChildren.children).hasSize(2) assertThat(stateWithChildren.children).hasSize(2)
assertThat(stateWithChildren.isManageMode).isFalse() assertThat(stateWithChildren.isManageMode).isFalse()
stateWithChildren.eventSink(SpaceEvents.EnterManageMode) stateWithChildren.eventSink(SpaceEvent.EnterManageMode)
val manageModeState = expectMostRecentItem() val manageModeState = expectMostRecentItem()
// Only rooms visible in manage mode // Only rooms visible in manage mode
assertThat(manageModeState.children).hasSize(1) assertThat(manageModeState.children).hasSize(1)
@@ -648,12 +648,12 @@ class SpacePresenterTest {
awaitItem() // Initial empty state awaitItem() // Initial empty state
advanceUntilIdle() advanceUntilIdle()
val stateWithChildren = awaitItem() val stateWithChildren = awaitItem()
stateWithChildren.eventSink(SpaceEvents.EnterManageMode) stateWithChildren.eventSink(SpaceEvent.EnterManageMode)
// Select both rooms for removal // Select both rooms for removal
stateWithChildren.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) stateWithChildren.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
stateWithChildren.eventSink(SpaceEvents.ToggleRoomSelection(A_ROOM_ID_2)) stateWithChildren.eventSink(SpaceEvent.ToggleRoomSelection(A_ROOM_ID_2))
stateWithChildren.eventSink(SpaceEvents.RemoveSelectedRooms) stateWithChildren.eventSink(SpaceEvent.RemoveSelectedRooms)
stateWithChildren.eventSink(SpaceEvents.ConfirmRoomRemoval) stateWithChildren.eventSink(SpaceEvent.ConfirmRoomRemoval)
advanceUntilIdle() advanceUntilIdle()
val failureState = expectMostRecentItem() val failureState = expectMostRecentItem()
assertThat(failureState.removeRoomsAction.isFailure()).isTrue() assertThat(failureState.removeRoomsAction.isFailure()).isTrue()
@@ -42,7 +42,7 @@ import org.robolectric.annotation.Config
class SpaceViewTest : RobolectricTest() { class SpaceViewTest : RobolectricTest() {
@Test @Test
fun `clicking on back invokes the expected callback`() = runAndroidComposeUiTest { fun `clicking on back invokes the expected callback`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<SpaceEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<SpaceEvent>(expectEvents = false)
ensureCalledOnce { ensureCalledOnce {
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
@@ -58,7 +58,7 @@ class SpaceViewTest : RobolectricTest() {
@Test @Test
fun `clicking on a room name invokes the expected callback`() = runAndroidComposeUiTest { fun `clicking on a room name invokes the expected callback`() = runAndroidComposeUiTest {
val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, displayName = A_ROOM_NAME) val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, displayName = A_ROOM_NAME)
val eventsRecorder = EventsRecorder<SpaceEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<SpaceEvent>(expectEvents = false)
ensureCalledOnceWithParam(aSpaceRoom) { ensureCalledOnceWithParam(aSpaceRoom) {
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
@@ -75,7 +75,7 @@ class SpaceViewTest : RobolectricTest() {
@Test @Test
fun `clicking on Join room emits the expected Event`() = runAndroidComposeUiTest { fun `clicking on Join room emits the expected Event`() = runAndroidComposeUiTest {
val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, state = null) val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, state = null)
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
children = listOf(aSpaceRoom), children = listOf(aSpaceRoom),
@@ -84,14 +84,14 @@ class SpaceViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_join) clickOn(CommonStrings.action_join)
eventsRecorder.assertSingle(SpaceEvents.Join(aSpaceRoom)) eventsRecorder.assertSingle(SpaceEvent.Join(aSpaceRoom))
} }
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
@Test @Test
fun `clicking on accept invite emits the expected Event`() = runAndroidComposeUiTest { fun `clicking on accept invite emits the expected Event`() = runAndroidComposeUiTest {
val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, state = CurrentUserMembership.INVITED) val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, state = CurrentUserMembership.INVITED)
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
hasMoreToLoad = false, hasMoreToLoad = false,
@@ -100,14 +100,14 @@ class SpaceViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_accept) clickOn(CommonStrings.action_accept)
eventsRecorder.assertSingle(SpaceEvents.AcceptInvite(aSpaceRoom)) eventsRecorder.assertSingle(SpaceEvent.AcceptInvite(aSpaceRoom))
} }
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
@Test @Test
fun `clicking on decline invite emits the expected Event`() = runAndroidComposeUiTest { fun `clicking on decline invite emits the expected Event`() = runAndroidComposeUiTest {
val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, state = CurrentUserMembership.INVITED) val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, state = CurrentUserMembership.INVITED)
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
hasMoreToLoad = false, hasMoreToLoad = false,
@@ -116,13 +116,13 @@ class SpaceViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_decline) clickOn(CommonStrings.action_decline)
eventsRecorder.assertSingle(SpaceEvents.DeclineInvite(aSpaceRoom)) eventsRecorder.assertSingle(SpaceEvent.DeclineInvite(aSpaceRoom))
} }
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
@Test @Test
fun `clicking on topic emits the expected Event`() = runAndroidComposeUiTest { fun `clicking on topic emits the expected Event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
spaceInfo = aRoomInfo(topic = A_ROOM_TOPIC), spaceInfo = aRoomInfo(topic = A_ROOM_TOPIC),
@@ -131,12 +131,12 @@ class SpaceViewTest : RobolectricTest() {
) )
) )
onNodeWithText(A_ROOM_TOPIC).performClick() onNodeWithText(A_ROOM_TOPIC).performClick()
eventsRecorder.assertSingle(SpaceEvents.ShowTopicViewer(A_ROOM_TOPIC)) eventsRecorder.assertSingle(SpaceEvent.ShowTopicViewer(A_ROOM_TOPIC))
} }
@Test @Test
fun `clicking back in manage mode emits ExitManageMode event`() = runAndroidComposeUiTest { fun `clicking back in manage mode emits ExitManageMode event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
hasMoreToLoad = false, hasMoreToLoad = false,
@@ -145,13 +145,13 @@ class SpaceViewTest : RobolectricTest() {
) )
) )
pressBackKey() pressBackKey()
eventsRecorder.assertSingle(SpaceEvents.ExitManageMode) eventsRecorder.assertSingle(SpaceEvent.ExitManageMode)
} }
@Test @Test
fun `clicking on room in manage mode emits ToggleRoomSelection event`() = runAndroidComposeUiTest { fun `clicking on room in manage mode emits ToggleRoomSelection event`() = runAndroidComposeUiTest {
val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, displayName = A_ROOM_NAME) val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, displayName = A_ROOM_NAME)
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
children = listOf(aSpaceRoom), children = listOf(aSpaceRoom),
@@ -161,12 +161,12 @@ class SpaceViewTest : RobolectricTest() {
) )
) )
onNodeWithText(A_ROOM_NAME).performClick() onNodeWithText(A_ROOM_NAME).performClick()
eventsRecorder.assertSingle(SpaceEvents.ToggleRoomSelection(A_ROOM_ID)) eventsRecorder.assertSingle(SpaceEvent.ToggleRoomSelection(A_ROOM_ID))
} }
@Test @Test
fun `clicking remove button emits RemoveSelectedRooms event`() = runAndroidComposeUiTest { fun `clicking remove button emits RemoveSelectedRooms event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
children = listOf(aSpaceRoom(roomId = A_ROOM_ID)), children = listOf(aSpaceRoom(roomId = A_ROOM_ID)),
@@ -177,13 +177,13 @@ class SpaceViewTest : RobolectricTest() {
) )
) )
clickOn(CommonStrings.action_remove) clickOn(CommonStrings.action_remove)
eventsRecorder.assertSingle(SpaceEvents.RemoveSelectedRooms) eventsRecorder.assertSingle(SpaceEvent.RemoveSelectedRooms)
} }
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
@Test @Test
fun `clicking confirm in removal dialog emits ConfirmRoomRemoval event`() = runAndroidComposeUiTest { fun `clicking confirm in removal dialog emits ConfirmRoomRemoval event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<SpaceEvents>() val eventsRecorder = EventsRecorder<SpaceEvent>()
setSpaceView( setSpaceView(
aSpaceState( aSpaceState(
children = listOf(aSpaceRoom(roomId = A_ROOM_ID)), children = listOf(aSpaceRoom(roomId = A_ROOM_ID)),
@@ -196,7 +196,7 @@ class SpaceViewTest : RobolectricTest() {
) )
// Click on the Remove button in the confirmation dialog // Click on the Remove button in the confirmation dialog
clickOn(CommonStrings.action_remove, inDialog = true) clickOn(CommonStrings.action_remove, inDialog = true)
eventsRecorder.assertSingle(SpaceEvents.ConfirmRoomRemoval) eventsRecorder.assertSingle(SpaceEvent.ConfirmRoomRemoval)
} }
@Test @Test