ReportRoomEvents -> ReportRoomEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:14:32 +02:00
parent 859b0e1b60
commit fc8d3b3065
7 changed files with 33 additions and 33 deletions
@@ -8,9 +8,9 @@
package io.element.android.features.reportroom.impl package io.element.android.features.reportroom.impl
sealed interface ReportRoomEvents { sealed interface ReportRoomEvent {
data class UpdateReason(val reason: String) : ReportRoomEvents data class UpdateReason(val reason: String) : ReportRoomEvent
data object ToggleLeaveRoom : ReportRoomEvents data object ToggleLeaveRoom : ReportRoomEvent
data object Report : ReportRoomEvents data object Report : ReportRoomEvent
data object ClearReportAction : ReportRoomEvents data object ClearReportAction : ReportRoomEvent
} }
@@ -44,16 +44,16 @@ class ReportRoomPresenter(
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
fun handleEvent(event: ReportRoomEvents) { fun handleEvent(event: ReportRoomEvent) {
when (event) { when (event) {
ReportRoomEvents.Report -> coroutineScope.reportRoom(reason, leaveRoom, reportAction) ReportRoomEvent.Report -> coroutineScope.reportRoom(reason, leaveRoom, reportAction)
ReportRoomEvents.ToggleLeaveRoom -> { ReportRoomEvent.ToggleLeaveRoom -> {
leaveRoom = !leaveRoom leaveRoom = !leaveRoom
} }
is ReportRoomEvents.UpdateReason -> { is ReportRoomEvent.UpdateReason -> {
reason = event.reason reason = event.reason
} }
ReportRoomEvents.ClearReportAction -> { ReportRoomEvent.ClearReportAction -> {
reportAction.value = AsyncAction.Uninitialized reportAction.value = AsyncAction.Uninitialized
} }
} }
@@ -14,7 +14,7 @@ data class ReportRoomState(
val reason: String, val reason: String,
val leaveRoom: Boolean, val leaveRoom: Boolean,
val reportAction: AsyncAction<Unit>, val reportAction: AsyncAction<Unit>,
val eventSink: (ReportRoomEvents) -> Unit val eventSink: (ReportRoomEvent) -> Unit
) { ) {
val canReport: Boolean = reason.isNotBlank() val canReport: Boolean = reason.isNotBlank()
} }
@@ -30,7 +30,7 @@ fun aReportRoomState(
reason: String = "", reason: String = "",
leaveRoom: Boolean = false, leaveRoom: Boolean = false,
reportAction: AsyncAction<Unit> = AsyncAction.Uninitialized, reportAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (ReportRoomEvents) -> Unit = {} eventSink: (ReportRoomEvent) -> Unit = {}
) = ReportRoomState( ) = ReportRoomState(
reason = reason, reason = reason,
leaveRoom = leaveRoom, leaveRoom = leaveRoom,
@@ -66,9 +66,9 @@ fun ReportRoomView(
} }
}, },
onRetry = { onRetry = {
state.eventSink(ReportRoomEvents.Report) state.eventSink(ReportRoomEvent.Report)
}, },
onErrorDismiss = { state.eventSink(ReportRoomEvents.ClearReportAction) } onErrorDismiss = { state.eventSink(ReportRoomEvent.ClearReportAction) }
) )
Scaffold( Scaffold(
@@ -93,7 +93,7 @@ fun ReportRoomView(
) { ) {
TextField( TextField(
value = state.reason, value = state.reason,
onValueChange = { state.eventSink(ReportRoomEvents.UpdateReason(it)) }, onValueChange = { state.eventSink(ReportRoomEvent.UpdateReason(it)) },
placeholder = stringResource(R.string.screen_report_room_reason_placeholder), placeholder = stringResource(R.string.screen_report_room_reason_placeholder),
minLines = 3, minLines = 3,
enabled = !isReporting, enabled = !isReporting,
@@ -112,7 +112,7 @@ fun ReportRoomView(
Text(text = stringResource(CommonStrings.action_leave_room)) Text(text = stringResource(CommonStrings.action_leave_room))
}, },
onClick = { onClick = {
state.eventSink(ReportRoomEvents.ToggleLeaveRoom) state.eventSink(ReportRoomEvent.ToggleLeaveRoom)
}, },
trailingContent = ListItemContent.Switch(checked = state.leaveRoom) trailingContent = ListItemContent.Switch(checked = state.leaveRoom)
) )
@@ -126,7 +126,7 @@ fun ReportRoomView(
showProgress = isReporting, showProgress = isReporting,
onClick = { onClick = {
focusManager.clearFocus(force = true) focusManager.clearFocus(force = true)
state.eventSink(ReportRoomEvents.Report) state.eventSink(ReportRoomEvent.Report)
}, },
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -43,13 +43,13 @@ class ReportRoomPresenterTest {
assertThat(state.reason).isEmpty() assertThat(state.reason).isEmpty()
assertThat(state.canReport).isFalse() assertThat(state.canReport).isFalse()
assertThat(state.leaveRoom).isFalse() assertThat(state.leaveRoom).isFalse()
state.eventSink(ReportRoomEvents.UpdateReason("Spam")) state.eventSink(ReportRoomEvent.UpdateReason("Spam"))
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.reason).isEqualTo("Spam") assertThat(state.reason).isEqualTo("Spam")
assertThat(state.canReport).isTrue() assertThat(state.canReport).isTrue()
assertThat(state.leaveRoom).isFalse() assertThat(state.leaveRoom).isFalse()
state.eventSink(ReportRoomEvents.ToggleLeaveRoom) state.eventSink(ReportRoomEvent.ToggleLeaveRoom)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.leaveRoom).isTrue() assertThat(state.leaveRoom).isTrue()
@@ -68,8 +68,8 @@ class ReportRoomPresenterTest {
) )
val presenter = createReportRoomPresenter(roomId = roomId, reportRoom = reportRoom) val presenter = createReportRoomPresenter(roomId = roomId, reportRoom = reportRoom)
presenter.test { presenter.test {
awaitItem().eventSink(ReportRoomEvents.ToggleLeaveRoom) awaitItem().eventSink(ReportRoomEvent.ToggleLeaveRoom)
awaitItem().eventSink(ReportRoomEvents.Report) awaitItem().eventSink(ReportRoomEvent.Report)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java)
} }
@@ -93,7 +93,7 @@ class ReportRoomPresenterTest {
) )
val presenter = createReportRoomPresenter(roomId = roomId, reportRoom = reportRoom) val presenter = createReportRoomPresenter(roomId = roomId, reportRoom = reportRoom)
presenter.test { presenter.test {
awaitItem().eventSink(ReportRoomEvents.Report) awaitItem().eventSink(ReportRoomEvent.Report)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java)
} }
@@ -117,14 +117,14 @@ class ReportRoomPresenterTest {
) )
val presenter = createReportRoomPresenter(roomId = roomId, reportRoom = reportRoom) val presenter = createReportRoomPresenter(roomId = roomId, reportRoom = reportRoom)
presenter.test { presenter.test {
awaitItem().eventSink(ReportRoomEvents.ToggleLeaveRoom) awaitItem().eventSink(ReportRoomEvent.ToggleLeaveRoom)
awaitItem().eventSink(ReportRoomEvents.Report) awaitItem().eventSink(ReportRoomEvent.Report)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.reportAction).isInstanceOf(AsyncAction.Failure::class.java) assertThat(state.reportAction).isInstanceOf(AsyncAction.Failure::class.java)
state.eventSink(ReportRoomEvents.Report) state.eventSink(ReportRoomEvent.Report)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(state.reportAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -28,7 +28,7 @@ import org.junit.Test
class ReportRoomViewTest : RobolectricTest() { class ReportRoomViewTest : RobolectricTest() {
@Test @Test
fun `clicking on back invoke the expected callback`() = runAndroidComposeUiTest { fun `clicking on back invoke the expected callback`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ReportRoomEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<ReportRoomEvent>(expectEvents = false)
ensureCalledOnce { ensureCalledOnce {
setReportRoomView( setReportRoomView(
aReportRoomState( aReportRoomState(
@@ -42,7 +42,7 @@ class ReportRoomViewTest : RobolectricTest() {
@Test @Test
fun `clicking on report when enabled emits the expected event`() = runAndroidComposeUiTest { fun `clicking on report when enabled emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ReportRoomEvents>() val eventsRecorder = EventsRecorder<ReportRoomEvent>()
setReportRoomView( setReportRoomView(
aReportRoomState( aReportRoomState(
reason = "Spam", reason = "Spam",
@@ -50,12 +50,12 @@ class ReportRoomViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_report) clickOn(CommonStrings.action_report)
eventsRecorder.assertSingle(ReportRoomEvents.Report) eventsRecorder.assertSingle(ReportRoomEvent.Report)
} }
@Test @Test
fun `clicking on decline when disabled does not emit event`() = runAndroidComposeUiTest { fun `clicking on decline when disabled does not emit event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ReportRoomEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<ReportRoomEvent>(expectEvents = false)
setReportRoomView( setReportRoomView(
aReportRoomState(eventSink = eventsRecorder), aReportRoomState(eventSink = eventsRecorder),
) )
@@ -64,17 +64,17 @@ class ReportRoomViewTest : RobolectricTest() {
@Test @Test
fun `clicking on leave room option emits the expected event`() = runAndroidComposeUiTest { fun `clicking on leave room option emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ReportRoomEvents>() val eventsRecorder = EventsRecorder<ReportRoomEvent>()
setReportRoomView( setReportRoomView(
aReportRoomState(eventSink = eventsRecorder), aReportRoomState(eventSink = eventsRecorder),
) )
clickOn(CommonStrings.action_leave_room) clickOn(CommonStrings.action_leave_room)
eventsRecorder.assertSingle(ReportRoomEvents.ToggleLeaveRoom) eventsRecorder.assertSingle(ReportRoomEvent.ToggleLeaveRoom)
} }
@Test @Test
fun `typing text in the reason field emits the expected Event`() = runAndroidComposeUiTest { fun `typing text in the reason field emits the expected Event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<ReportRoomEvents>() val eventsRecorder = EventsRecorder<ReportRoomEvent>()
setReportRoomView( setReportRoomView(
aReportRoomState( aReportRoomState(
eventSink = eventsRecorder, eventSink = eventsRecorder,
@@ -82,7 +82,7 @@ class ReportRoomViewTest : RobolectricTest() {
), ),
) )
onNodeWithText("").performTextInput("Spam!") onNodeWithText("").performTextInput("Spam!")
eventsRecorder.assertSingle(ReportRoomEvents.UpdateReason("Spam!")) eventsRecorder.assertSingle(ReportRoomEvent.UpdateReason("Spam!"))
} }
} }