[Payment Request] Update web platform tests
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / payment-request / payment-response / retry-method-manual.https.html
1 <!doctype html>
2 <meta charset="utf8">
3 <link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-retry">
4 <title>
5   PaymentResponse.prototype.retry() method
6 </title>
7 <script src="/resources/testharness.js"></script>
8 <script src="/resources/testharnessreport.js"></script>
9 <script src="helpers.js"></script>
10 <script>
11 test(() => {
12   assert_true(
13     "retry" in PaymentResponse.prototype,
14     "retry must be in prototype"
15   );
16   assert_true(
17     PaymentResponse.prototype.retry instanceof Function,
18     "retry must be a function"
19   );
20 }, "PaymentResponse.prototype must have a retry() function (smoke test).");
21
22 function checkCompletedCantRetry(button) {
23   button.disabled = true;
24   promise_test(async t => {
25     const { response } = await getPaymentRequestResponse();
26     // sets response.[[complete]] to true.
27     await response.complete("success");
28     return promise_rejects(
29       t,
30       "InvalidStateError",
31       response.retry(),
32       "response.[[complete]] is true, so rejects with InvalidStateError."
33     );
34   }, button.textContent.trim());
35 }
36
37 function repeatedCallsToRetry(button) {
38   button.disabled = true;
39   promise_test(async t => {
40     const { response } = await getPaymentRequestResponse();
41     const retryPromise = response.retry();
42     await promise_rejects(
43       t,
44       "InvalidStateError",
45       response.retry(),
46       "Calling retry() again rejects with an InvalidStateError"
47     );
48     await retryPromise;
49     await response.complete("success");
50   }, button.textContent.trim());
51 }
52
53 function callCompleteWhileRetrying(button) {
54   button.disabled = true;
55   promise_test(async t => {
56     const { response } = await getPaymentRequestResponse();
57     const retryPromise = response.retry();
58     await promise_rejects(
59       t,
60       "InvalidStateError",
61       response.complete("success"),
62       "Calling complete() while retrying rejects with an InvalidStateError"
63     );
64     await retryPromise;
65     await response.complete("success");
66   }, button.textContent.trim());
67 }
68
69 function callingRequestAbortMustNotAbort(button) {
70   button.disabled = true;
71   promise_test(async t => {
72     const { response, request } = await getPaymentRequestResponse();
73     const retryPromise = response.retry();
74     await promise_rejects(
75       t,
76       "InvalidStateError",
77       request.abort(),
78       "Calling request.abort() while retrying rejects with an InvalidStateError"
79     );
80     await retryPromise;
81     await response.complete("success");
82   }, button.textContent.trim());
83 }
84
85 function canRetryMultipleTimes(button) {
86   button.disabled = true;
87   promise_test(async t => {
88     const { response } = await getPaymentRequestResponse();
89     assert_equals(
90       await response.retry(),
91       undefined,
92       "Expected undefined as the resolve value"
93     );
94     assert_equals(
95       await response.retry(),
96       undefined,
97       "Expected undefined as the resolve value"
98     );
99     await response.complete("success");
100     await promise_rejects(
101       t,
102       "InvalidStateError",
103       response.retry(),
104       "Calling retry() after complete() rejects with a InvalidStateError"
105     );
106   }, button.textContent.trim());
107 }
108
109 function userCanAbortARetry(button) {
110   button.disabled = true;
111   promise_test(async t => {
112     const { response } = await getPaymentRequestResponse();
113     await promise_rejects(
114       t,
115       "AbortError",
116       response.retry(),
117       "The user aborting a retry rejects with a AbortError"
118     );
119     await promise_rejects(
120       t,
121       "InvalidStateError",
122       response.retry(),
123       "After the user aborts, response [[complete]] is true so retry() must reject with InvalidStateError"
124     );
125     await promise_rejects(
126       t,
127       "InvalidStateError",
128       response.complete("success"),
129       "After the user aborts, response [[complete]] is true, so complete() rejects with a InvalidStateError"
130     );
131   }, button.textContent.trim());
132 }
133
134 function userIsShownErrorsFields(button) {
135   button.disabled = true;
136   promise_test(async t => {
137     const { response, request } = await getPaymentRequestResponse({ requestShipping: true });
138     const retryPromise = response.retry({
139       shippingAddress: { city: "Invalid city", addressLine: "Invalid address line" },
140     });
141     await retryPromise;
142     await response.complete("success");
143   }, button.textContent.trim());
144 }
145
146 function abortTheUpdate(button) {
147   button.disabled = true;
148   promise_test(async t => {
149     const { response, request } = await getPaymentRequestResponse({ requestShipping: true });
150     // causes "abort the update" to run
151     const shippingChangedPromise = new Promise(resolve => {
152       request.onshippingoptionchange = () => {
153         event.updateWith({ total: { amount: { currency: "USD", value: "INVALID" } }});
154         resolve();
155       };
156     });
157     const retryPromise = response.retry();
158     await shippingChangedPromise;
159     await promise_rejects(
160       t,
161       new TypeError(),
162       retryPromise,
163       "retry() aborts with a TypeError, because totals' value is invalid"
164     );
165     await promise_rejects(
166       t,
167       "InvalidStateError",
168       response.complete("success"),
169       "After the user aborts, response [[complete]] is true, so complete() rejects with a InvalidStateError"
170     );
171   }, button.textContent.trim());
172 }
173
174 function callingRetryReturnsUniquePromise(button){
175   button.disabled = true;
176   promise_test(async t => {
177     const { response } = await getPaymentRequestResponse();
178     const retryPromise = response.retry();
179     const promises = new Set([
180       retryPromise,
181       response.retry(),
182       response.retry(),
183     ]);
184     assert_equals(promises.size, 3, "Must have three unique objects");
185     await retryPromise;
186     await response.complete();
187   }, button.textContent.trim());
188 };
189
190
191 </script>
192 <h2>
193     Manual Tests for PaymentResponse.retry() - Please run in order!
194 </h2>
195 <p>
196   Click on each button in sequence from top to bottom without refreshing the page.
197   Each button will bring up the Payment Request UI window.
198 </p>
199 <p>
200   When presented with the payment sheet, use any credit card select to "Pay" multiple times.
201 </p>
202 <ol>
203   <li>
204     <button onclick="checkCompletedCantRetry(this);">
205       A completed payment request cannot be retried.
206     </button>
207   </li>
208   <li>
209     <button onclick="repeatedCallsToRetry(this);">
210       Calling retry() more than once yield a rejected promise, but the
211       retryPromise resolves independently.
212     </button>
213   </li>
214   <li>
215     <button onclick="callCompleteWhileRetrying(this);">
216       Calling complete() while a retry() is in progress results in an InvalidStateError.
217     </button>
218   </li>
219   <li>
220     <button onclick="callingRequestAbortMustNotAbort(this);">
221       Trying to abort() via PaymentRequest is not possible.
222     </button>
223   </li>
224   <li>
225     <button onclick="canRetryMultipleTimes(this);">
226       It's possible to retry() multiple times and eventually complete().
227       After complete(), however, retry() rejects with an InvalidStateError.
228     </button>
229   </li>
230   <li>
231     <p>
232       When shown the payment sheet, hit pay once, then abort retrying the payment.
233     </p>
234     <button onclick="userCanAbortARetry(this);">
235       The user aborting retrying a payment causes the retryPromise to reject with AbortError.
236       Aborting a payment is causes it complete.
237     </button>
238   </li>
239   <li>
240     <p>
241       When shown the payment sheet, hit pay once. Check payment sheet for error fields.
242       Then hit escape or otherwise abort the payment.
243     </p>
244     <button onclick="userIsShownErrorsFields(this);">
245       When retrying, the user is shown error fields to fix.
246     </button>
247   </li>
248   <li>
249     <p>
250       When shown the payment sheet, hit pay once. Then retry once.
251     </p>
252     <button onclick="abortTheUpdate(this);">
253       When "abort the update" occurs because of an update error,
254       the `retryPromise` is rejected and response.[[complete]] becomes true.
255     </button>
256   </li>
257   <li>
258     <p>
259       When shown the payment sheet, hit pay once. Then retry once.
260     </p>
261     <button onclick="callingRetryReturnsUniquePromise(this);">
262       Calling retry() multiple times is always a new object.
263     </button>
264   </li>
265   <li>
266     <button onclick="done();">
267       Done!
268     </button>
269   </li>
270 </ol>
271 <small>
272   If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
273   and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
274 </small>