<!doctype html> <meta charset="utf-8"> <title>Tests for CanMakePaymentEvent</title> <link rel="help" href="https://w3c.github.io/payment-handler/#the-canmakepaymentevent"> <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> const DEFAULT_METHOD_NAME = window.location.origin + '/payment-handler/' + 'can-make-payment-event-manifest.json'; async function registerApp(responseType = 'canMakePayment-true') { const request = new PaymentRequest( [{supportedMethods: DEFAULT_METHOD_NAME, data: {responseType}}], {total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}}}); const response = await test_driver.bless('installing a payment app', () => request.show() ); return response.complete('success'); } function buildPaymentRequest(methodName = DEFAULT_METHOD_NAME) { const unsupportedMethodName = methodName + '/unsupported'; return new PaymentRequest( [ { supportedMethods: methodName, data: { defaultParameter: 'defaultValue', }, }, { supportedMethods: unsupportedMethodName, data: { defaultUnsupportedParameter: 'defaultUnsupportedValue', }, }, ], { total: { label: 'Total', amount: { currency: 'USD', value: '0', }, }, displayItems: [ { label: 'Nada', amount: {currency: 'USD', value: '0'}, }, ], modifiers: [ { supportedMethods: [methodName], data: { modifiedParameter: 'modifiedValue', }, total: { label: 'Modified Total', amount: { currency: 'USD', value: '0.0001', }, }, additionalDisplayItems: [ { label: 'Something', amount: {currency: 'USD', value: '0.0001'}, }, ], }, { supportedMethods: [unsupportedMethodName], data: { modifiedUnsupportedParameter: 'modifiedUnsupportedValue', }, total: { label: 'Modified Unsupported Total', amount: { currency: 'USD', value: '10', }, }, additionalDisplayItems: [ { label: 'Something Unsupported', amount: {currency: 'USD', value: '10'}, }, ], }, ], }, ); } promise_test(async t => { // Intentionally do not install the payment app. const request = buildPaymentRequest(); assert_not_equals(request, undefined); let paymentRequestCanMakePaymentResult; try { paymentRequestCanMakePaymentResult = await request.canMakePayment(); } catch (err) { assert_equals( err.name, 'NotAllowedError', 'If it throws, then it must be NotAllowedError', ); } assert_true( paymentRequestCanMakePaymentResult, 'canMakePayment() must return true.', ); await test_driver.bless('installing a payment app just-in-time'); const response = await request.show(); assert_equals('success', response.details.status); return response.complete('success'); }, 'If a payment handler is not installed, but can be installed just-in-time, then the payment method is supported.'); promise_test(async t => { // Intentionally do not install the payment app. const request = buildPaymentRequest(DEFAULT_METHOD_NAME + '/non-existent'); assert_not_equals(request, undefined); let paymentRequestCanMakePaymentResult; try { paymentRequestCanMakePaymentResult = await request.canMakePayment(); } catch (err) { assert_equals( err.name, 'NotAllowedError', 'If it throws, then it must be NotAllowedError', ); } assert_false( paymentRequestCanMakePaymentResult, 'canMakePayment() must return false.', ); const response = await test_driver.bless('invoking a payemnt app'); await promise_rejects_dom(t, 'NotSupportedError', request.show()); }, 'If a payment handler is not installed and cannot be installed just-in-time, then the payment method is not supported.'); promise_test(async t => { await registerApp('canMakePayment-false'); const request = buildPaymentRequest(); assert_not_equals(request, undefined); let paymentRequestCanMakePaymentResult; try { paymentRequestCanMakePaymentResult = await request.canMakePayment(); } catch (err) { assert_equals( err.name, 'NotAllowedError', 'If it throws, then it must be NotAllowedError', ); } assert_true( paymentRequestCanMakePaymentResult, 'canMakePayment() must return true.', ); await test_driver.bless('invoking a payment app'); const response = await request.show(); assert_equals('success', response.details.status); return response.complete('success'); }, 'If CanMakePaymentEvent.respondWith(false) is called, then canMakePayment() still returns true and the app can still be invoked.'); promise_test(async t => { await registerApp('canMakePayment-promise-false'); const request = buildPaymentRequest(); assert_not_equals(request, undefined); let paymentRequestCanMakePaymentResult; try { paymentRequestCanMakePaymentResult = await request.canMakePayment(); } catch (err) { assert_equals( err.name, 'NotAllowedError', 'If it throws, then it must be NotAllowedError', ); } assert_true( paymentRequestCanMakePaymentResult, 'canMakePayment() must return true.', ); await test_driver.bless('invoking a payment app'); const response = await request.show(); assert_equals('success', response.details.status); return response.complete('success'); }, 'If CanMakePaymentEvent.respondWith(Promise.resolve(false)) is called, then canMakePayment() still returns true and the app can still be invoked.'); promise_test(async t => { await registerApp('canMakePayment-true'); const request = buildPaymentRequest(); assert_not_equals(request, undefined); let paymentRequestCanMakePaymentResult; try { paymentRequestCanMakePaymentResult = await request.canMakePayment(); } catch (err) { assert_equals( err.name, 'NotAllowedError', 'If it throws, then it must be NotAllowedError', ); } assert_true( paymentRequestCanMakePaymentResult, 'canMakePayment() must return true.', ); await test_driver.bless('invoking a payment app'); const response = await request.show(); assert_equals('success', response.details.status); return response.complete('success'); }, 'If CanMakePaymentEvent.respondWith(true) is called, then canMakePayment() returns true and the app can be invoked.'); promise_test(async t => { await registerApp('canMakePayment-promise-true'); const request = buildPaymentRequest(); assert_not_equals(request, undefined); let paymentRequestCanMakePaymentResult; try { paymentRequestCanMakePaymentResult = await request.canMakePayment(); } catch (err) { assert_equals( err.name, 'NotAllowedError', 'If it throws, then it must be NotAllowedError', ); } assert_true( paymentRequestCanMakePaymentResult, 'canMakePayment() must return true.', ); await test_driver.bless('invoking a payment app'); const response = await request.show(); assert_equals('success', response.details.status); return response.complete('success'); }, 'If CanMakePaymentEvent.respondWith(Promise.resolve(true)) is called, then canMakePayment() returns true and the app can be invoked.'); promise_test(async t => { await registerApp('canMakePayment-custom-error'); const request = buildPaymentRequest(); assert_not_equals(request, undefined); let paymentRequestCanMakePaymentResult; try { paymentRequestCanMakePaymentResult = await request.canMakePayment(); } catch (err) { assert_equals( err.name, 'NotAllowedError', 'If it throws, then it must be NotAllowedError', ); } assert_true( paymentRequestCanMakePaymentResult, 'canMakePayment() must return true.', ); await test_driver.bless('invoking a payment app'); const response = await request.show(); assert_equals('success', response.details.status); return response.complete('success'); }, 'If CanMakePaymentEvent.respondWith(Promise.reject(error)) is called, then canMakePayment() still returns true and the app can still be invoked.'); </script>