Bug 1462779 - Show the billing address page during on-boarding if requestShipping is false and there are no saved addresses. r?MattN draft
authorprathiksha <prathikshaprasadsuman@gmail.com>
Fri, 18 May 2018 16:44:25 -0700
changeset 798979 590d8563b5a8ab983adb3c69f68620bcbc71a531
parent 798978 d91d2832a393e19046cdd222b2256436bb4a8f2f
push id110907
push userbmo:prathikshaprasadsuman@gmail.com
push dateWed, 23 May 2018 20:40:47 +0000
reviewersMattN
bugs1462779
milestone62.0a1
Bug 1462779 - Show the billing address page during on-boarding if requestShipping is false and there are no saved addresses. r?MattN MozReview-Commit-ID: 3M9S1fTXv1z
browser/components/payments/res/paymentRequest.js
browser/components/payments/res/paymentRequest.xhtml
browser/components/payments/test/browser/browser_payments_onboarding_wizard.js
--- a/browser/components/payments/res/paymentRequest.js
+++ b/browser/components/payments/res/paymentRequest.js
@@ -111,40 +111,52 @@ var paymentRequest = {
     // Handle getting called before the DOM is ready.
     log.debug("onShowPaymentRequest:", detail);
     await this.domReadyPromise;
 
     log.debug("onShowPaymentRequest: domReadyPromise resolved");
     log.debug("onShowPaymentRequest, isPrivate?", detail.isPrivate);
 
     let paymentDialog = document.querySelector("payment-dialog");
+    let hasSavedAddresses = Object.keys(detail.savedAddresses).length != 0;
+    let hasSavedCards = Object.keys(detail.savedBasicCards).length != 0;
+    let shippingRequested = detail.request.paymentOptions.requestShipping;
     let state = {
       request: detail.request,
       savedAddresses: detail.savedAddresses,
       savedBasicCards: detail.savedBasicCards,
       isPrivate: detail.isPrivate,
       page: {
         id: "payment-summary",
       },
     };
 
     // Onboarding wizard flow.
-    if (Object.keys(detail.savedAddresses).length == 0) {
+    if (!hasSavedAddresses && (shippingRequested || !hasSavedCards)) {
       state.page = {
         id: "address-page",
         onboardingWizard: true,
       };
 
       state["address-page"] = {
         selectedStateKey: "selectedShippingAddress",
         addressFields: null,
         guid: null,
-        title: paymentDialog.dataset.shippingAddressTitleAdd,
       };
-    } else if (Object.keys(detail.savedBasicCards).length == 0) {
+
+      if (shippingRequested) {
+        Object.assign(state["address-page"], {
+          title: paymentDialog.dataset.shippingAddressTitleAdd,
+        });
+      } else {
+        Object.assign(state["address-page"], {
+          title: paymentDialog.dataset.billingAddressTitleAdd,
+        });
+      }
+    } else if (!hasSavedCards) {
       state.page = {
         id: "basic-card-page",
         onboardingWizard: true,
       };
     }
 
     paymentDialog.setStateFromParent(state);
   },
--- a/browser/components/payments/res/paymentRequest.xhtml
+++ b/browser/components/payments/res/paymentRequest.xhtml
@@ -182,12 +182,13 @@
           hidden="hidden"
           height="400"></iframe>
   <payment-dialog data-shipping-address-title-add="&shippingAddress.addPage.title;"
                   data-shipping-address-title-edit="&shippingAddress.editPage.title;"
                   data-delivery-address-title-add="&deliveryAddress.addPage.title;"
                   data-delivery-address-title-edit="&deliveryAddress.editPage.title;"
                   data-pickup-address-title-add="&pickupAddress.addPage.title;"
                   data-pickup-address-title-edit="&pickupAddress.editPage.title;"
+                  data-billing-address-title-add="&billingAddress.addPage.title;"
                   data-payer-title-add="&payer.addPage.title;"
                   data-payer-title-edit="&payer.editPage.title;"></payment-dialog>
 </body>
 </html>
--- a/browser/components/payments/test/browser/browser_payments_onboarding_wizard.js
+++ b/browser/components/payments/test/browser/browser_payments_onboarding_wizard.js
@@ -2,16 +2,23 @@
 
 async function addAddress() {
   let onChanged = TestUtils.topicObserved("formautofill-storage-changed",
                                           (subject, data) => data == "add");
   formAutofillStorage.addresses.add(PTU.Addresses.TimBL);
   await onChanged;
 }
 
+async function addBasicCard() {
+  let onChanged = TestUtils.topicObserved("formautofill-storage-changed",
+                                          (subject, data) => data == "add");
+  formAutofillStorage.creditCards.add(PTU.BasicCards.JohnDoe);
+  await onChanged;
+}
+
 add_task(async function test_onboarding_wizard_without_saved_addresses_and_saved_cards() {
   await BrowserTestUtils.withNewTab({
     gBrowser,
     url: BLANK_PAGE_URL,
   }, async browser => {
     cleanupFormAutofillStorage();
 
     info("Opening the payment dialog");
@@ -79,16 +86,24 @@ add_task(async function test_onboarding_
       content.document.querySelector("address-form .save-button").click();
     });
 
     let isBasicCardPageSaveButtonVisible =
       await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
                                    "basic-card-form .save-button");
     ok(isBasicCardPageSaveButtonVisible, "Basic card page is rendered");
 
+    info("Check if the total header is visible on the basic card page during on-boarding");
+    isHeaderVisible =
+      spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "header");
+    ok(isHeaderVisible, "Total Header is visible on the basic card page during on-boarding");
+    headerTextContent =
+      spawnPaymentDialogTask(frame, PTU.DialogContentTasks.getElementTextContent, "header");
+    ok(headerTextContent, "Total Header contains text");
+
     let isBasicCardPageTitleVisible = spawnPaymentDialogTask(frame,
                                                              // eslint-disable-next-line max-len
                                                              PTU.DialogContentTasks.isElementVisible,
                                                              "basic-card-form h1");
     ok(isBasicCardPageTitleVisible, "Basic card page title is visible");
     titleTextContent =
       spawnPaymentDialogTask(frame,
                              PTU.DialogContentTasks.getElementTextContent,
@@ -226,17 +241,17 @@ add_task(async function test_onboarding_
     let {win, frame} =
       await setupPaymentDialog(browser, {
         methodData: [PTU.MethodData.basicCard],
         details: PTU.Details.total60USD,
         options: PTU.Options.requestShippingOption,
         merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
       });
 
-    info("Checking if the basic card has been rendered");
+    info("Checking if the basic card page has been rendered");
     let isBasicCardPageSaveButtonVisible =
       await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
                                    "basic-card-form .save-button");
     ok(isBasicCardPageSaveButtonVisible, "Basic card page is rendered");
 
     await spawnPaymentDialogTask(frame, async function() {
       let {
         PaymentTestUtils: PTU,
@@ -263,8 +278,179 @@ add_task(async function test_onboarding_
     spawnPaymentDialogTask(frame, async function() {
       content.document.querySelector("basic-card-form .cancel-button").click();
     });
     await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
 
     cleanupFormAutofillStorage();
   });
 });
+
+add_task(async function test_onboarding_wizard_without_saved_address_with_saved_cards() {
+  await BrowserTestUtils.withNewTab({
+    gBrowser,
+    url: BLANK_PAGE_URL,
+  }, async browser => {
+    cleanupFormAutofillStorage();
+    addBasicCard();
+
+    info("Opening the payment dialog");
+    let {win, frame} =
+      await setupPaymentDialog(browser, {
+        methodData: [PTU.MethodData.basicCard],
+        details: PTU.Details.total60USD,
+        options: PTU.Options.requestShippingOption,
+        merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
+      });
+
+    info("Checking if the address page has been rendered");
+    let isAddressPageSaveButtonVisible =
+      await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
+                                   "address-form .save-button");
+    ok(isAddressPageSaveButtonVisible, "Address page is rendered");
+
+    await spawnPaymentDialogTask(frame, async function() {
+      let {
+        PaymentTestUtils: PTU,
+      } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
+
+      for (let [key, val] of Object.entries(PTU.Addresses.TimBL2)) {
+        let field = content.document.getElementById(key);
+        if (!field) {
+          ok(false, `${key} field not found`);
+        }
+        field.value = val;
+        ok(!field.disabled, `Field #${key} shouldn't be disabled`);
+      }
+      content.document.querySelector("address-form .save-button").click();
+    });
+
+    let isPaymentSummaryCancelButtonVisible =
+      await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "#cancel");
+    ok(isPaymentSummaryCancelButtonVisible,
+       "Payment summary page is shown next");
+
+    info("Closing the payment dialog");
+    spawnPaymentDialogTask(frame, async function() {
+      content.document.getElementById("cancel").click();
+    });
+    await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
+
+    cleanupFormAutofillStorage();
+  });
+});
+
+add_task(async function test_onboarding_wizard_with_requestShipping_turned_off() {
+  await BrowserTestUtils.withNewTab({
+    gBrowser,
+    url: BLANK_PAGE_URL,
+  }, async browser => {
+    cleanupFormAutofillStorage();
+
+    info("Opening the payment dialog");
+    let {win, frame} =
+      await setupPaymentDialog(browser, {
+        methodData: [PTU.MethodData.basicCard],
+        details: PTU.Details.total60USD,
+        merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
+      });
+
+    info("Checking if the address page has been rendered");
+    let isAddressPageSaveButtonVisible =
+      await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
+                                   "address-form .save-button");
+    ok(isAddressPageSaveButtonVisible, "Billing address page is rendered");
+
+    info("Check if the page title is visible on the address page");
+    let isAddressPageTitleVisible = spawnPaymentDialogTask(frame,
+                                                           PTU.DialogContentTasks.isElementVisible,
+                                                           "address-form h1");
+    ok(isAddressPageTitleVisible, "Address page title is visible");
+    let titleTextContent =
+      await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.getElementTextContent,
+                                   "address-form h1");
+    is(titleTextContent, "Add Billing Address", "Address page title contains text");
+
+    await spawnPaymentDialogTask(frame, async function() {
+      let {
+        PaymentTestUtils: PTU,
+      } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
+
+      for (let [key, val] of Object.entries(PTU.Addresses.TimBL2)) {
+        let field = content.document.getElementById(key);
+        if (!field) {
+          ok(false, `${key} field not found`);
+        }
+        field.value = val;
+        ok(!field.disabled, `Field #${key} shouldn't be disabled`);
+      }
+      content.document.querySelector("address-form .save-button").click();
+    });
+
+    let isBasicCardPageSaveButtonVisible =
+      await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
+                                   "basic-card-form .save-button");
+    ok(isBasicCardPageSaveButtonVisible, "Basic card page is rendered");
+
+    await spawnPaymentDialogTask(frame, async function() {
+      let {
+        PaymentTestUtils: PTU,
+      } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
+
+      await PTU.DialogContentUtils.waitForState(content, (state) => {
+        return state.page.id == "basic-card-page";
+      // eslint-disable-next-line max-len
+      }, "Basic card page is shown after the billing address page during onboarding if requestShipping is turned off");
+
+      for (let [key, val] of Object.entries(PTU.BasicCards.JohnDoe)) {
+        let field = content.document.getElementById(key);
+        field.value = val;
+        ok(!field.disabled, `Field #${key} shouldn't be disabled`);
+      }
+      content.document.querySelector("basic-card-form .save-button").click();
+    });
+
+    let isPaymentSummaryCancelButtonVisible =
+      await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "#cancel");
+    ok(isPaymentSummaryCancelButtonVisible,
+       "Payment summary page is shown after the basic card page during on boarding");
+
+    info("Closing the payment dialog");
+    spawnPaymentDialogTask(frame, async function() {
+      content.document.getElementById("cancel").click();
+    });
+    await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
+
+    cleanupFormAutofillStorage();
+  });
+});
+
+add_task(async function test_on_boarding_wizard_with_requestShipping_turned_off_with_saved_cards() {
+  await BrowserTestUtils.withNewTab({
+    gBrowser,
+    url: BLANK_PAGE_URL,
+  }, async browser => {
+    cleanupFormAutofillStorage();
+    addBasicCard();
+
+    info("Opening the payment dialog");
+    let {win, frame} =
+        await setupPaymentDialog(browser, {
+          methodData: [PTU.MethodData.basicCard],
+          details: PTU.Details.total60USD,
+          merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
+        });
+
+    let isPaymentSummaryCancelButtonVisible =
+      await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "#cancel");
+    ok(isPaymentSummaryCancelButtonVisible,
+       // eslint-disable-next-line max-len
+       "Payment summary page is shown if requestShipping is turned off and there's a saved card but no saved address");
+
+    info("Closing the payment dialog");
+    spawnPaymentDialogTask(frame, async function() {
+      content.document.getElementById("cancel").click();
+    });
+    await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
+
+    cleanupFormAutofillStorage();
+  });
+});