Add synchronous refresh token API (#271)

This commit is contained in:
David Perez
2023-11-22 15:52:25 -06:00
committed by GitHub
parent 1c2413d4dc
commit ddc7b0b713
8 changed files with 200 additions and 3 deletions

View File

@@ -5,10 +5,12 @@ import com.x8bit.bitwarden.data.auth.datasource.network.model.GetTokenResponseJs
import com.x8bit.bitwarden.data.auth.datasource.network.model.KdfTypeJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.KeyConnectorUserDecryptionOptionsJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.MasterPasswordPolicyOptionsJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.RefreshTokenResponseJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.TrustedDeviceUserDecryptionOptionsJson
import com.x8bit.bitwarden.data.auth.datasource.network.model.UserDecryptionOptionsJson
import com.x8bit.bitwarden.data.platform.base.BaseServiceTest
import com.x8bit.bitwarden.data.platform.util.DeviceModelProvider
import com.x8bit.bitwarden.data.platform.util.asSuccess
import io.mockk.every
import io.mockk.mockk
import kotlinx.coroutines.test.runTest
@@ -76,12 +78,44 @@ class IdentityServiceTest : BaseServiceTest() {
assertEquals(Result.success(INVALID_LOGIN), result)
}
@Suppress("MaxLineLength")
@Test
fun `refreshTokenSynchronously when response is success should return RefreshTokenResponseJson`() {
server.enqueue(MockResponse().setResponseCode(200).setBody(REFRESH_TOKEN_JSON))
val result = identityService.refreshTokenSynchronously(refreshToken = REFRESH_TOKEN)
assertEquals(REFRESH_TOKEN_BODY.asSuccess(), result)
}
@Test
fun `refreshTokenSynchronously when response is an error should return an error`() {
server.enqueue(MockResponse().setResponseCode(400))
val result = identityService.refreshTokenSynchronously(refreshToken = REFRESH_TOKEN)
assertTrue(result.isFailure)
}
companion object {
private const val REFRESH_TOKEN = "refreshToken"
private const val EMAIL = "email"
private const val PASSWORD_HASH = "passwordHash"
}
}
private const val REFRESH_TOKEN_JSON = """
{
"access_token": "accessToken",
"expires_in": 3600,
"refresh_token": "refreshToken",
"token_type": "Bearer"
}
"""
private val REFRESH_TOKEN_BODY = RefreshTokenResponseJson(
accessToken = "accessToken",
expiresIn = 3600,
refreshToken = "refreshToken",
tokenType = "Bearer",
)
private const val CAPTCHA_BODY_JSON = """
{
"HCaptcha_SiteKey": "123"

View File

@@ -0,0 +1,59 @@
package com.x8bit.bitwarden.data.platform.datasource.network.util
import com.x8bit.bitwarden.data.platform.util.asSuccess
import io.mockk.every
import io.mockk.mockk
import okhttp3.ResponseBody.Companion.toResponseBody
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import retrofit2.Call
import retrofit2.Response
import java.io.IOException
class CallExtensionsTest {
@Test
fun `executeForResult returns failure when execute throws IOException`() {
val call = mockk<Call<Unit>> {
every { execute() } throws IOException("Fail")
}
val result = call.executeForResult()
assertTrue(result.isFailure)
}
@Test
fun `executeForResult returns failure when execute throws RuntimeException`() {
val call = mockk<Call<Unit>> {
every { execute() } throws RuntimeException("Fail")
}
val result = call.executeForResult()
assertTrue(result.isFailure)
}
@Test
fun `executeForResult returns failure when response is failure`() {
val call = mockk<Call<Unit>> {
every { execute() } returns Response.error(400, "".toResponseBody())
}
val result = call.executeForResult()
assertTrue(result.isFailure)
}
@Test
fun `executeForResult returns success when response is failure`() {
val call = mockk<Call<Unit>> {
every { execute() } returns Response.success(Unit)
}
val result = call.executeForResult()
assertEquals(Unit.asSuccess(), result)
}
}