| <!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> |