From 338c488faea7e2ff08aa030c484158122c2908e6 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Wed, 26 May 2021 20:22:11 -0400 Subject: [PATCH] For #19680 - Show the card number when editing a credit card (#19681) --- .../creditcards/CreditCardEditorFragment.kt | 5 +++-- .../creditcards/CreditCardEditorState.kt | 9 +++++--- .../creditcards/CreditCardEditorStateTest.kt | 15 +++++++++++-- .../creditcards/CreditCardEditorViewTest.kt | 21 ++++++++++++++----- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt index 3cd844501..7ada65405 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt @@ -49,16 +49,17 @@ class CreditCardEditorFragment : SecureFragment(R.layout.fragment_credit_card_ed showToolbar(getString(R.string.credit_cards_edit_card)) } + val storage = requireContext().components.core.autofillStorage interactor = DefaultCreditCardEditorInteractor( controller = DefaultCreditCardEditorController( - storage = requireContext().components.core.autofillStorage, + storage = storage, lifecycleScope = lifecycleScope, navController = findNavController() ) ) creditCardEditorState = - args.creditCard?.toCreditCardEditorState() ?: getInitialCreditCardEditorState() + args.creditCard?.toCreditCardEditorState(storage) ?: getInitialCreditCardEditorState() creditCardEditorView = CreditCardEditorView(view, interactor) creditCardEditorView.bind(creditCardEditorState) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt index 09dd9ab35..f3fc4c0c3 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.settings.creditcards import mozilla.components.concept.storage.CreditCard +import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment.Companion.NUMBER_OF_YEARS_TO_SHOW import java.util.Calendar @@ -30,15 +31,17 @@ data class CreditCardEditorState( /** * Returns a [CreditCardEditorState] from the given [CreditCard]. */ -fun CreditCard.toCreditCardEditorState(): CreditCardEditorState { +fun CreditCard.toCreditCardEditorState(storage: AutofillCreditCardsAddressesStorage): CreditCardEditorState { + val crypto = storage.getCreditCardCrypto() + val key = crypto.key() + val cardNumber = crypto.decrypt(key, encryptedCardNumber)?.number ?: "" val startYear = expiryYear.toInt() val endYear = startYear + NUMBER_OF_YEARS_TO_SHOW return CreditCardEditorState( guid = guid, billingName = billingName, - // TODO - need to represented a full CreditCardNumber object here, along with last4 - cardNumber = encryptedCardNumber.number, + cardNumber = cardNumber, expiryMonth = expiryMonth.toInt(), expiryYears = Pair(startYear, endYear), isEditing = true diff --git a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorStateTest.kt b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorStateTest.kt index 78d3bfde0..acda1e412 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorStateTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorStateTest.kt @@ -4,8 +4,12 @@ package org.mozilla.fenix.settings.creditcards +import io.mockk.every +import io.mockk.mockk import mozilla.components.concept.storage.CreditCard import mozilla.components.concept.storage.CreditCardNumber +import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage +import mozilla.components.service.sync.autofill.AutofillCrypto import mozilla.components.support.utils.CreditCardNetworkType import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse @@ -16,10 +20,11 @@ import java.util.Calendar class CreditCardEditorStateTest { + private val cardNumber = "4111111111111110" private val creditCard = CreditCard( guid = "id", billingName = "Banana Apple", - encryptedCardNumber = CreditCardNumber.Encrypted("4111111111111110"), + encryptedCardNumber = CreditCardNumber.Encrypted(cardNumber), cardNumberLast4 = "1110", expiryMonth = 5, expiryYear = 2030, @@ -32,7 +37,13 @@ class CreditCardEditorStateTest { @Test fun testToCreditCardEditorState() { - val state = creditCard.toCreditCardEditorState() + val storage: AutofillCreditCardsAddressesStorage = mockk(relaxed = true) + val crypto: AutofillCrypto = mockk(relaxed = true) + + every { storage.getCreditCardCrypto() } returns crypto + every { crypto.decrypt(any(), any()) } returns CreditCardNumber.Plaintext(cardNumber) + + val state = creditCard.toCreditCardEditorState(storage) val startYear = creditCard.expiryYear.toInt() val endYear = startYear + NUMBER_OF_YEARS_TO_SHOW diff --git a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt index 8fbe1390a..c27bb2874 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.settings.creditcards import android.view.LayoutInflater import android.view.View +import io.mockk.every import io.mockk.mockk import io.mockk.spyk import io.mockk.verify @@ -14,6 +15,8 @@ import mozilla.components.concept.storage.CreditCard import mozilla.components.concept.storage.CreditCardNumber import mozilla.components.concept.storage.NewCreditCardFields import mozilla.components.concept.storage.UpdatableCreditCardFields +import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage +import mozilla.components.service.sync.autofill.AutofillCrypto import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.utils.CreditCardNetworkType import org.junit.Assert.assertEquals @@ -36,11 +39,14 @@ class CreditCardEditorViewTest { private lateinit var view: View private lateinit var interactor: CreditCardEditorInteractor private lateinit var creditCardEditorView: CreditCardEditorView + private lateinit var storage: AutofillCreditCardsAddressesStorage + private lateinit var crypto: AutofillCrypto + private val cardNumber = "4111111111111111" private val creditCard = CreditCard( guid = "id", billingName = "Banana Apple", - encryptedCardNumber = CreditCardNumber.Encrypted("4111111111111111"), + encryptedCardNumber = CreditCardNumber.Encrypted(cardNumber), cardNumberLast4 = "1111", expiryMonth = 5, expiryYear = 2030, @@ -55,6 +61,11 @@ class CreditCardEditorViewTest { fun setup() { view = LayoutInflater.from(testContext).inflate(R.layout.fragment_credit_card_editor, null) interactor = mockk(relaxed = true) + storage = mockk(relaxed = true) + crypto = mockk(relaxed = true) + + every { storage.getCreditCardCrypto() } returns crypto + every { crypto.decrypt(any(), any()) } returns CreditCardNumber.Plaintext(cardNumber) creditCardEditorView = spyk(CreditCardEditorView(view, interactor)) } @@ -87,9 +98,9 @@ class CreditCardEditorViewTest { @Test fun `GIVEN a credit card THEN credit card form inputs are displaying the provided credit card information`() { - creditCardEditorView.bind(creditCard.toCreditCardEditorState()) + creditCardEditorView.bind(creditCard.toCreditCardEditorState(storage)) - assertEquals(creditCard.encryptedCardNumber.number, view.card_number_input.text.toString()) + assertEquals(cardNumber, view.card_number_input.text.toString()) assertEquals(creditCard.billingName, view.name_on_card_input.text.toString()) with(view.expiry_month_drop_down) { @@ -108,7 +119,7 @@ class CreditCardEditorViewTest { @Test fun `GIVEN a credit card WHEN the delete card button is clicked THEN interactor is called`() { - creditCardEditorView.bind(creditCard.toCreditCardEditorState()) + creditCardEditorView.bind(creditCard.toCreditCardEditorState(storage)) assertEquals(View.VISIBLE, view.delete_button.visibility) @@ -202,7 +213,7 @@ class CreditCardEditorViewTest { @Test fun `GIVEN a valid credit card WHEN the save button is clicked THEN interactor is called`() { - creditCardEditorView.bind(creditCard.toCreditCardEditorState()) + creditCardEditorView.bind(creditCard.toCreditCardEditorState(storage)) view.save_button.performClick()