Apply result extension consistently (#1210)

This commit is contained in:
David Perez 2024-04-02 13:55:38 -05:00 committed by Álison Fernandes
parent 0561879d6b
commit 663c9785cf
13 changed files with 55 additions and 52 deletions

View file

@ -1,6 +1,7 @@
package com.x8bit.bitwarden.data.platform.datasource.network.core
import com.x8bit.bitwarden.data.platform.util.asFailure
import com.x8bit.bitwarden.data.platform.util.asSuccess
import okhttp3.Request
import okio.IOException
import okio.Timeout
@ -25,9 +26,9 @@ class ResultCall<T>(
@Suppress("UNCHECKED_CAST")
private fun createResult(body: T?): Result<T> {
return when {
body != null -> Result.success(body)
successType == Unit::class.java -> Result.success(Unit as T)
else -> Result.failure(IllegalStateException("Unexpected null body!"))
body != null -> body.asSuccess()
successType == Unit::class.java -> (Unit as T).asSuccess()
else -> IllegalStateException("Unexpected null body!").asFailure()
}
}
@ -36,7 +37,7 @@ class ResultCall<T>(
override fun onResponse(call: Call<T>, response: Response<T>) {
val body = response.body()
val result: Result<T> = if (!response.isSuccessful) {
Result.failure(HttpException(response))
HttpException(response).asFailure()
} else {
createResult(body)
}
@ -44,7 +45,7 @@ class ResultCall<T>(
}
override fun onFailure(call: Call<T>, t: Throwable) {
val result: Result<T> = Result.failure(t)
val result: Result<T> = t.asFailure()
callback.onResponse(this@ResultCall, success(result))
}
},

View file

@ -9,7 +9,7 @@ import kotlinx.coroutines.coroutineScope
*/
inline fun <T, R> Result<T>.flatMap(transform: (T) -> Result<R>): Result<R> =
this.exceptionOrNull()
?.let { Result.failure(it) }
?.asFailure()
?: transform(this.getOrThrow())
/**

View file

@ -11,6 +11,7 @@ import com.x8bit.bitwarden.data.auth.datasource.network.model.ResendEmailRequest
import com.x8bit.bitwarden.data.auth.datasource.network.model.ResetPasswordRequestJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.SetPasswordRequestJson
import com.x8bit.bitwarden.data.platform.base.BaseServiceTest
import com.x8bit.bitwarden.data.platform.util.asSuccess
import kotlinx.coroutines.test.runTest
import kotlinx.serialization.json.Json
import okhttp3.mockwebserver.MockResponse
@ -100,7 +101,7 @@ class AccountsServiceTest : BaseServiceTest() {
)
val response = MockResponse().setBody(json)
server.enqueue(response)
assertEquals(Result.success(expectedResponse), service.preLogin(EMAIL))
assertEquals(expectedResponse.asSuccess(), service.preLogin(EMAIL))
}
@Test
@ -116,7 +117,7 @@ class AccountsServiceTest : BaseServiceTest() {
)
val response = MockResponse().setBody(json)
server.enqueue(response)
assertEquals(Result.success(expectedResponse), service.preLogin(EMAIL))
assertEquals(expectedResponse.asSuccess(), service.preLogin(EMAIL))
}
@Test
@ -131,7 +132,7 @@ class AccountsServiceTest : BaseServiceTest() {
)
val response = MockResponse().setBody(json)
server.enqueue(response)
assertEquals(Result.success(expectedResponse), service.register(registerRequestBody))
assertEquals(expectedResponse.asSuccess(), service.register(registerRequestBody))
}
@Test
@ -199,7 +200,7 @@ class AccountsServiceTest : BaseServiceTest() {
)
val response = MockResponse().setResponseCode(400).setBody(json)
server.enqueue(response)
assertEquals(Result.success(expectedResponse), service.register(registerRequestBody))
assertEquals(expectedResponse.asSuccess(), service.register(registerRequestBody))
}
@Test

View file

@ -3,6 +3,7 @@ package com.x8bit.bitwarden.data.auth.datasource.network.service
import com.x8bit.bitwarden.data.auth.datasource.network.api.AuthenticatedAuthRequestsApi
import com.x8bit.bitwarden.data.auth.datasource.network.model.AuthRequestsResponseJson
import com.x8bit.bitwarden.data.platform.base.BaseServiceTest
import com.x8bit.bitwarden.data.platform.util.asSuccess
import kotlinx.coroutines.test.runTest
import okhttp3.mockwebserver.MockResponse
import org.junit.jupiter.api.Assertions.assertEquals
@ -74,7 +75,7 @@ class AuthRequestsServiceTest : BaseServiceTest() {
masterPasswordHash = "verySecureHash",
isApproved = true,
)
assertEquals(Result.success(AUTH_REQUEST_RESPONSE), actual)
assertEquals(AUTH_REQUEST_RESPONSE.asSuccess(), actual)
}
@Test
@ -90,7 +91,7 @@ class AuthRequestsServiceTest : BaseServiceTest() {
val response = MockResponse().setBody(AUTH_REQUEST_RESPONSE_JSON).setResponseCode(200)
server.enqueue(response)
val actual = service.getAuthRequest(requestId = "1")
assertEquals(Result.success(AUTH_REQUEST_RESPONSE), actual)
assertEquals(AUTH_REQUEST_RESPONSE.asSuccess(), actual)
}
}

View file

@ -52,7 +52,7 @@ class IdentityServiceTest : BaseServiceTest() {
captchaToken = null,
uniqueAppId = UNIQUE_APP_ID,
)
assertEquals(Result.success(LOGIN_SUCCESS), result)
assertEquals(LOGIN_SUCCESS.asSuccess(), result)
}
@Test
@ -82,7 +82,7 @@ class IdentityServiceTest : BaseServiceTest() {
captchaToken = null,
uniqueAppId = UNIQUE_APP_ID,
)
assertEquals(Result.success(CAPTCHA_BODY), result)
assertEquals(CAPTCHA_BODY.asSuccess(), result)
}
@Test
@ -97,7 +97,7 @@ class IdentityServiceTest : BaseServiceTest() {
captchaToken = null,
uniqueAppId = UNIQUE_APP_ID,
)
assertEquals(Result.success(TWO_FACTOR_BODY), result)
assertEquals(TWO_FACTOR_BODY.asSuccess(), result)
}
@Test
@ -112,7 +112,7 @@ class IdentityServiceTest : BaseServiceTest() {
captchaToken = null,
uniqueAppId = UNIQUE_APP_ID,
)
assertEquals(Result.success(INVALID_LOGIN), result)
assertEquals(INVALID_LOGIN.asSuccess(), result)
}
@Test
@ -121,7 +121,7 @@ class IdentityServiceTest : BaseServiceTest() {
val organizationId = "organizationId"
server.enqueue(MockResponse().setResponseCode(200).setBody(PREVALIDATE_SSO_JSON))
val result = identityService.prevalidateSso(organizationId)
assertEquals(Result.success(PREVALIDATE_SSO_BODY), result)
assertEquals(PREVALIDATE_SSO_BODY.asSuccess(), result)
}
@Test

View file

@ -59,7 +59,7 @@ class OrganizationServiceTest : BaseServiceTest() {
MockResponse().setResponseCode(200).setBody(ORGANIZATION_DOMAIN_SSO_DETAILS_JSON),
)
val result = organizationService.getOrganizationDomainSsoDetails(email)
assertEquals(Result.success(ORGANIZATION_DOMAIN_SSO_BODY), result)
assertEquals(ORGANIZATION_DOMAIN_SSO_BODY.asSuccess(), result)
}
@Test
@ -78,7 +78,7 @@ class OrganizationServiceTest : BaseServiceTest() {
MockResponse().setResponseCode(200).setBody(ORGANIZATION_AUTO_ENROLL_STATUS_JSON),
)
val result = organizationService.getOrganizationAutoEnrollStatus("orgId")
assertEquals(Result.success(ORGANIZATION_AUTO_ENROLL_STATUS_RESPONSE), result)
assertEquals(ORGANIZATION_AUTO_ENROLL_STATUS_RESPONSE.asSuccess(), result)
}
@Test
@ -95,7 +95,7 @@ class OrganizationServiceTest : BaseServiceTest() {
MockResponse().setResponseCode(200).setBody(ORGANIZATION_KEYS_JSON),
)
val result = organizationService.getOrganizationKeys("orgId")
assertEquals(Result.success(ORGANIZATION_KEYS_RESPONSE), result)
assertEquals(ORGANIZATION_KEYS_RESPONSE.asSuccess(), result)
}
@Test

View file

@ -517,7 +517,7 @@ class AuthRequestManagerTest {
coEvery { authRequestsService.getAuthRequests() } returns responseJsonOne.asSuccess()
coEvery {
authRequestsService.getAuthRequest(requestId = REQUEST_ID)
} returns Result.success(authRequestsResponse)
} returns authRequestsResponse.asSuccess()
fakeAuthDiskSource.userState = SINGLE_USER_STATE
repository
@ -827,7 +827,7 @@ class AuthRequestManagerTest {
)
coEvery {
authSdkSource.getUserFingerprint(email = EMAIL, publicKey = PUBLIC_KEY)
} returns Result.success(fingerprint)
} returns fingerprint.asSuccess()
coEvery { authRequestsService.getAuthRequests() } returns responseJson.asSuccess()
fakeAuthDiskSource.userState = SINGLE_USER_STATE

View file

@ -3,6 +3,7 @@ package com.x8bit.bitwarden.data.platform.datasource.network.service
import com.x8bit.bitwarden.data.platform.base.BaseServiceTest
import com.x8bit.bitwarden.data.platform.datasource.network.api.ConfigApi
import com.x8bit.bitwarden.data.platform.datasource.network.model.ConfigResponseJson
import com.x8bit.bitwarden.data.platform.util.asSuccess
import kotlinx.coroutines.test.runTest
import okhttp3.mockwebserver.MockResponse
import org.junit.jupiter.api.Assertions.assertEquals
@ -17,7 +18,7 @@ class ConfigServiceTest : BaseServiceTest() {
@Test
fun `getConfig should call ConfigApi`() = runTest {
server.enqueue(MockResponse().setBody(CONFIG_RESPONSE_JSON))
assertEquals(Result.success(CONFIG_RESPONSE), service.getConfig())
assertEquals(CONFIG_RESPONSE.asSuccess(), service.getConfig())
}
}

View file

@ -603,7 +603,7 @@ class SettingsRepositoryTest {
vaultSdkSource.getUserFingerprint(
userId = MOCK_USER_STATE.activeUserId,
)
} returns Result.failure(Throwable())
} returns Throwable().asFailure()
val result = settingsRepository.getUserFingerprint()
@ -624,7 +624,7 @@ class SettingsRepositoryTest {
vaultSdkSource.getUserFingerprint(
userId = MOCK_USER_STATE.activeUserId,
)
} returns Result.success(fingerprint)
} returns fingerprint.asSuccess()
val result = settingsRepository.getUserFingerprint()

View file

@ -6,6 +6,7 @@ import com.bitwarden.generators.PassphraseGeneratorRequest
import com.bitwarden.generators.PasswordGeneratorRequest
import com.bitwarden.generators.UsernameGeneratorRequest
import com.bitwarden.sdk.ClientGenerators
import com.x8bit.bitwarden.data.platform.util.asSuccess
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
@ -40,7 +41,7 @@ class GeneratorSdkSourceTest {
val result = generatorSdkSource.generatePassword(request)
assertEquals(Result.success(expectedResult), result)
assertEquals(expectedResult.asSuccess(), result)
coVerify {
clientGenerators.password(request)
@ -64,7 +65,7 @@ class GeneratorSdkSourceTest {
val result = generatorSdkSource.generatePassphrase(request)
assertEquals(Result.success(expectedResult), result)
assertEquals(expectedResult.asSuccess(), result)
coVerify {
clientGenerators.passphrase(request)
@ -87,7 +88,7 @@ class GeneratorSdkSourceTest {
val result = generatorSdkSource.generatePlusAddressedEmail(request)
assertEquals(Result.success(expectedResult), result)
assertEquals(expectedResult.asSuccess(), result)
coVerify {
clientGenerators.username(request)
}
@ -109,7 +110,7 @@ class GeneratorSdkSourceTest {
val result = generatorSdkSource.generateCatchAllEmail(request)
assertEquals(Result.success(expectedResult), result)
assertEquals(expectedResult.asSuccess(), result)
coVerify {
clientGenerators.username(request)
}
@ -131,7 +132,7 @@ class GeneratorSdkSourceTest {
val result = generatorSdkSource.generateRandomWord(request)
assertEquals(Result.success(expectedResult), result)
assertEquals(expectedResult.asSuccess(), result)
coVerify {
clientGenerators.username(request)
}
@ -153,7 +154,7 @@ class GeneratorSdkSourceTest {
val result = generatorSdkSource.generateForwardedServiceEmail(request)
assertEquals(Result.success(expectedResult), result)
assertEquals(expectedResult.asSuccess(), result)
coVerify {
clientGenerators.username(request)

View file

@ -846,10 +846,7 @@ class VaultSdkSourceTest {
time = time,
)
assertEquals(
Result.success(totpResponse),
result,
)
assertEquals(totpResponse.asSuccess(), result)
coVerify {
clientVault.generateTotp(
key = "Totp",

View file

@ -5,6 +5,8 @@ import com.bitwarden.core.TotpResponse
import com.x8bit.bitwarden.data.platform.base.FakeDispatcherManager
import com.x8bit.bitwarden.data.platform.manager.dispatcher.DispatcherManager
import com.x8bit.bitwarden.data.platform.repository.model.DataState
import com.x8bit.bitwarden.data.platform.util.asFailure
import com.x8bit.bitwarden.data.platform.util.asSuccess
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockLoginView
@ -41,9 +43,9 @@ class TotpCodeManagerTest {
@Test
fun `getTotpCodeStateFlow should have loaded data with a valid values passed in`() = runTest {
val totpResponse = TotpResponse("123456", 30u)
coEvery { vaultSdkSource.generateTotp(any(), any(), any()) } returns Result.success(
totpResponse,
)
coEvery {
vaultSdkSource.generateTotp(any(), any(), any())
} returns totpResponse.asSuccess()
val expected = createVerificationCodeItem()
@ -57,9 +59,9 @@ class TotpCodeManagerTest {
fun `getTotpCodeStateFlow should have loaded data with empty list if no totp code is provided`() =
runTest {
val totpResponse = TotpResponse("123456", 30u)
coEvery { vaultSdkSource.generateTotp(any(), any(), any()) } returns Result.success(
totpResponse,
)
coEvery {
vaultSdkSource.generateTotp(any(), any(), any())
} returns totpResponse.asSuccess()
val cipherView = createMockCipherView(1).copy(
login = createMockLoginView(number = 1, clock = clock).copy(
@ -76,10 +78,9 @@ class TotpCodeManagerTest {
@Test
fun `getTotpCodesStateFlow should have loaded data with empty list if unable to generate auth code`() =
runTest {
coEvery { vaultSdkSource.generateTotp(any(), any(), any()) } returns
Result.failure(
exception = Exception(),
)
coEvery {
vaultSdkSource.generateTotp(any(), any(), any())
} returns Exception().asFailure()
val cipherView = createMockCipherView(1).copy(
login = createMockLoginView(number = 1, clock = clock).copy(
@ -96,9 +97,9 @@ class TotpCodeManagerTest {
fun `getTotpCodeStateFlow should have loaded item with a valid data passed in`() = runTest {
val totpResponse = TotpResponse("123456", 30u)
coEvery { vaultSdkSource.generateTotp(any(), any(), any()) } returns Result.success(
totpResponse,
)
coEvery {
vaultSdkSource.generateTotp(any(), any(), any())
} returns totpResponse.asSuccess()
val cipherView = createMockCipherView(1)
@ -113,9 +114,9 @@ class TotpCodeManagerTest {
fun `getTotpCodeFlow should have null data if unable to get item`() =
runTest {
val totpResponse = TotpResponse("123456", 30u)
coEvery { vaultSdkSource.generateTotp(any(), any(), any()) } returns Result.success(
totpResponse,
)
coEvery {
vaultSdkSource.generateTotp(any(), any(), any())
} returns totpResponse.asSuccess()
val cipherView = createMockCipherView(1).copy(
login = null,

View file

@ -53,7 +53,7 @@ class VaultLockManagerTest {
kdf = MOCK_PROFILE.toSdkParams(),
purpose = HashPurpose.LOCAL_AUTHORIZATION,
)
} returns Result.success("hashedPassword")
} returns "hashedPassword".asSuccess()
}
private val vaultSdkSource: VaultSdkSource = mockk {
every { clearCrypto(userId = any()) } just runs