From 755dddbba992382e4e1b06bac071ef28ce9e2ff7 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Fri, 23 Jun 2023 11:53:54 +0100 Subject: [PATCH] Add some tests for create room analytics --- .../analytics/test/FakeAnalyticsService.kt | 2 ++ .../ConfigureRoomPresenterTests.kt | 21 ++++++++++++++++ .../impl/root/CreateRoomRootPresenterTests.kt | 25 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/features/analytics/test/src/main/kotlin/io/element/android/features/analytics/test/FakeAnalyticsService.kt b/features/analytics/test/src/main/kotlin/io/element/android/features/analytics/test/FakeAnalyticsService.kt index 47eba919ed..3d969567f7 100644 --- a/features/analytics/test/src/main/kotlin/io/element/android/features/analytics/test/FakeAnalyticsService.kt +++ b/features/analytics/test/src/main/kotlin/io/element/android/features/analytics/test/FakeAnalyticsService.kt @@ -31,6 +31,7 @@ class FakeAnalyticsService( private var isEnabledFlow = MutableStateFlow(isEnabled) private var didAskUserConsentFlow = MutableStateFlow(didAskUserConsent) + var capturedEvents = mutableListOf() override fun getAvailableAnalyticsProviders(): List = emptyList() @@ -55,6 +56,7 @@ class FakeAnalyticsService( } override fun capture(event: VectorAnalyticsEvent) { + capturedEvents += event } override fun screen(screen: VectorAnalyticsScreen) { diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt index 0c73d16a7e..9b6ac2e067 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterTests.kt @@ -21,6 +21,7 @@ import app.cash.molecule.RecompositionClock import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat +import im.vector.app.features.analytics.plan.CreatedRoom import io.element.android.features.analytics.test.FakeAnalyticsService import io.element.android.features.createroom.impl.CreateRoomConfig import io.element.android.features.createroom.impl.CreateRoomDataStore @@ -218,6 +219,25 @@ class ConfigureRoomPresenterTests { } } + @Test + fun `present - record analytics when creating room`() = runTest { + moleculeFlow(RecompositionClock.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val createRoomResult = Result.success(RoomId("!createRoomResult:domain")) + + fakeMatrixClient.givenCreateRoomResult(createRoomResult) + + initialState.eventSink(ConfigureRoomEvents.CreateRoom(initialState.config)) + skipItems(2) + + val analyticsEvent = fakeAnalyticsService.capturedEvents.filterIsInstance().firstOrNull() + assertThat(analyticsEvent).isNotNull() + assertThat(analyticsEvent?.isDM).isFalse() + } + } + @Test fun `present - trigger create room with upload error and retry`() = runTest { moleculeFlow(RecompositionClock.Immediate) { @@ -233,6 +253,7 @@ class ConfigureRoomPresenterTests { assertThat(awaitItem().createRoomAction).isInstanceOf(Async.Loading::class.java) val stateAfterCreateRoom = awaitItem() assertThat(stateAfterCreateRoom.createRoomAction).isInstanceOf(Async.Failure::class.java) + assertThat(fakeAnalyticsService.capturedEvents.filterIsInstance()).isEmpty() fakeMatrixClient.givenUploadMediaResult(Result.success(AN_AVATAR_URL)) stateAfterCreateRoom.eventSink(ConfigureRoomEvents.CreateRoom(initialState.config)) diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt index a2c1cf96a9..38d563c33c 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenterTests.kt @@ -20,6 +20,7 @@ import app.cash.molecule.RecompositionClock import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat +import im.vector.app.features.analytics.plan.CreatedRoom import io.element.android.features.analytics.test.FakeAnalyticsService import io.element.android.features.createroom.impl.userlist.FakeUserListPresenter import io.element.android.features.createroom.impl.userlist.FakeUserListPresenterFactory @@ -91,6 +92,27 @@ class CreateRoomRootPresenterTests { } } + @Test + fun `present - creating a DM records analytics event`() = runTest { + moleculeFlow(RecompositionClock.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val matrixUser = MatrixUser(UserId("@name:domain")) + val createDmResult = Result.success(RoomId("!createDmResult:domain")) + + fakeMatrixClient.givenFindDmResult(null) + fakeMatrixClient.givenCreateDmResult(createDmResult) + + initialState.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) + skipItems(2) + + val analyticsEvent = fakeAnalyticsService.capturedEvents.filterIsInstance().firstOrNull() + assertThat(analyticsEvent).isNotNull() + assertThat(analyticsEvent?.isDM).isTrue() + } + } + @Test fun `present - trigger retrieve DM action`() = runTest { moleculeFlow(RecompositionClock.Immediate) { @@ -106,6 +128,7 @@ class CreateRoomRootPresenterTests { val stateAfterStartDM = awaitItem() assertThat(stateAfterStartDM.startDmAction).isInstanceOf(Async.Success::class.java) assertThat(stateAfterStartDM.startDmAction.dataOrNull()).isEqualTo(fakeDmResult.roomId) + assertThat(fakeAnalyticsService.capturedEvents.filterIsInstance()).isEmpty() } } @@ -128,6 +151,7 @@ class CreateRoomRootPresenterTests { assertThat(awaitItem().startDmAction).isInstanceOf(Async.Loading::class.java) val stateAfterStartDM = awaitItem() assertThat(stateAfterStartDM.startDmAction).isInstanceOf(Async.Failure::class.java) + assertThat(fakeAnalyticsService.capturedEvents.filterIsInstance()).isEmpty() // Cancel stateAfterStartDM.eventSink(CreateRoomRootEvents.CancelStartDM) @@ -139,6 +163,7 @@ class CreateRoomRootPresenterTests { assertThat(awaitItem().startDmAction).isInstanceOf(Async.Loading::class.java) val stateAfterSecondAttempt = awaitItem() assertThat(stateAfterSecondAttempt.startDmAction).isInstanceOf(Async.Failure::class.java) + assertThat(fakeAnalyticsService.capturedEvents.filterIsInstance()).isEmpty() // Retry with success fakeMatrixClient.givenCreateDmError(null)