diff --git a/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method-protection.https.html b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method-protection.https.html new file mode 100644 index 000000000000..b0582d520d30 --- /dev/null +++ b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method-protection.https.html @@ -0,0 +1,56 @@ + + +Tests for PaymentRequest.canMakePayment() method + + + + + + + + + If you find a buggy test, please file a bug + and tag one of the suggested reviewers. + diff --git a/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html index 2943c2da688f..03a9c19fb8fd 100644 --- a/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html +++ b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html @@ -20,6 +20,56 @@ const defaultDetails = Object.freeze({ }, }); +promise_test(async t => { + const request = new PaymentRequest(defaultMethods, defaultDetails); + assert_true(await request.canMakePayment(), "one of the methods should be supported"); +}, `If payment method identifier and serialized parts are supported, resolve promise with true.`); + +promise_test(async t => { + const request = new PaymentRequest(defaultMethods, defaultDetails); + const acceptPromise = test_driver.bless("show payment request", () => { + request.show() // Sets state to "interactive" + }); + const canMakePaymentPromise = request.canMakePayment(); + try { + const result = await canMakePaymentPromise; + assert_true( + false, + `canMakePaymentPromise should have thrown InvalidStateError` + ); + } catch (err) { + await promise_rejects(t, "InvalidStateError", canMakePaymentPromise); + } finally { + await request.abort(); + await promise_rejects(t, "AbortError", acceptPromise); + } + // The state should be "closed" + await promise_rejects(t, "InvalidStateError", request.canMakePayment()); +}, 'If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException.'); + +promise_test(async t => { + const request = new PaymentRequest(defaultMethods, defaultDetails); + const acceptPromise = test_driver.bless("show payment request", () => { + request.show() // Sets state to "interactive" + }); + acceptPromise.catch(() => {}); // no-op, just to silence unhandled rejection in devtools. + await request.abort(); // The state is now "closed" + await promise_rejects(t, "InvalidStateError", request.canMakePayment()); + try { + const result = await request.canMakePayment(); + assert_true( + false, + `should have thrown InvalidStateError, but instead returned "${result}"` + ); + } catch (err) { + assert_equals( + err.name, + "InvalidStateError", + "must be an InvalidStateError." + ); + } +}, 'If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException.'); + promise_test(async t => { const request = new PaymentRequest(defaultMethods, defaultDetails); try { @@ -40,11 +90,6 @@ promise_test(async t => { } }, `If request.[[state]] is "created", then return a promise that resolves to true for known method.`); -promise_test(async t => { - const request = new PaymentRequest(defaultMethods, defaultDetails); - assert_true(await request.canMakePayment(), "one of the methods should be supported"); -}, `If payment method identifier and serialized parts are supported, resolve promise with true.`); - promise_test(async t => { const unsupportedMethods = [ "this-is-not-supported", @@ -92,81 +137,6 @@ promise_test(async t => { } } }, `If payment method identifier is unknown, resolve promise with false.`); - -promise_test(async t => { - // This test might never actually hit its assertion, but that's allowed. - const request = new PaymentRequest(defaultMethods, defaultDetails); - for (let i = 0; i < 1000; i++) { - try { - await request.canMakePayment(); - } catch (err) { - assert_equals( - err.name, - "NotAllowedError", - "if it throws, then it must be a NotAllowedError." - ); - break; - } - } - for (let i = 0; i < 1000; i++) { - try { - await new PaymentRequest(defaultMethods, defaultDetails).canMakePayment(); - } catch (err) { - assert_equals( - err.name, - "NotAllowedError", - "if it throws, then it must be a NotAllowedError." - ); - break; - } - } -}, `Optionally, at the user agent's discretion, return a promise rejected with a "NotAllowedError" DOMException.`); - -promise_test(async t => { - const request = new PaymentRequest(defaultMethods, defaultDetails); - const acceptPromise = test_driver.bless("show payment request", () => { - request.show() // Sets state to "interactive" - }); - const canMakePaymentPromise = request.canMakePayment(); - try { - const result = await canMakePaymentPromise; - assert_true( - false, - `canMakePaymentPromise should have thrown InvalidStateError` - ); - } catch (err) { - await promise_rejects(t, "InvalidStateError", canMakePaymentPromise); - } finally { - await request.abort(); - await promise_rejects(t, "AbortError", acceptPromise); - } - // The state should be "closed" - await promise_rejects(t, "InvalidStateError", request.canMakePayment()); -}, 'If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException.'); - -promise_test(async t => { - const request = new PaymentRequest(defaultMethods, defaultDetails); - const acceptPromise = test_driver.bless("show payment request", () => { - request.show() // Sets state to "interactive" - }); - acceptPromise.catch(() => {}); // no-op, just to silence unhandled rejection in devtools. - await request.abort(); // The state is now "closed" - await promise_rejects(t, "InvalidStateError", request.canMakePayment()); - try { - const result = await request.canMakePayment(); - assert_true( - false, - `should have thrown InvalidStateError, but instead returned "${result}"` - ); - } catch (err) { - assert_equals( - err.name, - "InvalidStateError", - "must be an InvalidStateError." - ); - } -}, 'If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException.'); -