mirror of
https://github.com/bitwarden/android.git
synced 2026-03-22 06:11:38 -05:00
PM-19283: Propagate error from email token and known device flows (#4879)
This commit is contained in:
@@ -1218,8 +1218,8 @@ class AuthRepositoryImpl(
|
||||
deviceId = authDiskSource.uniqueAppId,
|
||||
)
|
||||
.fold(
|
||||
onFailure = { KnownDeviceResult.Error },
|
||||
onSuccess = { KnownDeviceResult.Success(it) },
|
||||
onFailure = { KnownDeviceResult.Error(error = it) },
|
||||
onSuccess = { KnownDeviceResult.Success(isKnownDevice = it) },
|
||||
)
|
||||
|
||||
override suspend fun getPasswordBreachCount(password: String): BreachCountResult =
|
||||
@@ -1362,15 +1362,13 @@ class AuthRepositoryImpl(
|
||||
when (val json = it) {
|
||||
VerifyEmailTokenResponseJson.Valid -> EmailTokenResult.Success
|
||||
is VerifyEmailTokenResponseJson.Invalid -> {
|
||||
EmailTokenResult.Error(json.message)
|
||||
EmailTokenResult.Error(message = json.message, error = null)
|
||||
}
|
||||
|
||||
VerifyEmailTokenResponseJson.TokenExpired -> EmailTokenResult.Expired
|
||||
}
|
||||
},
|
||||
onFailure = {
|
||||
EmailTokenResult.Error(message = null)
|
||||
},
|
||||
onFailure = { EmailTokenResult.Error(message = null, error = it) },
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -18,5 +18,8 @@ sealed class EmailTokenResult {
|
||||
/**
|
||||
* There was an error validating the token.
|
||||
*/
|
||||
data class Error(val message: String?) : EmailTokenResult()
|
||||
data class Error(
|
||||
val message: String?,
|
||||
val error: Throwable?,
|
||||
) : EmailTokenResult()
|
||||
}
|
||||
|
||||
@@ -12,5 +12,7 @@ sealed class KnownDeviceResult {
|
||||
/**
|
||||
* There was an error determining if this is a known device.
|
||||
*/
|
||||
data object Error : KnownDeviceResult()
|
||||
data class Error(
|
||||
val error: Throwable,
|
||||
) : KnownDeviceResult()
|
||||
}
|
||||
|
||||
@@ -558,11 +558,8 @@ class MainViewModelTest : BaseViewModelTest() {
|
||||
)
|
||||
every { authRepository.activeUserId } returns null
|
||||
coEvery {
|
||||
authRepository.validateEmailToken(
|
||||
intentEmail,
|
||||
token,
|
||||
)
|
||||
} returns EmailTokenResult.Error(message = null)
|
||||
authRepository.validateEmailToken(email = intentEmail, token = token)
|
||||
} returns EmailTokenResult.Error(message = null, error = Throwable("Fail!"))
|
||||
|
||||
viewModel.eventFlow.test {
|
||||
// We skip the first 2 events because they are the default appTheme and appLanguage
|
||||
@@ -595,11 +592,8 @@ class MainViewModelTest : BaseViewModelTest() {
|
||||
|
||||
val expectedMessage = "expectedMessage"
|
||||
coEvery {
|
||||
authRepository.validateEmailToken(
|
||||
intentEmail,
|
||||
token,
|
||||
)
|
||||
} returns EmailTokenResult.Error(message = expectedMessage)
|
||||
authRepository.validateEmailToken(email = intentEmail, token = token)
|
||||
} returns EmailTokenResult.Error(message = expectedMessage, error = null)
|
||||
|
||||
viewModel.eventFlow.test {
|
||||
// We skip the first 2 events because they are the default appTheme and appLanguage
|
||||
|
||||
@@ -5662,16 +5662,17 @@ class AuthRepositoryTest {
|
||||
|
||||
@Test
|
||||
fun `getIsKnownDevice should return failure when service returns failure`() = runTest {
|
||||
val error = Throwable("Fail!")
|
||||
coEvery {
|
||||
devicesService.getIsKnownDevice(EMAIL, UNIQUE_APP_ID)
|
||||
} returns Throwable("Fail").asFailure()
|
||||
} returns error.asFailure()
|
||||
|
||||
val result = repository.getIsKnownDevice(EMAIL)
|
||||
|
||||
coVerify(exactly = 1) {
|
||||
devicesService.getIsKnownDevice(EMAIL, UNIQUE_APP_ID)
|
||||
}
|
||||
assertEquals(KnownDeviceResult.Error, result)
|
||||
assertEquals(KnownDeviceResult.Error(error = error), result)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -6286,39 +6287,38 @@ class AuthRepositoryTest {
|
||||
runTest {
|
||||
val errorMessage = "I haven't heard of second breakfast."
|
||||
coEvery {
|
||||
identityService
|
||||
.verifyEmailRegistrationToken(
|
||||
body = VerifyEmailTokenRequestJson(
|
||||
email = EMAIL,
|
||||
token = EMAIL_VERIFICATION_TOKEN,
|
||||
),
|
||||
)
|
||||
identityService.verifyEmailRegistrationToken(
|
||||
body = VerifyEmailTokenRequestJson(
|
||||
email = EMAIL,
|
||||
token = EMAIL_VERIFICATION_TOKEN,
|
||||
),
|
||||
)
|
||||
} returns VerifyEmailTokenResponseJson.Invalid(message = errorMessage).asSuccess()
|
||||
|
||||
val emailTokenResult = repository.validateEmailToken(EMAIL, EMAIL_VERIFICATION_TOKEN)
|
||||
|
||||
assertEquals(
|
||||
EmailTokenResult.Error(message = errorMessage),
|
||||
EmailTokenResult.Error(message = errorMessage, error = null),
|
||||
emailTokenResult,
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `validateEmailToken should return error result when service returns failure`() = runTest {
|
||||
val error = Throwable("Fail!")
|
||||
coEvery {
|
||||
identityService
|
||||
.verifyEmailRegistrationToken(
|
||||
body = VerifyEmailTokenRequestJson(
|
||||
email = EMAIL,
|
||||
token = EMAIL_VERIFICATION_TOKEN,
|
||||
),
|
||||
)
|
||||
} returns Exception().asFailure()
|
||||
identityService.verifyEmailRegistrationToken(
|
||||
body = VerifyEmailTokenRequestJson(
|
||||
email = EMAIL,
|
||||
token = EMAIL_VERIFICATION_TOKEN,
|
||||
),
|
||||
)
|
||||
} returns error.asFailure()
|
||||
|
||||
val emailTokenResult = repository.validateEmailToken(EMAIL, EMAIL_VERIFICATION_TOKEN)
|
||||
|
||||
assertEquals(
|
||||
EmailTokenResult.Error(message = null),
|
||||
EmailTokenResult.Error(message = null, error = error),
|
||||
emailTokenResult,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ class LoginViewModelTest : BaseViewModelTest() {
|
||||
fun `should have default state when isKnownDevice returns error`() = runTest {
|
||||
coEvery {
|
||||
authRepository.getIsKnownDevice(EMAIL)
|
||||
} returns KnownDeviceResult.Error
|
||||
} returns KnownDeviceResult.Error(error = Throwable("Fail!"))
|
||||
val viewModel = createViewModel()
|
||||
|
||||
viewModel.stateFlow.test {
|
||||
|
||||
Reference in New Issue
Block a user