BIT-764: Chrome Custom Tabs for hcpatcha verification (#105)

This commit is contained in:
Ramsey Smith
2023-10-11 09:37:03 -06:00
committed by GitHub
parent 56a8674958
commit 224fc9a2f4
10 changed files with 52 additions and 28 deletions

View File

@@ -3,23 +3,25 @@ package com.x8bit.bitwarden.data.auth.datasource.network.util
import android.content.Intent
import android.net.Uri
import com.x8bit.bitwarden.data.auth.datasource.network.model.LoginResult
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import io.mockk.every
import io.mockk.mockk
import org.junit.Assert.assertEquals
import org.junit.Test
class LoginResultExtensionsTest {
class LoginResultExtensionsTest : BaseComposeTest() {
@Test
fun `generateIntentForCaptcha should return valid Intent`() {
fun `generateIntentForCaptcha should return valid Uri`() {
val captchaRequired = LoginResult.CaptchaRequired("testCaptchaId")
val intent = captchaRequired.generateIntentForCaptcha()
val actualUri = captchaRequired.generateUriForCaptcha()
val expectedUrl = "https://vault.bitwarden.com/captcha-mobile-connector.html" +
"?data=eyJzaXRlS2V5IjoidGVzdENhcHRjaGkxZGQiLCJsb2NhbGUiOiJlbl9VUyJ9" +
"&parent=bitwarden%3A%2F%2Fcaptcha-callback&v=1"
val expectedIntent = Intent(Intent.ACTION_VIEW, Uri.parse(expectedUrl))
assertEquals(expectedIntent.action, intent.action)
assertEquals(expectedIntent.data, intent.data)
"?data=eyJzaXRlS2V5IjoidGVzdENhcHRjaGFJZCIsImxvY2FsZSI6ImVuX1VTIiwiY2Fsb" +
"GJhY2tVcmkiOiJiaXR3YXJkZW46Ly9jYXB0Y2hhLWNhbGxiYWNrIiwiY2FwdGNoYVJlcXVp" +
"cmVkVGV4dCI6IkNhcHRjaGEgcmVxdWlyZWQifQ==&parent=bitwarden%3A%2F%2F" +
"captcha-callback&v=1"
val expectedUri = Uri.parse(expectedUrl)
assertEquals(expectedUri, actualUri)
}
@Test

View File

@@ -1,6 +1,6 @@
package com.x8bit.bitwarden.ui.auth.feature.login
import android.content.Intent
import android.net.Uri
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.filter
import androidx.compose.ui.test.filterToOne
@@ -200,13 +200,13 @@ class LoginScreenTest : BaseComposeTest() {
}
@Test
fun `NavigateToCaptcha should call intentHandler startActivity`() {
fun `NavigateToCaptcha should call intentHandler startCustomTabsActivity`() {
val intentHandler = mockk<IntentHandler>(relaxed = true) {
every { startActivity(any()) } returns Unit
every { startCustomTabsActivity(any()) } returns Unit
}
val mockIntent = mockk<Intent>()
val mockUri = mockk<Uri>()
val viewModel = mockk<LoginViewModel>(relaxed = true) {
every { eventFlow } returns flowOf(LoginEvent.NavigateToCaptcha(mockIntent))
every { eventFlow } returns flowOf(LoginEvent.NavigateToCaptcha(mockUri))
every { stateFlow } returns MutableStateFlow(
LoginState(
emailAddress = "",
@@ -225,6 +225,6 @@ class LoginScreenTest : BaseComposeTest() {
viewModel = viewModel,
)
}
verify { intentHandler.startActivity(mockIntent) }
verify { intentHandler.startCustomTabsActivity(mockUri) }
}
}

View File

@@ -1,12 +1,12 @@
package com.x8bit.bitwarden.ui.auth.feature.login
import android.content.Intent
import android.net.Uri
import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.datasource.network.model.LoginResult
import com.x8bit.bitwarden.data.auth.datasource.network.util.CaptchaCallbackTokenResult
import com.x8bit.bitwarden.data.auth.datasource.network.util.generateIntentForCaptcha
import com.x8bit.bitwarden.data.auth.datasource.network.util.generateUriForCaptcha
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
import com.x8bit.bitwarden.ui.platform.base.util.asText
@@ -174,12 +174,12 @@ class LoginViewModelTest : BaseViewModelTest() {
@Test
fun `LoginButtonClick login returns CaptchaRequired should emit NavigateToCaptcha`() =
runTest {
val mockkIntent = mockk<Intent>()
val mockkUri = mockk<Uri>()
every {
LoginResult
.CaptchaRequired(captchaId = "mock_captcha_id")
.generateIntentForCaptcha()
} returns mockkIntent
.generateUriForCaptcha()
} returns mockkUri
val authRepository = mockk<AuthRepository> {
coEvery { login("test@gmail.com", "", captchaToken = null) } returns
LoginResult.CaptchaRequired(captchaId = "mock_captcha_id")
@@ -192,7 +192,7 @@ class LoginViewModelTest : BaseViewModelTest() {
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LoginAction.LoginButtonClick)
assertEquals(DEFAULT_STATE, viewModel.stateFlow.value)
assertEquals(LoginEvent.NavigateToCaptcha(intent = mockkIntent), awaitItem())
assertEquals(LoginEvent.NavigateToCaptcha(uri = mockkUri), awaitItem())
}
coVerify {
authRepository.login(email = "test@gmail.com", password = "", captchaToken = null)