For #18274 - [Edit card] Update a saved credit card information (#19032)

upstream-sync
Gabriel Luong 3 years ago committed by GitHub
parent f7c56ee6fa
commit 2e562579ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -75,28 +75,26 @@ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor)
true
}
R.id.save_credit_card_button -> {
saveCreditCard()
true
}
else -> false
}
/**
* Helper function called by the the "Save" button and menu item to save a new credit card
* from the entered credit card fields.
*/
private fun saveCreditCard() {
view?.hideKeyboard()
view?.hideKeyboard()
interactor.onSaveButtonClicked(
UpdatableCreditCardFields(
val creditCard = args.creditCard
val creditCardFields = UpdatableCreditCardFields(
billingName = name_on_card_input.text.toString(),
cardNumber = card_number_input.text.toString(),
expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(),
expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(),
cardType = CARD_TYPE_PLACEHOLDER
)
)
if (creditCard != null) {
interactor.onUpdateCreditCard(creditCard.guid, creditCardFields)
} else {
interactor.onSaveCreditCard(creditCardFields)
}
true
}
else -> false
}
companion object {

@ -11,6 +11,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import mozilla.components.concept.storage.UpdatableCreditCardFields
import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage
import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment
import org.mozilla.fenix.settings.creditcards.interactor.CreditCardEditorInteractor
/**
* [CreditCardEditorFragment] controller. An interface that handles the view manipulation of the
@ -29,9 +31,14 @@ interface CreditCardEditorController {
fun handleDeleteCreditCard(guid: String)
/**
* @see [CreditCardEditorInteractor.onSaveButtonClicked]
* @see [CreditCardEditorInteractor.onSaveCreditCard]
*/
fun handleSaveCreditCard(creditCardFields: UpdatableCreditCardFields)
/**
* @see [CreditCardEditorInteractor.onUpdateCreditCard]
*/
fun handleUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields)
}
/**
@ -73,4 +80,14 @@ class DefaultCreditCardEditorController(
}
}
}
override fun handleUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields) {
lifecycleScope.launch(ioDispatcher) {
storage.updateCreditCard(guid, creditCardFields)
lifecycleScope.launch(Dispatchers.Main) {
navController.popBackStack()
}
}
}
}

@ -7,7 +7,9 @@ package org.mozilla.fenix.settings.creditcards.controller
import androidx.navigation.NavController
import mozilla.components.concept.storage.CreditCard
import org.mozilla.fenix.ext.navigateBlockingForAsyncNavGraph
import org.mozilla.fenix.settings.creditcards.CreditCardsManagementFragment
import org.mozilla.fenix.settings.creditcards.CreditCardsManagementFragmentDirections
import org.mozilla.fenix.settings.creditcards.interactor.CreditCardsManagementInteractor
/**
* [CreditCardsManagementFragment] controller. An interface that handles the view manipulation of

@ -32,7 +32,16 @@ interface CreditCardEditorInteractor {
*
* @param creditCardFields A [UpdatableCreditCardFields] record to add.
*/
fun onSaveButtonClicked(creditCardFields: UpdatableCreditCardFields)
fun onSaveCreditCard(creditCardFields: UpdatableCreditCardFields)
/**
* Updates the provided credit card with the new credit card fields. Called when a user
* taps on the save menu item or "Save" button when editing an existing credit card.
*
* @param guid Unique identifier for the desired credit card.
* @param creditCardFields The credit card fields to update.
*/
fun onUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields)
}
/**
@ -53,7 +62,11 @@ class DefaultCreditCardEditorInteractor(
controller.handleDeleteCreditCard(guid)
}
override fun onSaveButtonClicked(creditCardFields: UpdatableCreditCardFields) {
override fun onSaveCreditCard(creditCardFields: UpdatableCreditCardFields) {
controller.handleSaveCreditCard(creditCardFields)
}
override fun onUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields) {
controller.handleUpdateCreditCard(guid, creditCardFields)
}
}

@ -46,7 +46,21 @@ class CreditCardEditorView(
}
save_button.setOnClickListener {
saveCreditCard()
containerView.hideKeyboard()
val creditCardFields = UpdatableCreditCardFields(
billingName = name_on_card_input.text.toString(),
cardNumber = card_number_input.text.toString(),
expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(),
expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(),
cardType = CARD_TYPE_PLACEHOLDER
)
if (state.isEditing) {
interactor.onUpdateCreditCard(state.guid, creditCardFields)
} else {
interactor.onSaveCreditCard(creditCardFields)
}
}
card_number_input.text = state.cardNumber.toEditable()
@ -97,24 +111,6 @@ class CreditCardEditorView(
expiry_year_drop_down.adapter = adapter
}
/**
* Helper function called by the the "Save" button and menu item to save a new credit card
* from the entered credit card fields.
*/
private fun saveCreditCard() {
containerView.hideKeyboard()
interactor.onSaveButtonClicked(
UpdatableCreditCardFields(
billingName = name_on_card_input.text.toString(),
cardNumber = card_number_input.text.toString(),
expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(),
expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(),
cardType = CARD_TYPE_PLACEHOLDER
)
)
}
companion object {
// Number of months in a year (0-indexed).
const val NUMBER_OF_MONTHS = 11

@ -17,6 +17,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.toEditable
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment.Companion.CARD_TYPE_PLACEHOLDER
import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment.Companion.NUMBER_OF_YEARS_TO_SHOW
@ -119,6 +120,36 @@ class CreditCardEditorViewTest {
verify { interactor.onCancelButtonClicked() }
}
@Test
fun `GIVEN the credit input are filled WHEN the save button is clicked THEN interactor is called`() {
creditCardEditorView.bind(getInitialCreditCardEditorState())
val calendar = Calendar.getInstance()
val billingName = "Banana Apple"
val cardNumber = "4111111111111110"
val expiryMonth = 5
val expiryYear = calendar.get(Calendar.YEAR)
view.card_number_input.text = cardNumber.toEditable()
view.name_on_card_input.text = billingName.toEditable()
view.expiry_month_drop_down.setSelection(expiryMonth - 1)
view.save_button.performClick()
verify {
interactor.onSaveCreditCard(
UpdatableCreditCardFields(
billingName = billingName,
cardNumber = cardNumber,
expiryMonth = expiryMonth.toLong(),
expiryYear = expiryYear.toLong(),
cardType = CARD_TYPE_PLACEHOLDER
)
)
}
}
@Test
fun `GIVEN a credit card WHEN the save button is clicked THEN interactor is called`() {
creditCardEditorView.bind(creditCard.toCreditCardEditorState())
@ -126,8 +157,9 @@ class CreditCardEditorViewTest {
view.save_button.performClick()
verify {
interactor.onSaveButtonClicked(
UpdatableCreditCardFields(
interactor.onUpdateCreditCard(
guid = creditCard.guid,
creditCardFields = UpdatableCreditCardFields(
billingName = creditCard.billingName,
cardNumber = creditCard.cardNumber,
expiryMonth = creditCard.expiryMonth,

@ -104,4 +104,34 @@ class DefaultCreditCardEditorControllerTest {
navController.popBackStack()
}
}
@Test
fun handleUpdateCreditCard() = testCoroutineScope.runBlockingTest {
val creditCard = CreditCard(
guid = "id",
billingName = "Banana Apple",
cardNumber = "4111111111111110",
expiryMonth = 1,
expiryYear = 2030,
cardType = "amex",
timeCreated = 1L,
timeLastUsed = 1L,
timeLastModified = 1L,
timesUsed = 1L
)
val creditCardFields = UpdatableCreditCardFields(
billingName = "Banana Apple",
cardNumber = "4111111111111112",
expiryMonth = 1,
expiryYear = 2034,
cardType = "discover"
)
controller.handleUpdateCreditCard(creditCard.guid, creditCardFields)
coVerify {
storage.updateCreditCard(creditCard.guid, creditCardFields)
navController.popBackStack()
}
}
}

@ -57,7 +57,21 @@ class DefaultCreditCardEditorInteractorTest {
expiryYear = 2030,
cardType = "discover"
)
interactor.onSaveButtonClicked(creditCardFields)
interactor.onSaveCreditCard(creditCardFields)
verify { controller.handleSaveCreditCard(creditCardFields) }
}
@Test
fun onUpdateCreditCard() {
val guid = "id"
val creditCardFields = UpdatableCreditCardFields(
billingName = "Banana Apple",
cardNumber = "4111111111111112",
expiryMonth = 1,
expiryYear = 2034,
cardType = "discover"
)
interactor.onUpdateCreditCard(guid, creditCardFields)
verify { controller.handleUpdateCreditCard(guid, creditCardFields) }
}
}

Loading…
Cancel
Save