From 5d7da7576e08b0f5a420e9e9b3044680fd222555 Mon Sep 17 00:00:00 2001 From: David Perez Date: Wed, 15 Nov 2023 15:57:59 -0600 Subject: [PATCH] Create a helper for testing with suspending functions that need to hang for the tests (#249) --- .../vault/repository/VaultRepositoryTest.kt | 19 +++++-------- .../com/x8bit/bitwarden/testingtools/Hangs.kt | 27 +++++++++++++++++++ 2 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 app/src/test/java/com/x8bit/bitwarden/testingtools/Hangs.kt diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index 48e4ffc2a0..13ea696470 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -14,21 +14,22 @@ import com.x8bit.bitwarden.data.platform.util.asFailure import com.x8bit.bitwarden.data.platform.util.asSuccess import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockSyncResponse import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService -import com.x8bit.bitwarden.data.vault.datasource.sdk.model.InitializeCryptoResult import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource -import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkCipher -import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkFolder +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.InitializeCryptoResult import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkCipher +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkFolder import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.data.vault.repository.model.VaultUnlockResult +import com.x8bit.bitwarden.testingtools.hangs +import com.x8bit.bitwarden.testingtools.just import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.assertEquals @@ -346,10 +347,7 @@ class VaultRepositoryTest { organizationKeys = mapOf(), ), ) - } coAnswers { - delay(Long.MAX_VALUE) - Result.success(InitializeCryptoResult.Success) - } + } just hangs() val scope = CoroutineScope(Dispatchers.Unconfined) scope.launch { @@ -393,10 +391,7 @@ class VaultRepositoryTest { organizationKeys = mapOf(), ), ) - } coAnswers { - delay(Long.MAX_VALUE) - Result.success(InitializeCryptoResult.Success) - } + } just hangs() val scope = CoroutineScope(Dispatchers.Unconfined) scope.launch { diff --git a/app/src/test/java/com/x8bit/bitwarden/testingtools/Hangs.kt b/app/src/test/java/com/x8bit/bitwarden/testingtools/Hangs.kt new file mode 100644 index 0000000000..f2b554da62 --- /dev/null +++ b/app/src/test/java/com/x8bit/bitwarden/testingtools/Hangs.kt @@ -0,0 +1,27 @@ +package com.x8bit.bitwarden.testingtools + +import io.mockk.MockKAdditionalAnswerScope +import io.mockk.MockKStubScope +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.first + +/** + * A helper alias for [Hangs] to be consistent with the mockk DSL. + * + * Example: coEvery { service.suspend() } just hangs() + */ +typealias hangs = Hangs + +/** + * A class that will hang indefinitely when invoked. + */ +class Hangs { + suspend operator fun invoke(): T = MutableSharedFlow().first() +} + +/** + * A coAnswers placeholder for suspending functions that should never return. + */ +suspend infix fun MockKStubScope.just( + hangs: Hangs, +): MockKAdditionalAnswerScope = coAnswers { hangs() }