From eaa6992209f129198a4793b37471e9cac119e12e Mon Sep 17 00:00:00 2001 From: Brian Yencho Date: Sun, 28 Jan 2024 16:56:09 -0600 Subject: [PATCH] Make CipherView.toAutofillCipherProvider public and add tests (#835) --- .../manager/AutofillCompletionManagerImpl.kt | 38 +------ .../autofill/util/CipherViewExtensions.kt | 43 ++++++++ .../autofill/util/CipherViewExtensionsTest.kt | 100 ++++++++++++++++++ 3 files changed, 144 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt create mode 100644 app/src/test/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensionsTest.kt diff --git a/app/src/main/java/com/x8bit/bitwarden/data/autofill/manager/AutofillCompletionManagerImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/autofill/manager/AutofillCompletionManagerImpl.kt index ac68e7d18a..d80015f336 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/autofill/manager/AutofillCompletionManagerImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/autofill/manager/AutofillCompletionManagerImpl.kt @@ -5,16 +5,14 @@ import android.content.Intent import com.bitwarden.core.CipherView import com.x8bit.bitwarden.data.autofill.builder.FilledDataBuilder import com.x8bit.bitwarden.data.autofill.builder.FilledDataBuilderImpl -import com.x8bit.bitwarden.data.autofill.model.AutofillCipher import com.x8bit.bitwarden.data.autofill.model.AutofillRequest import com.x8bit.bitwarden.data.autofill.parser.AutofillParser -import com.x8bit.bitwarden.data.autofill.provider.AutofillCipherProvider import com.x8bit.bitwarden.data.autofill.util.buildDataset import com.x8bit.bitwarden.data.autofill.util.createAutofillSelectionResultIntent import com.x8bit.bitwarden.data.autofill.util.getAutofillAssistStructureOrNull import com.x8bit.bitwarden.data.autofill.util.toAutofillAppInfo +import com.x8bit.bitwarden.data.autofill.util.toAutofillCipherProvider import com.x8bit.bitwarden.data.platform.manager.dispatcher.DispatcherManager -import com.x8bit.bitwarden.data.platform.util.subtitle import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -87,37 +85,3 @@ private fun Activity.setResultAndFinish(resultIntent: Intent) { this.setResult(Activity.RESULT_OK, resultIntent) this.finish() } - -private fun CipherView.toAutofillCipherProvider(): AutofillCipherProvider = - object : AutofillCipherProvider { - override suspend fun isVaultLocked(): Boolean = true - - override suspend fun getCardAutofillCiphers(): List { - val card = this@toAutofillCipherProvider.card ?: return emptyList() - return listOf( - AutofillCipher.Card( - name = name, - subtitle = subtitle.orEmpty(), - cardholderName = card.cardholderName.orEmpty(), - code = card.code.orEmpty(), - expirationMonth = card.expMonth.orEmpty(), - expirationYear = card.expYear.orEmpty(), - number = card.number.orEmpty(), - ), - ) - } - - override suspend fun getLoginAutofillCiphers( - uri: String, - ): List { - val login = this@toAutofillCipherProvider.login ?: return emptyList() - return listOf( - AutofillCipher.Login( - name = name, - password = login.password.orEmpty(), - subtitle = subtitle.orEmpty(), - username = login.username.orEmpty(), - ), - ) - } - } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt new file mode 100644 index 0000000000..297d788004 --- /dev/null +++ b/app/src/main/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt @@ -0,0 +1,43 @@ +package com.x8bit.bitwarden.data.autofill.util + +import com.bitwarden.core.CipherView +import com.x8bit.bitwarden.data.autofill.model.AutofillCipher +import com.x8bit.bitwarden.data.autofill.provider.AutofillCipherProvider +import com.x8bit.bitwarden.data.platform.util.subtitle + +/** + * Creates a single-item [AutofillCipherProvider] based on the given [CipherView]. + */ +fun CipherView.toAutofillCipherProvider(): AutofillCipherProvider = + object : AutofillCipherProvider { + override suspend fun isVaultLocked(): Boolean = false + + override suspend fun getCardAutofillCiphers(): List { + val card = this@toAutofillCipherProvider.card ?: return emptyList() + return listOf( + AutofillCipher.Card( + name = name, + subtitle = subtitle.orEmpty(), + cardholderName = card.cardholderName.orEmpty(), + code = card.code.orEmpty(), + expirationMonth = card.expMonth.orEmpty(), + expirationYear = card.expYear.orEmpty(), + number = card.number.orEmpty(), + ), + ) + } + + override suspend fun getLoginAutofillCiphers( + uri: String, + ): List { + val login = this@toAutofillCipherProvider.login ?: return emptyList() + return listOf( + AutofillCipher.Login( + name = name, + password = login.password.orEmpty(), + subtitle = subtitle.orEmpty(), + username = login.username.orEmpty(), + ), + ) + } + } diff --git a/app/src/test/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensionsTest.kt new file mode 100644 index 0000000000..fd8117c92a --- /dev/null +++ b/app/src/test/java/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensionsTest.kt @@ -0,0 +1,100 @@ +package com.x8bit.bitwarden.data.autofill.util + +import com.bitwarden.core.CipherType +import com.x8bit.bitwarden.data.autofill.model.AutofillCipher +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Test + +class CipherViewExtensionsTest { + + @Suppress("MaxLineLength") + @Test + fun `toAutofillCipherProvider should return a provider with the correct data for a Login type`() = + runTest { + val cipherView = createMockCipherView( + number = 1, + cipherType = CipherType.LOGIN, + ) + + val autofillCipherProvider = cipherView.toAutofillCipherProvider() + + assertFalse(autofillCipherProvider.isVaultLocked()) + assertEquals( + emptyList(), + autofillCipherProvider.getCardAutofillCiphers(), + ) + assertEquals( + listOf( + AutofillCipher.Login( + name = "mockName-1", + subtitle = "mockUsername-1", + password = "mockPassword-1", + username = "mockUsername-1", + ), + ), + autofillCipherProvider.getLoginAutofillCiphers(uri = "uri"), + ) + } + + @Suppress("MaxLineLength") + @Test + fun `toAutofillCipherProvider should return a provider with the correct data for a Card type`() = + runTest { + val cipherView = createMockCipherView( + number = 1, + cipherType = CipherType.CARD, + ) + + val autofillCipherProvider = cipherView.toAutofillCipherProvider() + + assertFalse(autofillCipherProvider.isVaultLocked()) + assertEquals( + emptyList(), + autofillCipherProvider.getLoginAutofillCiphers(uri = "uri"), + ) + assertEquals( + listOf( + AutofillCipher.Card( + name = "mockName-1", + subtitle = "mockBrand-1, *er-1", + cardholderName = "mockCardholderName-1", + code = "mockCode-1", + expirationMonth = "mockExpMonth-1", + expirationYear = "mockExpirationYear-1", + number = "mockNumber-1", + ), + ), + autofillCipherProvider.getCardAutofillCiphers(), + ) + } + + @Suppress("MaxLineLength") + @Test + fun `toAutofillCipherProvider should return a provider with the correct data for any other type`() = + runTest { + CipherType + .entries + .filterNot { it == CipherType.CARD } + .filterNot { it == CipherType.LOGIN } + .forEach { cipherType -> + val autofillCipherProvider = createMockCipherView( + number = 1, + cipherType = cipherType, + ) + .toAutofillCipherProvider() + + assertFalse(autofillCipherProvider.isVaultLocked()) + assertEquals( + emptyList(), + autofillCipherProvider.getCardAutofillCiphers(), + ) + assertEquals( + emptyList(), + autofillCipherProvider.getLoginAutofillCiphers(uri = "uri"), + ) + } + } +}