diff --git a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt index eb7a90fd31..fef638310c 100644 --- a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt +++ b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt @@ -57,9 +57,10 @@ fun aLeaveRoomState( confirmation: LeaveRoomState.Confirmation = LeaveRoomState.Confirmation.Hidden, progress: LeaveRoomState.Progress = LeaveRoomState.Progress.Hidden, error: LeaveRoomState.Error = LeaveRoomState.Error.Hidden, + eventSink: (LeaveRoomEvent) -> Unit = {}, ) = LeaveRoomState( confirmation = confirmation, progress = progress, error = error, - eventSink = {}, + eventSink = eventSink, ) diff --git a/features/leaveroom/test/build.gradle.kts b/features/leaveroom/test/build.gradle.kts deleted file mode 100644 index 395542cab1..0000000000 --- a/features/leaveroom/test/build.gradle.kts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2022-2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. - */ - -plugins { - id("io.element.android-compose-library") -} - -android { - namespace = "io.element.android.features.leaveroom.test" -} - -dependencies { - implementation(projects.libraries.core) - implementation(projects.libraries.architecture) - implementation(projects.libraries.matrix.api) - api(projects.features.leaveroom.api) -} diff --git a/features/leaveroom/test/src/main/kotlin/io/element/android/features/leaveroom/fake/FakeLeaveRoomPresenter.kt b/features/leaveroom/test/src/main/kotlin/io/element/android/features/leaveroom/fake/FakeLeaveRoomPresenter.kt deleted file mode 100644 index 6de7c631d9..0000000000 --- a/features/leaveroom/test/src/main/kotlin/io/element/android/features/leaveroom/fake/FakeLeaveRoomPresenter.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. - */ - -package io.element.android.features.leaveroom.fake - -import androidx.compose.runtime.Composable -import io.element.android.features.leaveroom.api.LeaveRoomEvent -import io.element.android.features.leaveroom.api.LeaveRoomState -import io.element.android.libraries.architecture.Presenter - -class FakeLeaveRoomPresenter : Presenter { - val events = mutableListOf() - - private fun handleEvent(event: LeaveRoomEvent) { - events += event - } - - private var state = LeaveRoomState( - confirmation = LeaveRoomState.Confirmation.Hidden, - progress = LeaveRoomState.Progress.Hidden, - error = LeaveRoomState.Error.Hidden, - eventSink = ::handleEvent, - ) - set(value) { - field = value.copy(eventSink = ::handleEvent) - } - - fun givenState(state: LeaveRoomState) { - this.state = state - } - - @Composable - override fun present(): LeaveRoomState = state -} diff --git a/features/roomdetails/impl/build.gradle.kts b/features/roomdetails/impl/build.gradle.kts index c8bf9d36f1..42f27963f3 100644 --- a/features/roomdetails/impl/build.gradle.kts +++ b/features/roomdetails/impl/build.gradle.kts @@ -64,7 +64,6 @@ dependencies { testImplementation(projects.libraries.usersearch.test) testImplementation(projects.libraries.featureflag.test) testImplementation(projects.tests.testutils) - testImplementation(projects.features.leaveroom.test) testImplementation(projects.features.createroom.test) testImplementation(projects.services.analytics.test) testImplementation(libs.androidx.compose.ui.test.junit) diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTest.kt index 2644bd5073..73eee2092e 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTest.kt @@ -17,7 +17,7 @@ import im.vector.app.features.analytics.plan.Interaction import io.element.android.features.createroom.test.FakeStartDMAction import io.element.android.features.leaveroom.api.LeaveRoomEvent import io.element.android.features.leaveroom.api.LeaveRoomState -import io.element.android.features.leaveroom.fake.FakeLeaveRoomPresenter +import io.element.android.features.leaveroom.api.aLeaveRoomState import io.element.android.features.roomdetails.impl.RoomDetailsEvent import io.element.android.features.roomdetails.impl.RoomDetailsPresenter import io.element.android.features.roomdetails.impl.RoomDetailsState @@ -25,7 +25,6 @@ import io.element.android.features.roomdetails.impl.RoomDetailsType import io.element.android.features.roomdetails.impl.RoomTopicState import io.element.android.features.roomdetails.impl.members.aRoomMember import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsPresenter -import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService @@ -46,6 +45,7 @@ import io.element.android.libraries.matrix.test.room.FakeMatrixRoom import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analytics.test.FakeAnalyticsService +import io.element.android.tests.testutils.EventsRecorder import io.element.android.tests.testutils.FakeLifecycleOwner import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.consumeItemsUntilPredicate @@ -73,7 +73,7 @@ class RoomDetailsPresenterTest { private fun TestScope.createRoomDetailsPresenter( room: MatrixRoom = aMatrixRoom(), - leaveRoomPresenter: Presenter = FakeLeaveRoomPresenter(), + leaveRoomState: LeaveRoomState = aLeaveRoomState(), dispatchers: CoroutineDispatchers = testCoroutineDispatchers(), notificationSettingsService: FakeNotificationSettingsService = FakeNotificationSettingsService(), analyticsService: AnalyticsService = FakeAnalyticsService(), @@ -94,7 +94,7 @@ class RoomDetailsPresenterTest { featureFlagService = featureFlagService, notificationSettingsService = matrixClient.notificationSettingsService(), roomMembersDetailsPresenterFactory = roomMemberDetailsPresenterFactory, - leaveRoomPresenter = leaveRoomPresenter, + leaveRoomPresenter = { leaveRoomState }, dispatchers = dispatchers, isPinnedMessagesFeatureEnabled = { isPinnedMessagesFeatureEnabled }, analyticsService = analyticsService, @@ -476,7 +476,7 @@ class RoomDetailsPresenterTest { @Test fun `present - leave room event is passed on to leave room presenter`() = runTest { - val leaveRoomPresenter = FakeLeaveRoomPresenter() + val leaveRoomEventRecorder = EventsRecorder() val room = aMatrixRoom( canInviteResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, @@ -484,25 +484,18 @@ class RoomDetailsPresenterTest { ) val presenter = createRoomDetailsPresenter( room = room, - leaveRoomPresenter = leaveRoomPresenter, + leaveRoomState = aLeaveRoomState(eventSink = leaveRoomEventRecorder), dispatchers = testCoroutineDispatchers() ) presenter.test { awaitItem().eventSink(RoomDetailsEvent.LeaveRoom) - - assertThat(leaveRoomPresenter.events).contains( - LeaveRoomEvent.ShowConfirmation( - room.roomId - ) - ) - + leaveRoomEventRecorder.assertSingle(LeaveRoomEvent.ShowConfirmation(room.roomId)) cancelAndIgnoreRemainingEvents() } } @Test fun `present - notification mode changes`() = runTest { - val leaveRoomPresenter = FakeLeaveRoomPresenter() val notificationSettingsService = FakeNotificationSettingsService() val room = aMatrixRoom( notificationSettingsService = notificationSettingsService, @@ -512,7 +505,6 @@ class RoomDetailsPresenterTest { ) val presenter = createRoomDetailsPresenter( room = room, - leaveRoomPresenter = leaveRoomPresenter, notificationSettingsService = notificationSettingsService, ) presenter.test { diff --git a/features/roomlist/impl/build.gradle.kts b/features/roomlist/impl/build.gradle.kts index c0e219016f..cb9c8670d0 100644 --- a/features/roomlist/impl/build.gradle.kts +++ b/features/roomlist/impl/build.gradle.kts @@ -74,5 +74,4 @@ dependencies { testImplementation(projects.features.networkmonitor.test) testImplementation(projects.features.logout.test) testImplementation(projects.tests.testutils) - testImplementation(projects.features.leaveroom.test) } diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt index 259f6a8ed9..9fad11783d 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt @@ -17,7 +17,7 @@ import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.anAcceptDeclineInviteState import io.element.android.features.leaveroom.api.LeaveRoomEvent import io.element.android.features.leaveroom.api.LeaveRoomState -import io.element.android.features.leaveroom.fake.FakeLeaveRoomPresenter +import io.element.android.features.leaveroom.api.aLeaveRoomState import io.element.android.features.logout.api.direct.aDirectLogoutState import io.element.android.features.networkmonitor.api.NetworkMonitor import io.element.android.features.networkmonitor.test.FakeNetworkMonitor @@ -368,15 +368,18 @@ class RoomListPresenterTest { @Test fun `present - leave room calls into leave room presenter`() = runTest { - val leaveRoomPresenter = FakeLeaveRoomPresenter() + val leaveRoomEventsRecorder = EventsRecorder() val scope = CoroutineScope(coroutineContext + SupervisorJob()) - val presenter = createRoomListPresenter(leaveRoomPresenter = leaveRoomPresenter, coroutineScope = scope) + val presenter = createRoomListPresenter( + leaveRoomState = aLeaveRoomState(eventSink = leaveRoomEventsRecorder), + coroutineScope = scope, + ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { val initialState = awaitItem() initialState.eventSink(RoomListEvents.LeaveRoom(A_ROOM_ID)) - assertThat(leaveRoomPresenter.events).containsExactly(LeaveRoomEvent.ShowConfirmation(A_ROOM_ID)) + leaveRoomEventsRecorder.assertSingle(LeaveRoomEvent.ShowConfirmation(A_ROOM_ID)) cancelAndIgnoreRemainingEvents() scope.cancel() } @@ -671,7 +674,7 @@ class RoomListPresenterTest { client: MatrixClient = FakeMatrixClient(), networkMonitor: NetworkMonitor = FakeNetworkMonitor(), snackbarDispatcher: SnackbarDispatcher = SnackbarDispatcher(), - leaveRoomPresenter: Presenter = FakeLeaveRoomPresenter(), + leaveRoomState: LeaveRoomState = aLeaveRoomState(), lastMessageTimestampFormatter: LastMessageTimestampFormatter = FakeLastMessageTimestampFormatter().apply { givenFormat(A_FORMATTED_DATE) }, @@ -688,7 +691,7 @@ class RoomListPresenterTest { client = client, networkMonitor = networkMonitor, snackbarDispatcher = snackbarDispatcher, - leaveRoomPresenter = leaveRoomPresenter, + leaveRoomPresenter = { leaveRoomState }, roomListDataSource = RoomListDataSource( roomListService = client.roomListService, roomListRoomSummaryFactory = RoomListRoomSummaryFactory(