From 04ae41f4b47612aa91daa2bbaf338e087357ba86 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 27 Jan 2026 15:07:17 +0100 Subject: [PATCH] Use presenter test extension. --- .../features/home/impl/HomePresenterTest.kt | 23 +++------- .../filters/RoomListFiltersPresenterTest.kt | 16 ++----- .../impl/roomlist/RoomListPresenterTest.kt | 43 +++++-------------- .../search/RoomListSearchPresenterTest.kt | 20 +++------ 4 files changed, 24 insertions(+), 78 deletions(-) diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt index bcae28c041..4002844947 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt @@ -8,9 +8,6 @@ package io.element.android.features.home.impl -import app.cash.molecule.RecompositionMode -import app.cash.molecule.moleculeFlow -import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.api.AnnouncementService @@ -70,9 +67,7 @@ class HomePresenterTest { ), ), ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() assertThat(initialState.currentUserAndNeighbors.first()).isEqualTo( MatrixUser(A_USER_ID, null, null) @@ -96,9 +91,7 @@ class HomePresenterTest { updateUserProfileResult = { _, _, _ -> }, ), ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() assertThat(initialState.canReportBug).isFalse() val finalState = awaitItem() @@ -115,9 +108,7 @@ class HomePresenterTest { updateUserProfileResult = { _, _, _ -> }, ), ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() assertThat(initialState.showAvatarIndicator).isFalse() indicatorService.setShowRoomListTopBarIndicator(true) @@ -139,9 +130,7 @@ class HomePresenterTest { updateUserProfileResult = { _, _, _ -> }, ), ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() assertThat(initialState.currentUserAndNeighbors.first()).isEqualTo(MatrixUser(matrixClient.sessionId)) // No new state is coming @@ -159,9 +148,7 @@ class HomePresenterTest { showAnnouncementResult = showAnnouncementResult, ) ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() assertThat(initialState.currentHomeNavigationBarItem).isEqualTo(HomeNavigationBarItem.Chats) initialState.eventSink(HomeEvent.SelectHomeNavigationBarItem(HomeNavigationBarItem.Spaces)) diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt index 6d345565f6..ef8ca425b6 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt @@ -8,15 +8,13 @@ package io.element.android.features.home.impl.filters -import app.cash.molecule.RecompositionMode -import app.cash.molecule.moleculeFlow -import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.home.impl.filters.selection.DefaultFilterSelectionStrategy import io.element.android.features.home.impl.filters.selection.FilterSelectionState import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService import io.element.android.tests.testutils.awaitLastSequentialItem +import io.element.android.tests.testutils.test import kotlinx.coroutines.test.runTest import org.junit.Test import io.element.android.libraries.matrix.api.roomlist.RoomListFilter as MatrixRoomListFilter @@ -25,9 +23,7 @@ class RoomListFiltersPresenterTest { @Test fun `present - initial state`() = runTest { val presenter = createRoomListFiltersPresenter() - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { awaitItem().let { state -> assertThat(state.hasAnyFilterSelected).isFalse() assertThat(state.filterSelectionStates).containsExactly( @@ -46,9 +42,7 @@ class RoomListFiltersPresenterTest { fun `present - toggle rooms filter`() = runTest { val roomListService = FakeRoomListService() val presenter = createRoomListFiltersPresenter(roomListService) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { awaitItem().eventSink.invoke(RoomListFiltersEvent.ToggleFilter(RoomListFilter.Rooms)) awaitLastSequentialItem().let { state -> @@ -88,9 +82,7 @@ class RoomListFiltersPresenterTest { fun `present - clear filters event`() = runTest { val roomListService = FakeRoomListService() val presenter = createRoomListFiltersPresenter(roomListService) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { awaitItem().eventSink.invoke(RoomListFiltersEvent.ToggleFilter(RoomListFilter.Rooms)) awaitLastSequentialItem().let { state -> assertThat(state.hasAnyFilterSelected).isTrue() diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt index 8621875752..dd2702bd77 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt @@ -8,9 +8,6 @@ package io.element.android.features.home.impl.roomlist -import app.cash.molecule.RecompositionMode -import app.cash.molecule.moleculeFlow -import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.Interaction import io.element.android.features.announcement.api.Announcement @@ -141,9 +138,7 @@ class RoomListPresenterTest { val presenter = createRoomListPresenter( client = FakeMatrixClient(roomListService = roomListService, encryptionService = encryptionService, syncService = syncService), ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val eventWithContentAsRooms = consumeItemsUntilPredicate { it.contentState is RoomListContentState.Rooms }.last() @@ -173,9 +168,7 @@ class RoomListPresenterTest { val presenter = createRoomListPresenter( client = matrixClient, ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = consumeItemsUntilPredicate { it.contentState is RoomListContentState.Rooms }.last() @@ -207,9 +200,7 @@ class RoomListPresenterTest { givenGetRoomResult(A_ROOM_ID, room) } val presenter = createRoomListPresenter(client = client) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() val summary = createRoomListRoomSummary() initialState.eventSink(RoomListEvent.ShowContextMenu(summary)) @@ -282,9 +273,7 @@ class RoomListPresenterTest { givenGetRoomResult(A_ROOM_ID, room) } val presenter = createRoomListPresenter(client = client) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() val summary = createRoomListRoomSummary() initialState.eventSink(RoomListEvent.ShowContextMenu(summary)) @@ -315,9 +304,7 @@ class RoomListPresenterTest { val presenter = createRoomListPresenter( leaveRoomState = aLeaveRoomState(eventSink = leaveRoomEventsRecorder), ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() initialState.eventSink(RoomListEvent.LeaveRoom(A_ROOM_ID, needsConfirmation = true)) leaveRoomEventsRecorder.assertSingle(LeaveRoomEvent.LeaveRoom(A_ROOM_ID, needsConfirmation = true)) @@ -336,9 +323,7 @@ class RoomListPresenterTest { val presenter = createRoomListPresenter( searchPresenter = searchPresenter, ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() eventRecorder.assertEmpty() initialState.eventSink(RoomListEvent.ToggleSearchResults) @@ -367,9 +352,7 @@ class RoomListPresenterTest { notificationSettingsService = notificationSettingsService ) val presenter = createRoomListPresenter(client = matrixClient) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { notificationSettingsService.setRoomNotificationMode(A_ROOM_ID, userDefinedMode) val updatedState = consumeItemsUntilPredicate { state -> (state.contentState as? RoomListContentState.Rooms)?.summaries.orEmpty().any { summary -> @@ -394,9 +377,7 @@ class RoomListPresenterTest { givenGetRoomResult(A_ROOM_ID, room) } val presenter = createRoomListPresenter(client = client, analyticsService = analyticsService) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() initialState.eventSink(RoomListEvent.SetRoomIsFavorite(A_ROOM_ID, true)) setIsFavoriteResult.assertions().isCalledOnce().with(value(true)) @@ -424,9 +405,7 @@ class RoomListPresenterTest { val presenter = createRoomListPresenter( client = matrixClient, ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { assertThat(awaitItem().contentState).isInstanceOf(RoomListContentState.Empty::class.java) } } @@ -463,9 +442,7 @@ class RoomListPresenterTest { analyticsService = analyticsService, notificationCleaner = notificationCleaner, ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { val initialState = awaitItem() allRooms.forEach { assertThat(it.setUnreadFlagCalls).isEmpty() diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt index a7cdc2b573..c135d62e49 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt @@ -8,9 +8,6 @@ package io.element.android.features.home.impl.search -import app.cash.molecule.RecompositionMode -import app.cash.molecule.moleculeFlow -import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.home.impl.datasource.aRoomListRoomSummaryFactory import io.element.android.libraries.dateformatter.test.FakeDateFormatter @@ -19,6 +16,7 @@ import io.element.android.libraries.matrix.api.roomlist.RoomListFilter import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.test.room.aRoomSummary import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService +import io.element.android.tests.testutils.test import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.test.TestScope @@ -29,9 +27,7 @@ class RoomListSearchPresenterTest { @Test fun `present - initial state`() = runTest { val presenter = createRoomListSearchPresenter() - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { awaitItem().let { state -> assertThat(state.isSearchActive).isFalse() assertThat(state.query.text.toString()).isEmpty() @@ -43,9 +39,7 @@ class RoomListSearchPresenterTest { @Test fun `present - toggle search visibility`() = runTest { val presenter = createRoomListSearchPresenter() - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { awaitItem().let { state -> assertThat(state.isSearchActive).isFalse() state.eventSink(RoomListSearchEvent.ToggleSearchVisibility) @@ -64,9 +58,7 @@ class RoomListSearchPresenterTest { fun `present - query search changes`() = runTest { val roomListService = FakeRoomListService() val presenter = createRoomListSearchPresenter(roomListService) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { awaitItem().let { state -> assertThat( roomListService.allRooms.currentFilter.value @@ -99,9 +91,7 @@ class RoomListSearchPresenterTest { fun `present - room list changes`() = runTest { val roomListService = FakeRoomListService() val presenter = createRoomListSearchPresenter(roomListService) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + presenter.test { awaitItem().let { state -> assertThat(state.results).isEmpty() }