From f4764c901959a0dd3f55b9218db7a51c15015dec Mon Sep 17 00:00:00 2001 From: Eden Chuang Date: Tue, 4 Sep 2018 12:30:18 +0200 Subject: [PATCH] Bug 1435161 - mochitest for PaymentResponse.retry(). r=baku 1. Add testcase testRetryAfterComplete to test the behavior of retry() after complete(). 2. Add testcase testRetryAfterRetry to test the multiple retry()s in the same round. 3. Add testcase testRetryWithEmptyErrors to test the retry() called with an empty PaymentValidationErrors. 4. Add testcase testRetry to test the normal flow of retry(). 5. Add testcase testRetryAbortByUser to test the retry() aborted by user. --- dom/payments/test/RetryPaymentChromeScript.js | 182 +++++++++ dom/payments/test/mochitest.ini | 2 + dom/payments/test/test_retryPayment.html | 354 ++++++++++++++++++ 3 files changed, 538 insertions(+) create mode 100644 dom/payments/test/RetryPaymentChromeScript.js create mode 100644 dom/payments/test/test_retryPayment.html diff --git a/dom/payments/test/RetryPaymentChromeScript.js b/dom/payments/test/RetryPaymentChromeScript.js new file mode 100644 index 000000000000..4876f0ecf9f7 --- /dev/null +++ b/dom/payments/test/RetryPaymentChromeScript.js @@ -0,0 +1,182 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); + +const paymentSrv = Cc["@mozilla.org/dom/payments/payment-request-service;1"].getService(Ci.nsIPaymentRequestService); + +function emitTestFail(message) { + sendAsyncMessage("test-fail", message); +} +function emitTestPass(message) { + sendAsyncMessage("test-pass", message); +} + +const billingAddress = Cc["@mozilla.org/dom/payments/payment-address;1"]. + createInstance(Ci.nsIPaymentAddress); +const addressLine = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); +const address = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString); +address.data = "Easton Ave"; +addressLine.appendElement(address); +billingAddress.init("USA", // country + addressLine, // address line + "CA", // region + "San Bruno", // city + "", // dependent locality + "94066", // postal code + "123456", // sorting code + "", // organization + "Bill A. Pacheco", // recipient + "+14344413879"); // phone + +function acceptPayment(requestId, mode) { + const basiccardResponseData = Cc["@mozilla.org/dom/payments/basiccard-response-data;1"]. + createInstance(Ci.nsIBasicCardResponseData); + const showResponse = Cc["@mozilla.org/dom/payments/payment-show-action-response;1"]. + createInstance(Ci.nsIPaymentShowActionResponse); + basiccardResponseData.initData("Bill A. Pacheco", // cardholderName + "4916855166538720", // cardNumber + "01", // expiryMonth + "2024", // expiryYear + "180", // cardSecurityCode + billingAddress); // billingAddress + if (mode === "show") { + showResponse.init(requestId, + Ci.nsIPaymentActionResponse.PAYMENT_ACCEPTED, + "basic-card", // payment method + basiccardResponseData,// payment method data + "Bill A. Pacheco", // payer name + "", // payer email + ""); // payer phone + } + if (mode == "retry") { + showResponse.init(requestId, + Ci.nsIPaymentActionResponse.PAYMENT_ACCEPTED, + "basic-card", // payment method + basiccardResponseData,// payment method data + "Bill A. Pacheco", // payer name + "bpacheco@test.org", // payer email + "+123456789"); // payer phone + } + paymentSrv.respondPayment(showResponse.QueryInterface(Ci.nsIPaymentActionResponse)); +} + +function rejectPayment(requestId) { + const responseData = Cc["@mozilla.org/dom/payments/general-response-data;1"]. + createInstance(Ci.nsIGeneralResponseData); + responseData.initData({}); + const showResponse = Cc["@mozilla.org/dom/payments/payment-show-action-response;1"]. + createInstance(Ci.nsIPaymentShowActionResponse); + showResponse.init(requestId, + Ci.nsIPaymentActionResponse.PAYMENT_REJECTED, + "", // payment method + responseData, // payment method data + "", // payer name + "", // payer email + ""); // payer phone + paymentSrv.respondPayment(showResponse.QueryInterface(Ci.nsIPaymentActionResponse)); +} + +function checkAddressErrors(testName, errors) { + if (!errors) { + emitTestFail(`${testName}: Expect non-null shippingAddressErrors, but got null.`); + return; + } + for (const [key, msg] of Object.entries(errors)) { + const expected = `${key} error`; + if (msg !== expected) { + emitTestFail( + `${testName}: Expected '${expected}' on shippingAddressErrors.${key}, but got '${msg}'.` + ); + return; + } + } +} + +function checkPayerErrors(testName, errors) { + if (!errors) { + emitTestFail(`${testName}: Expect non-null payerErrors, but got null.`); + return; + } + for (const [key, msg] of Object.entries(errors)) { + const expected = `${key} error`; + if (msg !== expected) { + emitTestFail(`${testName}: Expected '${expected}' on payerErrors.${key}, but got '${msg}'.`); + return; + } + } +} + +function checkPaymentMethodErrors(testName, errors) { + if (!errors) { + emitTestFail(`${testName} :Expect non-null payerMethodErrors, but got null.`); + return; + } + for (const [key, msg] of Object.entries(errors)) { + const expected = `method ${key} error`; + if (msg !== expected) { + emitTestFail( + `${testName}: Expected '${expected}' on paymentMethodErrors.${key}, but got '${msg}'.` + ); + return; + } + } +} + +const DummyUIService = { + testName: "", + rejectRetry: false, + showPayment(requestId) { + acceptPayment(requestId, "show"); + }, + abortPaymen(requestId) { + respondRequestId = requestId + }, + completePayment(requestId) { + let completeResponse = Cc["@mozilla.org/dom/payments/payment-complete-action-response;1"]. + createInstance(Ci.nsIPaymentCompleteActionResponse); + completeResponse.init(requestId, Ci.nsIPaymentActionResponse.COMPLETE_SUCCEEDED); + paymentSrv.respondPayment(completeResponse.QueryInterface(Ci.nsIPaymentActionResponse)); + }, + updatePayment(requestId) { + const payment = paymentSrv.getPaymentRequestById(requestId); + if (payment.paymentDetails.error !== "error") { + emitTestFail("Expect 'error' on details.error, but got '" + + payment.paymentDetails.error + "'"); + } + checkAddressErrors(this.testName, payment.paymentDetails.shippingAddressErrors) + checkPayerErrors(this.testName, payment.paymentDetails.payer); + checkPaymentMethodErrors(this.testName, payment.paymentDetails.paymentMethod); + if (this.rejectRetry) { + rejectPayment(requestId); + } else { + acceptPayment(requestId, "retry"); + } + }, + closePayment: (requestId) => {respondRequestId = requestId}, + QueryInterface: ChromeUtils.generateQI([Ci.nsIPaymentUIService]), +}; + +paymentSrv.setTestingUIService(DummyUIService.QueryInterface(Ci.nsIPaymentUIService)); + +addMessageListener("start-test", function(testName) { + DummyUIService.testName = testName; + sendAsyncMessage("start-test-complete"); +}); + +addMessageListener("finish-test", function() { + DummyUIService.testName = ""; + sendAsyncMessage("finish-test-complete"); +}); + +addMessageListener("reject-retry", function() { + DummyUIService.rejectRetry = true; + sendAsyncMessage("reject-retry-complete"); +}); + +addMessageListener("teardown", function() { + paymentSrv.setTestingUIService(null); + sendAsyncMessage('teardown-complete'); +}); diff --git a/dom/payments/test/mochitest.ini b/dom/payments/test/mochitest.ini index 640a571f1446..e83780a3ae58 100644 --- a/dom/payments/test/mochitest.ini +++ b/dom/payments/test/mochitest.ini @@ -14,6 +14,7 @@ support-files = GeneralChromeScript.js PMIValidationChromeScript.js RequestShippingChromeScript.js + RetryPaymentChromeScript.js ShippingOptionsChromeScript.js ShowPaymentChromeScript.js UpdateErrorsChromeScript.js @@ -33,6 +34,7 @@ skip-if = (verify && debug) [test_pmi_validation.html] skip-if = (verify && debug) [test_requestShipping.html] +[test_retryPayment.html] [test_shippingOptions.html] [test_showPayment.html] [test_update_errors.html] diff --git a/dom/payments/test/test_retryPayment.html b/dom/payments/test/test_retryPayment.html new file mode 100644 index 000000000000..ebb0ef237f44 --- /dev/null +++ b/dom/payments/test/test_retryPayment.html @@ -0,0 +1,354 @@ + + + + + + Test for retry PaymentRequest + + + + + + +Mozilla Bug 1435161 + +