diff --git a/features/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts index 44616d0566..32579cfd31 100644 --- a/features/preferences/impl/build.gradle.kts +++ b/features/preferences/impl/build.gradle.kts @@ -88,8 +88,10 @@ dependencies { testImplementation(projects.libraries.preferences.test) testImplementation(projects.libraries.push.test) testImplementation(projects.libraries.pushstore.test) + testImplementation(projects.features.ftue.test) testImplementation(projects.features.rageshake.test) testImplementation(projects.features.rageshake.impl) + testImplementation(projects.features.roomlist.test) testImplementation(projects.libraries.indicator.impl) testImplementation(projects.libraries.pushproviders.test) testImplementation(projects.features.logout.impl) diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt new file mode 100644 index 0000000000..39be678f84 --- /dev/null +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.preferences.impl.tasks + +import androidx.test.platform.app.InstrumentationRegistry +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import io.element.android.features.ftue.test.FakeFtueService +import io.element.android.features.preferences.impl.DefaultCacheService +import io.element.android.features.roomlist.impl.migration.InMemoryMigrationScreenStore +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.testCoroutineDispatchers +import kotlinx.coroutines.test.runTest +import okhttp3.OkHttpClient +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class DefaultClearCacheUseCaseTest { + @Test + fun `execute clear cache should do all the expected tasks`() = runTest { + val clearCacheLambda = lambdaRecorder { } + val matrixClient = FakeMatrixClient( + clearCacheLambda = clearCacheLambda, + ) + val defaultCacheService = DefaultCacheService() + val resetFtueLambda = lambdaRecorder { } + val ftueService = FakeFtueService( + resetLambda = resetFtueLambda, + ) + val resetMigrationLambda = lambdaRecorder { } + val migrationScreenStore = InMemoryMigrationScreenStore( + resetLambda = resetMigrationLambda, + ) + val sut = DefaultClearCacheUseCase( + context = InstrumentationRegistry.getInstrumentation().context, + matrixClient = matrixClient, + coroutineDispatchers = testCoroutineDispatchers(), + defaultCacheService = defaultCacheService, + okHttpClient = { OkHttpClient.Builder().build() }, + ftueService = ftueService, + migrationScreenStore = migrationScreenStore + ) + defaultCacheService.clearedCacheEventFlow.test { + sut.invoke() + clearCacheLambda.assertions().isCalledOnce() + resetFtueLambda.assertions().isCalledOnce() + resetMigrationLambda.assertions().isCalledOnce() + assertThat(awaitItem()).isEqualTo(matrixClient.sessionId) + } + } +} + diff --git a/features/roomlist/test/src/main/kotlin/io/element/android/features/roomlist/impl/migration/InMemoryMigrationScreenStore.kt b/features/roomlist/test/src/main/kotlin/io/element/android/features/roomlist/impl/migration/InMemoryMigrationScreenStore.kt index 79d0b7c628..6c6b1ce3c1 100644 --- a/features/roomlist/test/src/main/kotlin/io/element/android/features/roomlist/impl/migration/InMemoryMigrationScreenStore.kt +++ b/features/roomlist/test/src/main/kotlin/io/element/android/features/roomlist/impl/migration/InMemoryMigrationScreenStore.kt @@ -19,7 +19,9 @@ package io.element.android.features.roomlist.impl.migration import io.element.android.features.roomlist.api.migration.MigrationScreenStore import io.element.android.libraries.matrix.api.core.SessionId -class InMemoryMigrationScreenStore : MigrationScreenStore { +class InMemoryMigrationScreenStore( + private val resetLambda: () -> Unit = { } +) : MigrationScreenStore { private val store = mutableMapOf() override fun isMigrationScreenNeeded(sessionId: SessionId): Boolean { @@ -33,5 +35,6 @@ class InMemoryMigrationScreenStore : MigrationScreenStore { override fun reset() { store.clear() + resetLambda() } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index 8f17c3547d..d2eb47a585 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -48,6 +48,7 @@ import io.element.android.libraries.matrix.test.roomdirectory.FakeRoomDirectoryS import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService import io.element.android.libraries.matrix.test.sync.FakeSyncService import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService +import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.simulateLongTask import kotlinx.collections.immutable.ImmutableList @@ -80,6 +81,7 @@ class FakeMatrixClient( private val accountManagementUrlString: Result = Result.success(null), private val resolveRoomAliasResult: (RoomAlias) -> Result = { Result.success(ResolvedRoomAlias(A_ROOM_ID, emptyList())) }, private val getRoomPreviewFromRoomIdResult: (RoomId, List) -> Result = { _, _ -> Result.failure(AN_EXCEPTION) }, + private val clearCacheLambda: () -> Unit = { lambdaError() }, ) : MatrixClient { var setDisplayNameCalled: Boolean = false private set @@ -161,6 +163,7 @@ class FakeMatrixClient( } override suspend fun clearCache() { + clearCacheLambda() } override suspend fun logout(ignoreSdkError: Boolean): String? = simulateLongTask {