Bug 1529717 [wpt PR 15424] - [PaymentRequest][WPT] Automate manual tests for show() method., a=testonly
authorDanyao Wang <danyao@chromium.org>
Tue, 05 Mar 2019 12:18:32 +0000
changeset 464580 799d0957f4cd
parent 464579 613dc371d6c8
child 464581 90a58f096301
push id35717
push useraciure@mozilla.com
push dateSun, 17 Mar 2019 09:45:26 +0000
treeherdermozilla-central@e0861be8d6c0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstestonly
bugs1529717, 15424, 929773, 1474708, 632789
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1529717 [wpt PR 15424] - [PaymentRequest][WPT] Automate manual tests for show() method., a=testonly Automatic update from web-platform-tests [PaymentRequest][WPT] Automate manual tests for show() method. This patch uses test_driver.bless() to automate manual tests that need a user activation to trigger .show(). The new automated tests pass on Chrome after this patch. Bug: 929773 Change-Id: Ic220c89db48c12a594ff9f77d091ff952b0c9abc Reviewed-on: https://chromium-review.googlesource.com/c/1474708 Reviewed-by: Rouslan Solomakhin <rouslan@chromium.org> Commit-Queue: Danyao Wang <danyao@chromium.org> Cr-Commit-Position: refs/heads/master@{#632789} -- wpt-commits: 21461a83c51b72bcff82476c1b79a26a194e7bab wpt-pr: 15424
testing/web-platform/tests/payment-request/payment-request-multiple-show-manual.https.html
testing/web-platform/tests/payment-request/payment-request-show-method-manual.https.html
testing/web-platform/tests/payment-request/payment-request-show-method.https.html
deleted file mode 100644
--- a/testing/web-platform/tests/payment-request/payment-request-multiple-show-manual.https.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Manual test for multiple PaymentRequest.show()</title>
-<link rel="help" href="https://w3c.github.io/payment-request/#show-method">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-"use strict";
-setup({
-  allow_uncaught_exception: true,
-});
-const defaultMethods = Object.freeze([
-  { supportedMethods: "basic-card" },
-  {
-    supportedMethods: "https://apple.com/apple-pay",
-    data: {
-      version: 3,
-      merchantIdentifier: "merchant.com.example",
-      countryCode: "US",
-      merchantCapabilities: ["supports3DS"],
-      supportedNetworks: ["visa"],
-    }
-  },
-]);
-
-const defaultDetails = Object.freeze({
-  total: {
-    label: "Total",
-    amount: {
-      currency: "USD",
-      value: "1.00",
-    },
-  },
-});
-
-function testCallingShowMultipleTimes() {
-  promise_test(async t => {
-    const request = new PaymentRequest(defaultMethods, defaultDetails);
-    const p1 = request.show();
-    const p2 = request.show();
-    const p3 = request.show();
-    const promises = new Set([p1, p2, p3]);
-    await request.abort();
-    assert_equals(promises.size, 3, "Must have three unique objects");
-    await promise_rejects(t, "AbortError", p1);
-    await promise_rejects(t, "InvalidStateError", p2);
-    await promise_rejects(t, "InvalidStateError", p3);
-  }, "Calling show() multiple times is always a new object.");
-}
-</script>
-<h2>Manual test for multiple PaymentRequest.show()</h2>
-<p>
-  Click on the button to bring up the Payment Request UI window and then will
-  close it automatically. (If a payment sheet stays open, the test has failed.)
-</p>
-<ul>
-  <li>
-    <button onclick="testCallingShowMultipleTimes()">
-      Calling show() multiple times is always a new object.
-    </button>
-  </li>
-</ul>
-<small>
-  If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
-  and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
-</small>
deleted file mode 100644
--- a/testing/web-platform/tests/payment-request/payment-request-show-method-manual.https.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Manual tests for PaymentRequest.show() method</title>
-<link rel="help" href="https://w3c.github.io/payment-request/#show-method">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-"use strict";
-setup({
-  explicit_done: true,
-  explicit_timeout: true,
-});
-const defaultMethods = Object.freeze([
-  { supportedMethods: "basic-card" },
-  {
-    supportedMethods: "https://apple.com/apple-pay",
-    data: {
-      version: 3,
-      merchantIdentifier: "merchant.com.example",
-      countryCode: "US",
-      merchantCapabilities: ["supports3DS"],
-      supportedNetworks: ["visa"],
-    }
-  },
-]);
-
-const defaultDetails = Object.freeze({
-  total: {
-    label: "Total",
-    amount: {
-      currency: "USD",
-      value: "1.00",
-    },
-  },
-});
-
-function testThrowsIfStateIsNotCreated() {
-  promise_test(async t => {
-    const request = new PaymentRequest(defaultMethods, defaultDetails);
-    const acceptPromise = request.show(); // Sets state to "interactive"
-    await promise_rejects(t, "InvalidStateError", request.show());
-    await request.abort();
-    await promise_rejects(t, "AbortError", acceptPromise);
-  }, "Throws if the promise [[state]] is not 'created'.");
-}
-
-function testPaymentRequestIsShowingBoolean() {
-  promise_test(async t => {
-    const request1 = new PaymentRequest(defaultMethods, defaultDetails);
-    const request2 = new PaymentRequest(defaultMethods, defaultDetails);
-    const acceptPromise1 = request1.show();
-    const acceptPromise2 = request2.show();
-    await promise_rejects(t, "AbortError", acceptPromise2);
-    await request1.abort();
-    await promise_rejects(t, "AbortError", acceptPromise1);
-  }, `If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.`);
-}
-
-function testNotSupportedError() {
-  promise_test(async t => {
-    const request = new PaymentRequest(
-      [{ supportedMethods: "this-is-not-supported" }],
-      defaultDetails
-    );
-    const acceptPromise = request.show();
-    await promise_rejects(t, "NotSupportedError", acceptPromise);
-  }, `If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.`);
-}
-</script>
-<h2>Manual tests for PaymentRequest.show() method</h2>
-<p>
-  Click on each button in sequence from top to bottom without refreshing the
-  page. Each button will bring up the Payment Request UI window and then will
-  close it automatically. (If a payment sheet stays open, the test has failed.)
-</p>
-<ol>
-  <li>
-    <button onclick="testThrowsIfStateIsNotCreated()">
-      Throws if the promise [[state]] is not 'created'.
-    </button>
-  </li>
-  <li>
-    <button onclick="testPaymentRequestIsShowingBoolean()">
-      If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.
-    </button>
-  </li>
-  <li>
-    <button onclick="testNotSupportedError()">
-      If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.
-    </button>
-  </li>
-  <li><button onclick="done()">Done!</button></li>
-</ol>
-<small>
-  If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
-  and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
-</small>
--- a/testing/web-platform/tests/payment-request/payment-request-show-method.https.html
+++ b/testing/web-platform/tests/payment-request/payment-request-show-method.https.html
@@ -1,14 +1,16 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
 <title>Test for PaymentRequest.show() method</title>
 <link rel="help" href="https://w3c.github.io/payment-request/#show-method">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
 <script>
 "use strict";
 const defaultMethods = Object.freeze([
   { supportedMethods: "basic-card" },
   {
     supportedMethods: "https://apple.com/apple-pay",
     data: {
       version: 3,
@@ -28,15 +30,87 @@ const defaultDetails = Object.freeze({
       value: "1.00",
     },
   },
 });
 
 promise_test(async t => {
   const request = new PaymentRequest(defaultMethods, defaultDetails);
   const acceptPromise = request.show();
+  // Abort the request after 2 seconds if it has not rejected. This allows the
+  // other tests in this file to run even if a non-compliant browser shows the
+  // payment sheet without user activation.
+  t.step_timeout(() => {
+    t.force_timeout();
+    request.abort();
+  }, 2000);
+
   await promise_rejects(t, "SecurityError", acceptPromise);
 }, `Calling show() without being triggered by user interaction throws`);
+
+promise_test(async t => {
+  const request = new PaymentRequest(defaultMethods, defaultDetails);
+  const [acceptPromise] = await test_driver.bless(
+    "test: throws if the promise [[state]] is not 'created'",
+    () => {
+      const acceptPromise = request.show(); // Sets state to "interactive"
+      return [acceptPromise];
+    });
+  await promise_rejects(t, "InvalidStateError", request.show());
+  await request.abort();
+  await promise_rejects(t, "AbortError", acceptPromise);
+}, "Throws if the promise [[state]] is not 'created'.");
+
+promise_test(async t => {
+  const request1 = new PaymentRequest(defaultMethods, defaultDetails);
+  const request2 = new PaymentRequest(defaultMethods, defaultDetails);
+  const [acceptPromise1] = await test_driver.bless(
+    `test: reject promise with "AbortedError" if payment request is already showing`,
+    async () => {
+      const acceptPromise1 = request1.show();
+      const acceptPromise2 = request2.show();
+      await promise_rejects(t, "AbortError", acceptPromise2);
+      return [acceptPromise1];
+    });
+
+  await request1.abort();
+  await promise_rejects(t, "AbortError", acceptPromise1);
+}, `If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.`);
+
+promise_test(async t => {
+  const request = new PaymentRequest(
+    [{ supportedMethods: "this-is-not-supported" }],
+    defaultDetails
+  );
+  const [acceptPromise] = await test_driver.bless(
+    `test: reject promise with "NotSupportedError"`,
+    () => {
+      const acceptPromise = request.show();
+      return [acceptPromise];
+    });
+  await promise_rejects(t, "NotSupportedError", acceptPromise);
+}, `If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.`);
+
+promise_test(async t => {
+  const request = new PaymentRequest(defaultMethods, defaultDetails);
+  const [p1, p2, p3] = await test_driver.bless(
+    `test: calling show() multiple times always returns a new promise`,
+    () => {
+      const p1 = request.show();
+      const p2 = request.show();
+      const p3 = request.show();
+      return [p1, p2, p3];
+    });
+  const promises = new Set([p1, p2, p3]);
+  assert_equals(promises.size, 3, "Must have three unique objects");
+
+  await promise_rejects(t, "InvalidStateError", p2);
+  await promise_rejects(t, "InvalidStateError", p3);
+
+  await request.abort();
+  await promise_rejects(t, "AbortError", p1);
+}, "Calling show() multiple times always returns a new promise.");
+
 </script>
 <small>
   If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
   and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
 </small>