BIT-332: Launch web view for hcaptchca (#73)

This commit is contained in:
Ramsey Smith
2023-09-28 14:19:14 -06:00
committed by GitHub
parent 3a24378fcd
commit 43a476ad78
7 changed files with 164 additions and 2 deletions

View File

@@ -0,0 +1,22 @@
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 org.junit.Assert.assertEquals
import org.junit.Test
class LoginResultExtensionsTest {
@Test
fun `generateIntentForCaptcha should return valid Intent`() {
val captchaRequired = LoginResult.CaptchaRequired("testCaptchaId")
val intent = captchaRequired.generateIntentForCaptcha()
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)
}
}

View File

@@ -1,9 +1,11 @@
package com.x8bit.bitwarden.ui.auth.feature.login
import android.content.Intent
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.util.IntentHandler
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@@ -85,4 +87,30 @@ class LoginScreenTest : BaseComposeTest() {
}
assertTrue(onNavigateToLandingCalled)
}
@Test
fun `NavigateToCaptcha should call intentHandler startActivity`() {
val intentHandler = mockk<IntentHandler>(relaxed = true) {
every { startActivity(any()) } returns Unit
}
val mockIntent = mockk<Intent>()
val viewModel = mockk<LoginViewModel>(relaxed = true) {
every { eventFlow } returns flowOf(LoginEvent.NavigateToCaptcha(mockIntent))
every { stateFlow } returns MutableStateFlow(
LoginState(
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
),
)
}
composeTestRule.setContent {
LoginScreen(
onNavigateToLanding = {},
intentHandler = intentHandler,
viewModel = viewModel,
)
}
verify { intentHandler.startActivity(mockIntent) }
}
}

View File

@@ -1,15 +1,22 @@
package com.x8bit.bitwarden.ui.auth.feature.login
import android.content.Intent
import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.x8bit.bitwarden.data.auth.datasource.network.model.LoginResult
import com.x8bit.bitwarden.data.auth.datasource.network.util.generateIntentForCaptcha
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.unmockkStatic
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
class LoginViewModelTest : BaseViewModelTest() {
@@ -18,6 +25,16 @@ class LoginViewModelTest : BaseViewModelTest() {
it["email_address"] = "test@gmail.com"
}
@BeforeEach
fun setUp() {
mockkStatic(LOGIN_RESULT_PATH)
}
@AfterEach
fun tearDown() {
unmockkStatic(LOGIN_RESULT_PATH)
}
@Test
fun `initial state should be correct`() = runTest {
val viewModel = LoginViewModel(
@@ -87,6 +104,33 @@ class LoginViewModelTest : BaseViewModelTest() {
}
}
@Test
fun `LoginButtonClick login returns CaptchaRequired should emit NavigateToCaptcha`() =
runTest {
val mockkIntent = mockk<Intent>()
every {
LoginResult
.CaptchaRequired(captchaId = "mock_captcha_id")
.generateIntentForCaptcha()
} returns mockkIntent
val authRepository = mockk<AuthRepository> {
coEvery { login("test@gmail.com", "") } returns
LoginResult.CaptchaRequired(captchaId = "mock_captcha_id")
}
val viewModel = LoginViewModel(
authRepository = authRepository,
savedStateHandle = savedStateHandle,
)
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LoginAction.LoginButtonClick)
assertEquals(DEFAULT_STATE, viewModel.stateFlow.value)
assertEquals(LoginEvent.NavigateToCaptcha(intent = mockkIntent), awaitItem())
}
coVerify {
authRepository.login(email = "test@gmail.com", password = "")
}
}
@Test
fun `SingleSignOnClick should do nothing`() = runTest {
val viewModel = LoginViewModel(
@@ -136,5 +180,8 @@ class LoginViewModelTest : BaseViewModelTest() {
passwordInput = "",
isLoginButtonEnabled = true,
)
private const val LOGIN_RESULT_PATH =
"com.x8bit.bitwarden.data.auth.datasource.network.util.LoginResultExtensionsKt"
}
}