| <!DOCTYPE html> |
| <meta charset="utf-8" /> |
| <title>Tests for PaymentRequestEvent.changeShippingOption()</title> |
| |
| <link rel="manifest" href="/payment-handler/basic-card.json" /> |
| <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 src="register-and-activate-service-worker.js"></script> |
| <p>If the payment sheet is shown, please authorize the mock payment.</p> |
| <script> |
| const methodName = window.location.origin + '/payment-handler/payment-app/'; |
| function createRequest() { |
| return new PaymentRequest([{supportedMethods: methodName}], { |
| total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}}, |
| shippingOptions: [{ |
| id: 'freeShippingOption', |
| label: 'Free global shipping', |
| amount: { |
| currency: 'USD', |
| value: '0', |
| }, |
| selected: false, |
| }, |
| { |
| id: 'expressShippingOption', |
| label: 'express global shipping', |
| amount: { |
| currency: 'USD', |
| value: '0', |
| }, |
| selected: true, |
| }], |
| }, {requestShipping: true}); |
| } |
| |
| async function completeAppSetUp(registration) { |
| await registration.paymentManager.instruments.clear(); |
| await registration.paymentManager.instruments.set('instrument-key', { |
| name: 'Instrument Name', |
| method: methodName, |
| }); |
| await navigator.serviceWorker.ready; |
| await registration.paymentManager.enableDelegations(['shippingAddress']); |
| } |
| |
| async function runTests(registration) { |
| await completeAppSetUp(registration); |
| promise_test(async (t) => { |
| const request = createRequest(); |
| // Intentionally do not respond to the 'shippingoptionchange' event. |
| const response = await test_driver.bless('showing a payment sheet', () => |
| request.show() |
| ); |
| const complete_promise = response.complete('success'); |
| |
| assert_equals(response.details.changeShippingOptionReturned, null); |
| |
| return complete_promise; |
| }, 'If updateWith(details) is not run, changeShippingOption() returns null.'); |
| |
| promise_test(async (t) => { |
| const request = createRequest(); |
| request.addEventListener('shippingoptionchange', (event) => { |
| assert_equals(request.shippingOption, 'freeShippingOption'); |
| event.updateWith({ |
| total: {label: 'Total', amount: {currency: 'GBP', value: '0.02'}}, |
| error: 'Error for test', |
| modifiers: [ |
| { |
| supportedMethods: methodName, |
| data: {soup: 'potato'}, |
| total: { |
| label: 'Modified total', |
| amount: {currency: 'EUR', value: '0.03'}, |
| }, |
| additionalDisplayItems: [ |
| { |
| label: 'Modified display item', |
| amount: {currency: 'INR', value: '0.06'}, |
| }, |
| ], |
| }, |
| { |
| supportedMethods: methodName + '2', |
| data: {soup: 'tomato'}, |
| total: { |
| label: 'Modified total #2', |
| amount: {currency: 'CHF', value: '0.07'}, |
| }, |
| additionalDisplayItems: [ |
| { |
| label: 'Modified display item #2', |
| amount: {currency: 'CAD', value: '0.08'}, |
| }, |
| ], |
| }, |
| ], |
| displayItems: [ |
| { |
| label: 'Display item', |
| amount: {currency: 'CNY', value: '0.04'}, |
| }, |
| ], |
| shippingOptions: [ |
| { |
| id: 'freeShippingOption', |
| label: 'express global shipping', |
| amount: { |
| currency: 'USD', |
| value: '0', |
| }, |
| selected: true, |
| } |
| ], |
| }); |
| }); |
| const response = await test_driver.bless('showing a payment sheet', () => |
| request.show() |
| ); |
| const complete_promise = response.complete('success'); |
| const changeShippingOptionReturned = |
| response.details.changeShippingOptionReturned; |
| |
| assert_equals(changeShippingOptionReturned.total.currency, 'GBP'); |
| assert_equals(changeShippingOptionReturned.total.value, '0.02'); |
| assert_equals(changeShippingOptionReturned.total.label, undefined); |
| assert_equals(changeShippingOptionReturned.error, 'Error for test'); |
| assert_equals(changeShippingOptionReturned.modifiers.length, 1); |
| assert_equals(changeShippingOptionReturned.displayItems, undefined); |
| assert_equals(changeShippingOptionReturned.shippingOptions.length, 1); |
| assert_equals(changeShippingOptionReturned.paymentMethodErrors, undefined); |
| assert_equals(changeShippingOptionReturned.shippingAddressErrors, undefined); |
| |
| const shipping_option = changeShippingOptionReturned.shippingOptions[0]; |
| assert_equals(shipping_option.id, 'freeShippingOption' ); |
| assert_equals(shipping_option.label, 'express global shipping'); |
| assert_equals(shipping_option.amount.currency, 'USD'); |
| assert_equals(shipping_option.amount.value, '0'); |
| assert_true(shipping_option.selected); |
| |
| const modifier = changeShippingOptionReturned.modifiers[0]; |
| assert_equals(modifier.supportedMethods, methodName); |
| assert_equals(modifier.data.soup, 'potato'); |
| assert_equals(modifier.total.label, ''); |
| assert_equals(modifier.total.amount.currency, 'EUR'); |
| assert_equals(modifier.total.amount.value, '0.03'); |
| assert_equals(modifier.additionalDisplayItems, undefined); |
| |
| return complete_promise; |
| }, 'The changeShippingOption() returns some details from the "shippingoptionchange" event\'s updateWith(details) call.'); |
| } |
| |
| registerAndActiveServiceWorker( |
| 'app-change-shipping-option.js', |
| 'payment-app/', |
| runTests |
| ); |
| </script> |