mirror of
https://github.com/bitwarden/android.git
synced 2026-06-02 02:36:58 -05:00
BIT-332: Launch web view for hcaptchca (#73)
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user