Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package com.x8bit.bitwarden.data.auth.repository.util

import android.content.Intent
import android.net.Uri
import com.bitwarden.ui.platform.base.BaseRobolectricTest
import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Test
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test

class SsoUtilsTest {
class SsoUtilsTest : BaseRobolectricTest() {

@Test
fun `generateUriForSso should generate the correct URI`() {
Expand All @@ -20,7 +21,7 @@ class SsoUtilsTest {
val codeVerifier = "test_code_verifier"
val expectedUrl = "https://identity.bitwarden.com/connect/authorize" +
"?client_id=mobile" +
"&redirect_uri=bitwarden%3A%2F%2Fsso-callback" +
"&redirect_uri=https%3A%2F%2Fbitwarden.com%2Fsso-callback" +
"&response_type=code" +
"&scope=api%20offline_access" +
"&state=test_state" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ package com.x8bit.bitwarden.data.auth.repository.util

import android.content.Intent
import android.net.Uri
import com.bitwarden.ui.platform.base.BaseRobolectricTest
import com.bitwarden.ui.platform.manager.intent.model.AuthTabData
import io.mockk.every
import io.mockk.mockk
import kotlinx.serialization.json.JsonObject
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import org.junit.Assert.assertEquals
import org.junit.Test

class WebAuthUtilsTest {
class WebAuthUtilsTest : BaseRobolectricTest() {

@Test
fun `generateUriForWebAuth should return valid Uri`() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ package com.x8bit.bitwarden.data.autofill.accessibility.parser
import android.net.Uri
import android.view.accessibility.AccessibilityNodeInfo
import androidx.core.net.toUri
import com.bitwarden.ui.platform.base.BaseRobolectricTest
import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilityNodeInfoManager
import com.x8bit.bitwarden.data.autofill.accessibility.model.Browser
import com.x8bit.bitwarden.data.autofill.accessibility.model.FillableFields
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Test
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test

class AccessibilityParserTest {
class AccessibilityParserTest : BaseRobolectricTest() {

private val accessibilityNodeInfoManager: AccessibilityNodeInfoManager = mockk()

Expand Down Expand Up @@ -142,12 +143,13 @@ class AccessibilityParserTest {
@Suppress("MaxLineLength")
@Test
fun `parseForUriOrPackageName should return null when package is a supported browser and URL bar is not found`() {
val testBrowser = Browser(packageName = "com.android.chrome", urlFieldId = "url_bar")
val testPackageName = "com.android.chrome"
val testBrowser = Browser(packageName = testPackageName, urlFieldId = "url_bar")
val rootNode = mockk<AccessibilityNodeInfo> {
every { packageName } returns testBrowser.packageName
every { packageName } returns testPackageName
every {
findAccessibilityNodeInfosByViewId(
"$packageName:id/${testBrowser.possibleUrlFieldIds.first()}",
"$testPackageName:id/${testBrowser.possibleUrlFieldIds.first()}",
)
} returns emptyList()
}
Expand All @@ -160,16 +162,17 @@ class AccessibilityParserTest {
@Suppress("MaxLineLength")
@Test
fun `parseForUriOrPackageName should return null when URL bar node has no text or content description`() {
val testBrowser = Browser(packageName = "com.android.chrome", urlFieldId = "url_bar")
val testPackageName = "com.android.chrome"
val testBrowser = Browser(packageName = testPackageName, urlFieldId = "url_bar")
val emptyNode = mockk<AccessibilityNodeInfo> {
every { text } returns null
every { contentDescription } returns null
}
val rootNode = mockk<AccessibilityNodeInfo> {
every { packageName } returns testBrowser.packageName
every { packageName } returns testPackageName
every {
findAccessibilityNodeInfosByViewId(
"${testBrowser.packageName}:id/${testBrowser.possibleUrlFieldIds.first()}",
"$testPackageName:id/${testBrowser.possibleUrlFieldIds.first()}",
)
} returns listOf(emptyNode)
}
Expand Down Expand Up @@ -246,7 +249,7 @@ class AccessibilityParserTest {
predicate = any(),
)
} returns listOf(urlNode)
val expectedResult = "https://www.reddit.com".toUri()
val expectedResult = Uri.parse("https://www.reddit.com")

val result = accessibilityParser.parseForUriOrPackageName(rootNode = rootNode)

Expand All @@ -256,16 +259,17 @@ class AccessibilityParserTest {
@Suppress("MaxLineLength")
@Test
fun `parseForUriOrPackageName should return the site url un-augmented with https protocol as a URI when package is a supported browser and URL is found`() {
val testBrowser = Browser(packageName = "com.android.chrome", urlFieldId = "url_bar")
val testPackageName = "com.android.chrome"
val testBrowser = Browser(packageName = testPackageName, urlFieldId = "url_bar")
val url = "https://www.google.com"
val urlNode = mockk<AccessibilityNodeInfo> {
every { text } returns url
}
val rootNode = mockk<AccessibilityNodeInfo> {
every { packageName } returns testBrowser.packageName
every { packageName } returns testPackageName
every {
findAccessibilityNodeInfosByViewId(
"$packageName:id/${testBrowser.possibleUrlFieldIds.first()}",
"$testPackageName:id/${testBrowser.possibleUrlFieldIds.first()}",
)
} returns listOf(urlNode)
}
Expand All @@ -279,16 +283,17 @@ class AccessibilityParserTest {
@Suppress("MaxLineLength")
@Test
fun `parseForUriOrPackageName should return the site url un-augmented with http protocol as a URI when package is a supported browser and URL is found`() {
val testBrowser = Browser(packageName = "com.android.chrome", urlFieldId = "url_bar")
val testPackageName = "com.android.chrome"
val testBrowser = Browser(packageName = testPackageName, urlFieldId = "url_bar")
val url = "http://www.google.com"
val urlNode = mockk<AccessibilityNodeInfo> {
every { text } returns url
}
val rootNode = mockk<AccessibilityNodeInfo> {
every { packageName } returns testBrowser.packageName
every { packageName } returns testPackageName
every {
findAccessibilityNodeInfosByViewId(
"$packageName:id/${testBrowser.possibleUrlFieldIds.first()}",
"$testPackageName:id/${testBrowser.possibleUrlFieldIds.first()}",
)
} returns listOf(urlNode)
}
Expand All @@ -302,16 +307,17 @@ class AccessibilityParserTest {
@Suppress("MaxLineLength")
@Test
fun `parseForUriOrPackageName should return the site url augmented with https protocol as a URI when package is a supported browser and URL is found`() {
val testBrowser = Browser(packageName = "com.android.chrome", urlFieldId = "url_bar")
val testPackageName = "com.android.chrome"
val testBrowser = Browser(packageName = testPackageName, urlFieldId = "url_bar")
val url = "www.google.com"
val urlNode = mockk<AccessibilityNodeInfo> {
every { text } returns url
}
val rootNode = mockk<AccessibilityNodeInfo> {
every { packageName } returns testBrowser.packageName
every { packageName } returns testPackageName
every {
findAccessibilityNodeInfosByViewId(
"$packageName:id/${testBrowser.possibleUrlFieldIds.first()}",
"$testPackageName:id/${testBrowser.possibleUrlFieldIds.first()}",
)
} returns listOf(urlNode)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ class CertificateManagerTest {
environmentRepository = mockEnvironmentRepository,
context = mockContext,
)

@BeforeEach
fun setUp() {
mockkStatic(KeyStore::class, KeyChain::class)
Expand Down Expand Up @@ -130,6 +131,9 @@ class CertificateManagerTest {

@Test
fun `mutualTlsCertificate should return null when keyUri is invalid`() {
every {
mockEnvironment.environmentUrlData
} returns DEFAULT_ENV_URL_DATA.copy(keyUri = null)
assertNull(certificateManager.mutualTlsCertificate)
}

Expand Down Expand Up @@ -667,6 +671,7 @@ class CertificateManagerTest {

@Test
fun `getCertificateChain should return null when mutualTlsCertificate is null`() {
setupMockUri(authority = "")
assertNull(certificateManager.getCertificateChain("mockAlias"))
}

Expand All @@ -684,6 +689,7 @@ class CertificateManagerTest {

@Test
fun `getPrivateKey should return null when mutualTlsCertificate is null`() {
setupMockUri(authority = "")
assertNull(certificateManager.getPrivateKey("mockAlias"))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class RecordedLogsViewModelTest : BaseViewModelTest() {
File::toURI,
Uri::parse,
)
every { Uri.parse(any()) } returns mockk()
}

@AfterEach
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.bitwarden.authenticator.data.authenticator.repository

import android.net.Uri
import android.text.TextUtils
import app.cash.turbine.test
import com.bitwarden.authenticator.data.authenticator.datasource.disk.util.FakeAuthenticatorDiskSource
import com.bitwarden.authenticator.data.authenticator.datasource.entity.createMockAuthenticatorItemEntity
Expand All @@ -24,6 +25,8 @@ import com.bitwarden.authenticatorbridge.manager.model.AccountSyncState
import com.bitwarden.authenticatorbridge.model.SharedAccountData
import com.bitwarden.core.data.manager.dispatcher.FakeDispatcherManager
import com.bitwarden.core.data.repository.model.DataState
import com.bitwarden.core.data.util.asFailure
import com.bitwarden.core.data.util.asSuccess
import com.bitwarden.core.data.util.mockBuilder
import com.bitwarden.data.manager.file.FileManager
import com.bitwarden.ui.platform.model.FileData
Expand Down Expand Up @@ -86,13 +89,16 @@ class AuthenticatorRepositoryTest {
mockBuilder<Uri.Builder> { it.appendPath(any()) }
mockBuilder<Uri.Builder> { it.appendQueryParameter(any(), any()) }
every { anyConstructed<Uri.Builder>().build() } returns mockBuiltUri
mockkStatic(TextUtils::htmlEncode)
every { TextUtils.htmlEncode(any()) } returns ""
}

@AfterEach
fun teardown() {
unmockkStatic(Uri::class)
unmockkStatic(List<SharedAccountData.Account>::toAuthenticatorItems)
unmockkConstructor(Uri.Builder::class)
unmockkStatic(TextUtils::htmlEncode)
}

@Test
Expand Down Expand Up @@ -396,7 +402,7 @@ class AuthenticatorRepositoryTest {

coEvery {
mockFileManager.uriToByteArray(mockUri)
} returns Result.success(testByteArray)
} returns testByteArray.asSuccess()

coEvery {
mockImportManager.import(
Expand Down Expand Up @@ -424,7 +430,7 @@ class AuthenticatorRepositoryTest {

coEvery {
mockFileManager.uriToByteArray(mockUri)
} returns Result.failure(RuntimeException("File read error"))
} returns RuntimeException("File read error").asFailure()

val result = authenticatorRepository.importVaultData(
format = ImportFileFormat.BITWARDEN_JSON,
Expand All @@ -446,7 +452,7 @@ class AuthenticatorRepositoryTest {

coEvery {
mockFileManager.uriToByteArray(mockUri)
} returns Result.success(testByteArray)
} returns testByteArray.asSuccess()

coEvery {
mockImportManager.import(
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ androidxBiometrics = "1.2.0-alpha05"
androidxBrowser = "1.10.0"
androidxCamera = "1.6.1"
androidxComposeBom = "2026.06.00"
androidxCore = "1.18.0"
androidxCore = "1.19.0"
androidxCredentials = "1.6.0"
androidxCredentialsProviderEvents = "1.0.0-alpha06"
androidxHiltNavigationCompose = "1.3.0"
Expand Down
Loading