PM-19283: Propagate error from email token and known device flows (#4879)

This commit is contained in:
David Perez
2025-03-17 12:47:07 -05:00
committed by GitHub
parent 869a3b00a5
commit b20eece3aa
6 changed files with 35 additions and 38 deletions

View File

@@ -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) },
)
}

View File

@@ -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()
}

View File

@@ -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()
}

View File

@@ -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

View File

@@ -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,
)
}

View File

@@ -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 {