test_retryPayment.html (11474B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=1435161 5 --> 6 <head> 7 <meta charset="utf-8"> 8 <title>Test for retry PaymentRequest</title> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 10 <script src="/tests/SimpleTest/SimpleTest.js"></script> 11 <script type="application/javascript" src="DefaultData.js"></script> 12 <script type="application/javascript"> 13 14 "use strict"; 15 SimpleTest.waitForExplicitFinish(); 16 17 const gUrl = SimpleTest.getTestFileURL('RetryPaymentChromeScript.js'); 18 const gScript = SpecialPowers.loadChromeScript(gUrl); 19 20 function testFailHandler(message) { 21 ok(false, message); 22 } 23 function testPassHandler(message) { 24 ok(true, message); 25 } 26 gScript.addMessageListener("test-fail", testFailHandler); 27 gScript.addMessageListener("test-pass", testPassHandler); 28 29 async function requestChromeAction(action, params) { 30 gScript.sendAsyncMessage(action, params); 31 await new Promise(resolve => { 32 gScript.addMessageListener(`${action}-complete`, function completeListener() { 33 gScript.removeMessageListener(`${action}-complete`, completeListener); 34 resolve(); 35 }); 36 }); 37 } 38 39 const validationErrors = { 40 error: "error", 41 shippingAddress: { 42 addressLine: "addressLine error", 43 city: "city error", 44 country: "country error", 45 dependentLocality: "dependentLocality error", 46 organization: "organization error", 47 phone: "phone error", 48 postalCode: "postalCode error", 49 recipient: "recipient error", 50 region: "region error", 51 regionCode: "regionCode error", 52 sortingCode: "sortingCode error", 53 }, 54 payer: { 55 name: "name error", 56 email: "email error", 57 phone: "phone error", 58 }, 59 paymentMethod: { 60 account: "method account error", 61 password: "method password error", 62 }, 63 }; 64 65 const options = { 66 requestPayerName: true, 67 requestPayerEmail: true, 68 requestPayerPhone: true, 69 requestShipping: true, 70 shippingType: "shipping" 71 }; 72 73 function checkShowResponse(testName, payResponse) { 74 const { payerName, payerEmail, payerPhone } = payResponse.toJSON(); 75 is( 76 payerName, 77 "Bill A. Pacheco", 78 `${testName}: Expected 'Bill A. Pacheco' on payerName, but got '${payerName}' after show PaymentRequest` 79 ); 80 is( 81 payerEmail, 82 "", 83 `${testName}: Expected '' on payerEmail, but got '${payerEmail}' after show PaymentRequest` 84 ); 85 is( 86 payerPhone, 87 "", 88 `${testName}: Expected '' on payerPhone, but got '${payerPhone}' after show PaymentRequest` 89 ); 90 } 91 92 function checkRetryResponse(testName, payResponse) { 93 const { payerName, payerEmail, payerPhone } = payResponse.toJSON(); 94 is( 95 payerName, 96 "Bill A. Pacheco", 97 `${testName}: Expected 'Bill A. Pacheco' on payerName, but got '${payerName}' after retry PaymentRequest` 98 ); 99 is( 100 payerEmail, 101 "bpacheco@test.org", 102 `${testName} : Expected 'bpacheco@test.org' on payerEmail, but got '${payerEmail}' after retry PaymentRequest` 103 ); 104 is( 105 payerPhone, 106 "+123456789", 107 `${testName} : Expected '+123456789' on payerPhone, but got '${payerPhone}' after retry PaymentRequest` 108 ); 109 } 110 111 function unexpectedErrMsg(testName, errName, timing) { 112 return `${testName}: Unexpected error(${errName}) when ${timing} the PaymentRequest.`; 113 } 114 115 function expectedErrMsg(testName, expectedErr, errName, timing) { 116 return `${testName}: Expected '${expectedErr}' when ${timing} PaymentResponse, but got '${errName}'.`; 117 } 118 119 async function testRetryAfterComplete() { 120 const testName = "testRetryAfterComplete"; 121 await requestChromeAction("start-test", testName); 122 const payRequest = new PaymentRequest(defaultMethods, defaultDetails, options); 123 ok(payRequest, testName + ": failed to create PaymentRequest."); 124 if (!payRequest) { 125 await requestChromeAction("finish-test"); 126 return; 127 } 128 const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); 129 let payResponse; 130 try { 131 payResponse = await payRequest.show(); 132 await checkShowResponse(testName, payResponse); 133 handler.destruct(); 134 } catch(err) { 135 ok(false, unexpectedErrMsg(testName, err.Name, "showing")); 136 await requestChromeAction("finish-test"); 137 handler.destruct(); 138 return; 139 } 140 try { 141 await payResponse.complete("success"); 142 } catch(err) { 143 let errName = err.Name; 144 ok(false, unexpectedErrMsg(testName, err.Name, "completing")); 145 await requestChromeAction("finish-test"); 146 return; 147 } 148 try { 149 await payResponse.retry(validationErrors); 150 ok(false, `${testName}: Unexpected success when retry the PaymentResponse.`); 151 } catch(err) { 152 is(err.name, 153 "InvalidStateError", 154 expectedErrMsg(testName, "InvalidStateError", err.name, "retrying")); 155 } 156 await requestChromeAction("finish-test"); 157 } 158 159 async function testRetryAfterRetry() { 160 const testName = "testRetryAfterRetry"; 161 await requestChromeAction("start-test", testName); 162 const payRequest = new PaymentRequest(defaultMethods, defaultDetails, options); 163 ok(payRequest, testName + ": failed to create PaymentRequest."); 164 if (!payRequest) { 165 await requestChromeAction("finish-test"); 166 return; 167 } 168 const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); 169 let payResponse; 170 try { 171 payResponse = await payRequest.show(); 172 await checkShowResponse(testName, payResponse); 173 handler.destruct(); 174 } catch(err) { 175 ok(false, unexpectedErrMsg(testName, err.name, "showing")); 176 await requestChromeAction("finish-test"); 177 handler.destruct(); 178 return; 179 } 180 let retryPromise; 181 try { 182 retryPromise = payResponse.retry(validationErrors); 183 await payResponse.retry(validationErrors); 184 ok(false, `${testName}: Unexpected success when retry the PaymentResponse.`); 185 await requestChromeAction("finish-test"); 186 return; 187 } catch(err) { 188 is(err.name, 189 "InvalidStateError", 190 expectedErrMsg(testName, "InvalidStateError", err.name, "retrying")); 191 } 192 try { 193 await retryPromise; 194 await payResponse.complete("success"); 195 } catch(err) { 196 ok(false, unexpectedErrMsg(testName, err.name, "completing")); 197 await requestChromeAction("finish-test"); 198 return; 199 } 200 await requestChromeAction("finish-test"); 201 } 202 203 async function testRetryWithEmptyErrors() { 204 const testName = "testRetryWithEmptyErrors"; 205 await requestChromeAction("start-test", testName); 206 const payRequest = new PaymentRequest(defaultMethods, defaultDetails, options); 207 ok(payRequest, testName + ": failed to create PaymentRequest."); 208 if (!payRequest) { 209 requestChromeAction("finish-test"); 210 return; 211 } 212 const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); 213 let payResponse; 214 try { 215 payResponse = await payRequest.show(); 216 await checkShowResponse(testName, payResponse); 217 handler.destruct(); 218 } catch(err) { 219 ok(false, unexpectedErrMsg(testName, err.name, "showing")); 220 await requestChromeAction("finish-test"); 221 handler.destruct(); 222 return; 223 } 224 try { 225 await payResponse.retry(); 226 ok(false, `${testName}: Unexpected success when retry the PaymentResponse.`); 227 await requestChromeAction("finish-test"); 228 return; 229 } catch(err) { 230 is(err.name, 231 "AbortError", 232 expectedErrMsg(testName, "AbortError", err.name, "retrying")); 233 } 234 try { 235 await payResponse.complete("success"); 236 } catch(err) { 237 ok(false, unexpectedErrMsg(testName, err.name, "completing")); 238 await requestChromeAction("finish-test"); 239 return; 240 } 241 await requestChromeAction("finish-test"); 242 } 243 244 async function testRetry() { 245 const testName = "testRetry"; 246 await requestChromeAction("start-test", testName); 247 const payRequest = new PaymentRequest(defaultMethods, defaultDetails, options); 248 ok(payRequest, testName + ": failed to create PaymentRequest."); 249 if (!payRequest) { 250 await requestChromeAction("finish-test"); 251 return; 252 } 253 const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); 254 let payResponse; 255 try { 256 payResponse = await payRequest.show(); 257 await checkShowResponse(testName, payResponse); 258 handler.destruct(); 259 } catch(err) { 260 ok(false, unexpectedErrMsg(testName, err.name, "showing")); 261 await requestChromeAction("finish-test"); 262 handler.destruct(); 263 return; 264 } 265 try { 266 await payResponse.retry(validationErrors); 267 await checkRetryResponse(testName, payResponse); 268 await payResponse.complete("success"); 269 } catch(err) { 270 ok(false, unexpectedErrMsg(testName, err.name, "retrying")); 271 await requestChromeAction("finish-test"); 272 return; 273 } 274 await requestChromeAction("finish-test"); 275 } 276 277 async function testRetryAbortByUser() { 278 const testName = "testRetryAbortByUser"; 279 await requestChromeAction("reject-retry"); 280 const payRequest = new PaymentRequest(defaultMethods, defaultDetails, options); 281 ok(payRequest, testName + ": failed to create PaymentRequest."); 282 if (!payRequest) { 283 await requestChromeAction("finish-test"); 284 return; 285 } 286 const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); 287 let payResponse; 288 try { 289 payResponse = await payRequest.show(); 290 await checkShowResponse(testName, payResponse); 291 handler.destruct(); 292 } catch(err) { 293 ok(false, unexpectedErrMsg(testName, err.name, "showing")); 294 handler.destruct(); 295 await requestChromeAction("finish-test"); 296 return; 297 } 298 try { 299 await payResponse.retry(validationErrors); 300 ok(false, `${testName}: Unexpected success when retry the PaymentResponse.`); 301 await requestChromeAction("finish-test"); 302 return; 303 } catch(err) { 304 is(err.name, 305 "AbortError", 306 expectedErrMsg(testName, "AbortError", err.name, "retrying")); 307 } 308 await requestChromeAction("finish-test"); 309 } 310 311 function teardown() { 312 return new Promise((resolve, reject) => { 313 gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() { 314 gScript.removeMessageListener("teardown-complete", teardownCompleteHandler); 315 gScript.removeMessageListener("test-fail", testFailHandler); 316 gScript.removeMessageListener("test-pass", testPassHandler); 317 gScript.destroy(); 318 SimpleTest.finish(); 319 resolve(); 320 }); 321 gScript.sendAsyncMessage("teardown"); 322 }); 323 } 324 325 async function runTests() { 326 try { 327 await testRetryAfterComplete() 328 await testRetryAfterRetry() 329 await testRetryWithEmptyErrors() 330 await testRetry() 331 await testRetryAbortByUser() 332 await teardown() 333 } catch(e) { 334 ok(false, "Unexpected error: " + e.name); 335 SimpleTest.finish(); 336 } 337 } 338 339 window.addEventListener('load', function() { 340 SpecialPowers.pushPrefEnv({ 341 'set': [ 342 ['dom.payments.request.enabled', true], 343 ] 344 }, runTests); 345 }); 346 </script> 347 </head> 348 <body> 349 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1435161">Mozilla Bug 1435161</a> 350 </body> 351 </html>