1 package org.mozilla.fenix.ui
3 import okhttp3.mockwebserver.MockWebServer
5 import org.junit.Before
8 import org.mozilla.fenix.customannotations.SmokeTest
9 import org.mozilla.fenix.helpers.AndroidAssetDispatcher
10 import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
11 import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
12 import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText
13 import org.mozilla.fenix.helpers.TestAssetHelper
14 import org.mozilla.fenix.helpers.TestHelper.bringAppToForeground
15 import org.mozilla.fenix.helpers.TestHelper.exitMenu
16 import org.mozilla.fenix.helpers.TestHelper.packageName
17 import org.mozilla.fenix.helpers.TestHelper.putAppToBackground
18 import org.mozilla.fenix.ui.robots.clickPageObject
19 import org.mozilla.fenix.ui.robots.homeScreen
20 import org.mozilla.fenix.ui.robots.navigationToolbar
21 import java.time.LocalDate
23 class CreditCardAutofillTest {
24 private lateinit var mockWebServer: MockWebServer
26 object MockCreditCard1 {
27 const val MOCK_CREDIT_CARD_NUMBER = "5555555555554444"
28 const val MOCK_LAST_CARD_DIGITS = "4444"
29 const val MOCK_NAME_ON_CARD = "Mastercard"
30 const val MOCK_EXPIRATION_MONTH = "February"
31 val MOCK_EXPIRATION_YEAR = (LocalDate.now().year + 1).toString()
32 val MOCK_EXPIRATION_MONTH_AND_YEAR = "02/${(LocalDate.now().year + 1)}"
35 object MockCreditCard2 {
36 const val MOCK_CREDIT_CARD_NUMBER = "2720994326581252"
37 const val MOCK_LAST_CARD_DIGITS = "1252"
38 const val MOCK_NAME_ON_CARD = "Mastercard"
39 const val MOCK_EXPIRATION_MONTH = "March"
40 val MOCK_EXPIRATION_YEAR = (LocalDate.now().year + 2).toString()
41 val MOCK_EXPIRATION_MONTH_AND_YEAR = "03/${(LocalDate.now().year + 2)}"
45 val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides()
49 mockWebServer = MockWebServer().apply {
50 dispatcher = AndroidAssetDispatcher()
57 mockWebServer.shutdown()
62 fun verifyCreditCardAutofillTest() {
63 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
68 }.openAutofillSubMenu {
69 clickAddCreditCardButton()
70 fillAndSaveCreditCard(
71 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
72 MockCreditCard1.MOCK_NAME_ON_CARD,
73 MockCreditCard1.MOCK_EXPIRATION_MONTH,
74 MockCreditCard1.MOCK_EXPIRATION_YEAR,
76 // Opening Manage saved cards to dismiss here the Secure your credit prompt
77 clickManageSavedCreditCardsButton()
78 clickSecuredCreditCardsLaterButton()
79 }.goBackToAutofillSettings {
84 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
85 clickPageObject(itemWithResId("cardNumber"))
86 clickPageObject(itemWithResId("$packageName:id/select_credit_card_header"))
88 itemWithResIdContainingText(
89 "$packageName:id/credit_card_number",
90 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
93 verifyAutofilledCreditCard(MockCreditCard1.MOCK_CREDIT_CARD_NUMBER)
99 fun deleteSavedCreditCardUsingToolbarButtonTest() {
103 }.openAutofillSubMenu {
104 clickAddCreditCardButton()
105 fillAndSaveCreditCard(
106 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
107 MockCreditCard1.MOCK_NAME_ON_CARD,
108 MockCreditCard1.MOCK_EXPIRATION_MONTH,
109 MockCreditCard1.MOCK_EXPIRATION_YEAR,
111 clickManageSavedCreditCardsButton()
112 clickSecuredCreditCardsLaterButton()
113 clickSavedCreditCard()
114 clickDeleteCreditCardToolbarButton()
115 clickConfirmDeleteCreditCardButton()
116 verifyAddCreditCardsButton()
122 fun cancelDeleteSavedCreditCardUsingToolbarButtonTest() {
126 }.openAutofillSubMenu {
127 clickAddCreditCardButton()
128 fillAndSaveCreditCard(
129 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
130 MockCreditCard1.MOCK_NAME_ON_CARD,
131 MockCreditCard1.MOCK_EXPIRATION_MONTH,
132 MockCreditCard1.MOCK_EXPIRATION_YEAR,
134 clickManageSavedCreditCardsButton()
135 clickSecuredCreditCardsLaterButton()
136 clickSavedCreditCard()
137 clickDeleteCreditCardToolbarButton()
138 clickCancelDeleteCreditCardButton()
139 verifyEditCreditCardToolbarTitle()
145 fun deleteSavedCreditCardUsingMenuButtonTest() {
149 }.openAutofillSubMenu {
150 clickAddCreditCardButton()
151 fillAndSaveCreditCard(
152 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
153 MockCreditCard1.MOCK_NAME_ON_CARD,
154 MockCreditCard1.MOCK_EXPIRATION_MONTH,
155 MockCreditCard1.MOCK_EXPIRATION_YEAR,
157 clickManageSavedCreditCardsButton()
158 clickSecuredCreditCardsLaterButton()
159 clickSavedCreditCard()
160 clickDeleteCreditCardMenuButton()
161 clickConfirmDeleteCreditCardButton()
162 verifyAddCreditCardsButton()
168 fun cancelDeleteSavedCreditCardUsingMenuButtonTest() {
172 }.openAutofillSubMenu {
173 clickAddCreditCardButton()
174 fillAndSaveCreditCard(
175 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
176 MockCreditCard1.MOCK_NAME_ON_CARD,
177 MockCreditCard1.MOCK_EXPIRATION_MONTH,
178 MockCreditCard1.MOCK_EXPIRATION_YEAR,
180 clickManageSavedCreditCardsButton()
181 clickSecuredCreditCardsLaterButton()
182 clickSavedCreditCard()
183 clickDeleteCreditCardMenuButton()
184 clickCancelDeleteCreditCardButton()
185 verifyEditCreditCardToolbarTitle()
190 fun verifyCreditCardsSectionTest() {
194 }.openAutofillSubMenu {
195 verifyCreditCardsAutofillSection(true, false)
196 clickAddCreditCardButton()
197 fillAndSaveCreditCard(
198 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
199 MockCreditCard1.MOCK_NAME_ON_CARD,
200 MockCreditCard1.MOCK_EXPIRATION_MONTH,
201 MockCreditCard1.MOCK_EXPIRATION_YEAR,
203 clickManageSavedCreditCardsButton()
204 clickSecuredCreditCardsLaterButton()
205 verifySavedCreditCardsSection(
206 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
207 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
213 fun verifyManageCreditCardsPromptOptionTest() {
214 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
219 }.openAutofillSubMenu {
220 clickAddCreditCardButton()
221 fillAndSaveCreditCard(
222 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
223 MockCreditCard1.MOCK_NAME_ON_CARD,
224 MockCreditCard1.MOCK_EXPIRATION_MONTH,
225 MockCreditCard1.MOCK_EXPIRATION_YEAR,
232 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
233 clickPageObject(itemWithResId("cardNumber"))
234 clickPageObject(itemWithResId("$packageName:id/select_credit_card_header"))
235 }.clickManageCreditCardsButton {
237 verifySelectCreditCardPromptExists(false)
242 fun verifyCreditCardsAutofillToggleTest() {
243 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
248 }.openAutofillSubMenu {
249 verifyCreditCardsAutofillSection(true, false)
250 clickAddCreditCardButton()
251 fillAndSaveCreditCard(
252 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
253 MockCreditCard1.MOCK_NAME_ON_CARD,
254 MockCreditCard1.MOCK_EXPIRATION_MONTH,
255 MockCreditCard1.MOCK_EXPIRATION_YEAR,
262 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
263 clickPageObject(itemWithResId("cardNumber"))
264 verifySelectCreditCardPromptExists(true)
267 }.openAutofillSubMenu {
268 clickSaveAndAutofillCreditCardsOption()
269 verifyCreditCardsAutofillSection(false, true)
275 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
276 clickPageObject(itemWithResId("cardNumber"))
277 verifySelectCreditCardPromptExists(false)
282 fun verifyEditCardsViewTest() {
286 }.openAutofillSubMenu {
287 verifyCreditCardsAutofillSection(true, false)
288 clickAddCreditCardButton()
289 fillAndSaveCreditCard(
290 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
291 MockCreditCard1.MOCK_NAME_ON_CARD,
292 MockCreditCard1.MOCK_EXPIRATION_MONTH,
293 MockCreditCard1.MOCK_EXPIRATION_YEAR,
295 clickManageSavedCreditCardsButton()
296 clickSecuredCreditCardsLaterButton()
297 verifySavedCreditCardsSection(
298 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
299 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
301 clickSavedCreditCard()
302 verifyEditCreditCardView(
303 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
304 MockCreditCard1.MOCK_NAME_ON_CARD,
305 MockCreditCard1.MOCK_EXPIRATION_MONTH,
306 MockCreditCard1.MOCK_EXPIRATION_YEAR,
308 }.goBackToSavedCreditCards {
309 verifySavedCreditCardsSection(
310 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
311 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
317 fun verifyEditedCardIsSavedTest() {
318 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
323 }.openAutofillSubMenu {
324 verifyCreditCardsAutofillSection(true, false)
325 clickAddCreditCardButton()
326 fillAndSaveCreditCard(
327 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
328 MockCreditCard1.MOCK_NAME_ON_CARD,
329 MockCreditCard1.MOCK_EXPIRATION_MONTH,
330 MockCreditCard1.MOCK_EXPIRATION_YEAR,
332 clickManageSavedCreditCardsButton()
333 clickSecuredCreditCardsLaterButton()
334 verifySavedCreditCardsSection(
335 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
336 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
338 clickSavedCreditCard()
339 fillAndSaveCreditCard(
340 MockCreditCard2.MOCK_CREDIT_CARD_NUMBER,
341 MockCreditCard2.MOCK_NAME_ON_CARD,
342 MockCreditCard2.MOCK_EXPIRATION_MONTH,
343 MockCreditCard2.MOCK_EXPIRATION_YEAR,
350 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
351 clickPageObject(itemWithResId("cardNumber"))
352 clickPageObject(itemWithResId("$packageName:id/select_credit_card_header"))
354 itemWithResIdContainingText(
355 "$packageName:id/credit_card_number",
356 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
359 verifyAutofilledCreditCard(MockCreditCard2.MOCK_CREDIT_CARD_NUMBER)
364 fun verifyCreditCardCannotBeSavedWithoutCardNumberTest() {
368 }.openAutofillSubMenu {
369 verifyCreditCardsAutofillSection(true, false)
370 clickAddCreditCardButton()
371 fillAndSaveCreditCard(
372 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
373 MockCreditCard1.MOCK_NAME_ON_CARD,
374 MockCreditCard1.MOCK_EXPIRATION_MONTH,
375 MockCreditCard1.MOCK_EXPIRATION_YEAR,
377 clickManageSavedCreditCardsButton()
378 clickSecuredCreditCardsLaterButton()
379 verifySavedCreditCardsSection(
380 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
381 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
383 clickSavedCreditCard()
384 clearCreditCardNumber()
385 clickSaveCreditCardToolbarButton()
386 verifyEditCreditCardToolbarTitle()
387 verifyCreditCardNumberErrorMessage()
392 fun verifyCreditCardCannotBeSavedWithoutNameOnCardTest() {
396 }.openAutofillSubMenu {
397 verifyCreditCardsAutofillSection(true, false)
398 clickAddCreditCardButton()
399 fillAndSaveCreditCard(
400 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
401 MockCreditCard1.MOCK_NAME_ON_CARD,
402 MockCreditCard1.MOCK_EXPIRATION_MONTH,
403 MockCreditCard1.MOCK_EXPIRATION_YEAR,
405 clickManageSavedCreditCardsButton()
406 clickSecuredCreditCardsLaterButton()
407 verifySavedCreditCardsSection(
408 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
409 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
411 clickSavedCreditCard()
412 clearNameOnCreditCard()
413 clickSaveCreditCardToolbarButton()
414 verifyEditCreditCardToolbarTitle()
415 verifyNameOnCreditCardErrorMessage()
420 fun verifyMultipleCreditCardsCanBeSavedTest() {
421 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
426 }.openAutofillSubMenu {
427 verifyCreditCardsAutofillSection(true, false)
428 clickAddCreditCardButton()
429 fillAndSaveCreditCard(
430 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
431 MockCreditCard1.MOCK_NAME_ON_CARD,
432 MockCreditCard1.MOCK_EXPIRATION_MONTH,
433 MockCreditCard1.MOCK_EXPIRATION_YEAR,
435 clickManageSavedCreditCardsButton()
436 clickSecuredCreditCardsLaterButton()
437 clickAddCreditCardButton()
438 fillAndSaveCreditCard(
439 MockCreditCard2.MOCK_CREDIT_CARD_NUMBER,
440 MockCreditCard2.MOCK_NAME_ON_CARD,
441 MockCreditCard2.MOCK_EXPIRATION_MONTH,
442 MockCreditCard2.MOCK_EXPIRATION_YEAR,
444 verifySavedCreditCardsSection(
445 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
446 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
448 verifySavedCreditCardsSection(
449 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
450 MockCreditCard2.MOCK_EXPIRATION_MONTH_AND_YEAR,
457 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
458 clickPageObject(itemWithResId("cardNumber"))
459 clickPageObject(itemWithResId("$packageName:id/select_credit_card_header"))
460 verifyCreditCardSuggestion(
461 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
462 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
465 itemWithResIdContainingText(
466 "$packageName:id/credit_card_number",
467 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
470 verifyAutofilledCreditCard(MockCreditCard2.MOCK_CREDIT_CARD_NUMBER)
475 fun verifyDoNotSaveCreditCardFromFormTest() {
476 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
479 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
480 fillAndSaveCreditCard(
481 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
482 MockCreditCard1.MOCK_NAME_ON_CARD,
483 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
485 clickPageObject(itemWithResId("$packageName:id/save_cancel"))
486 verifyUpdateOrSaveCreditCardPromptExists(exists = false)
489 }.openAutofillSubMenu {
490 verifyCreditCardsAutofillSection(true, false)
495 fun verifySaveCreditCardFromFormTest() {
496 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
499 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
500 fillAndSaveCreditCard(
501 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
502 MockCreditCard1.MOCK_NAME_ON_CARD,
503 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
505 clickPageObject(itemWithResId("$packageName:id/save_confirm"))
506 verifyUpdateOrSaveCreditCardPromptExists(exists = false)
509 }.openAutofillSubMenu {
510 verifyCreditCardsAutofillSection(true, true)
511 clickManageSavedCreditCardsButton()
512 clickSecuredCreditCardsLaterButton()
513 verifySavedCreditCardsSection(
514 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
515 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
521 fun verifyCancelCreditCardUpdatePromptTest() {
522 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
527 }.openAutofillSubMenu {
528 verifyCreditCardsAutofillSection(true, false)
529 clickAddCreditCardButton()
530 fillAndSaveCreditCard(
531 MockCreditCard2.MOCK_CREDIT_CARD_NUMBER,
532 MockCreditCard2.MOCK_NAME_ON_CARD,
533 MockCreditCard2.MOCK_EXPIRATION_MONTH,
534 MockCreditCard2.MOCK_EXPIRATION_YEAR,
536 // Opening Manage saved cards to dismiss here the Secure your credit prompt
537 clickManageSavedCreditCardsButton()
538 clickSecuredCreditCardsLaterButton()
544 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
545 clickPageObject(itemWithResId("cardNumber"))
546 clickPageObject(itemWithResId("$packageName:id/select_credit_card_header"))
548 itemWithResIdContainingText(
549 "$packageName:id/credit_card_number",
550 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
553 verifyAutofilledCreditCard(MockCreditCard2.MOCK_CREDIT_CARD_NUMBER)
554 changeCreditCardExpiryDate(MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR)
555 clickCreditCardFormSubmitButton()
556 clickPageObject(itemWithResId("$packageName:id/save_cancel"))
557 verifyUpdateOrSaveCreditCardPromptExists(false)
560 }.openAutofillSubMenu {
561 verifyCreditCardsAutofillSection(true, true)
562 clickManageSavedCreditCardsButton()
563 verifySavedCreditCardsSection(
564 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
565 MockCreditCard2.MOCK_EXPIRATION_MONTH_AND_YEAR,
571 fun verifyConfirmCreditCardUpdatePromptTest() {
572 val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)
577 }.openAutofillSubMenu {
578 verifyCreditCardsAutofillSection(true, false)
579 clickAddCreditCardButton()
580 fillAndSaveCreditCard(
581 MockCreditCard2.MOCK_CREDIT_CARD_NUMBER,
582 MockCreditCard2.MOCK_NAME_ON_CARD,
583 MockCreditCard2.MOCK_EXPIRATION_MONTH,
584 MockCreditCard2.MOCK_EXPIRATION_YEAR,
586 // Opening Manage saved cards to dismiss here the Secure your credit prompt
587 clickManageSavedCreditCardsButton()
588 clickSecuredCreditCardsLaterButton()
594 }.enterURLAndEnterToBrowser(creditCardFormPage.url) {
595 clickPageObject(itemWithResId("cardNumber"))
596 clickPageObject(itemWithResId("$packageName:id/select_credit_card_header"))
598 itemWithResIdContainingText(
599 "$packageName:id/credit_card_number",
600 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
603 verifyAutofilledCreditCard(MockCreditCard2.MOCK_CREDIT_CARD_NUMBER)
604 changeCreditCardExpiryDate(MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR)
605 clickCreditCardFormSubmitButton()
606 clickPageObject(itemWithResId("$packageName:id/save_confirm"))
607 verifyUpdateOrSaveCreditCardPromptExists(false)
610 }.openAutofillSubMenu {
611 verifyCreditCardsAutofillSection(true, true)
612 clickManageSavedCreditCardsButton()
613 verifySavedCreditCardsSection(
614 MockCreditCard2.MOCK_LAST_CARD_DIGITS,
615 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
621 fun verifySavedCreditCardsRedirectionToAutofillAfterInterruptionTest() {
625 }.openAutofillSubMenu {
626 verifyCreditCardsAutofillSection(true, false)
627 clickAddCreditCardButton()
628 fillAndSaveCreditCard(
629 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
630 MockCreditCard1.MOCK_NAME_ON_CARD,
631 MockCreditCard1.MOCK_EXPIRATION_MONTH,
632 MockCreditCard1.MOCK_EXPIRATION_YEAR,
634 clickManageSavedCreditCardsButton()
635 clickSecuredCreditCardsLaterButton()
636 verifySavedCreditCardsSection(
637 MockCreditCard1.MOCK_LAST_CARD_DIGITS,
638 MockCreditCard1.MOCK_EXPIRATION_MONTH_AND_YEAR,
641 bringAppToForeground()
642 verifyAutofillToolbarTitle()
647 fun verifyEditCreditCardRedirectionToAutofillAfterInterruptionTest() {
651 }.openAutofillSubMenu {
652 verifyCreditCardsAutofillSection(true, false)
653 clickAddCreditCardButton()
654 fillAndSaveCreditCard(
655 MockCreditCard1.MOCK_CREDIT_CARD_NUMBER,
656 MockCreditCard1.MOCK_NAME_ON_CARD,
657 MockCreditCard1.MOCK_EXPIRATION_MONTH,
658 MockCreditCard1.MOCK_EXPIRATION_YEAR,
660 clickManageSavedCreditCardsButton()
661 clickSecuredCreditCardsLaterButton()
662 clickSavedCreditCard()
664 bringAppToForeground()
665 verifyAutofillToolbarTitle()