chromium/components/test/data/payments/change_payment_method.js

/*
 * Copyright 2019 The Chromium Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

let methodName = window.location.origin;
let request = undefined;

/**
 * Shows the payment sheet and outputs the return value of
 * PaymentRequestEvent.changePaymentMethod().
 * @param {PaymentRequest} request - The PaymentRequest object for showing the
 *                                   payment sheet.
 * @return {String} The output.
 */
function outputChangePaymentMethodReturnValue(request) {
  return request.show()
      .then((response) => {
        return response.complete('success').then(() => {
          return output(
              'PaymentRequest.show()',
              'changePaymentMethod() returned: ' +
                  JSON.stringify(response.details.changePaymentMethodReturned),
          );
        });
      })
      .catch((error) => {
        return output('PaymentRequest.show() rejected with', error);
      });
}

/** @return {PaymentRequest} The Payment Request object for testNoHandler(). */
function initTestNoHandler() {
  request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  return request;
}

/**
 * Verifies that PaymentRequestEvent.changePaymentMethod() returns null if there
 * is no handler for the "paymentmethodchange" event in PaymentRequest.
 */
function testNoHandler() {
  // Intentionally do not respond to the 'paymentmethodchange' event.
  outputChangePaymentMethodReturnValue(initTestNoHandler());
}

/** @return {PaymentRequest} The Payment Request object for testReject(). */
function initTestReject() {
  request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  request.addEventListener('paymentmethodchange', (event) => {
    event.updateWith(Promise.reject('Error for test'));
  });
  return request;
}

/**
 * Verifies that PaymentRequest.show() is rejected if the promise passed into
 * PaymentMethodChangeEvent.updateWith() is rejected.
 */
function testReject() {
  outputChangePaymentMethodReturnValue(initTestReject());
}

/** @return {PaymentRequest} The Payment Request object for testThrow(). */
function initTestThrow() {
  request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  request.addEventListener('paymentmethodchange', (event) => {
    event.updateWith(
        new Promise(() => {
          throw new Error('Error for test');
        }),
    );
  });
  return request;
}

/**
 * Verifies that PaymentRequest.show() is rejected if there is an exception in
 * the promised passed into PaymentMethodChangeEvent.updateWith().
 */
function testThrow() {
  outputChangePaymentMethodReturnValue(initTestThrow());
}

/** @return {PaymentRequest} The Payment Request object for testDetails(). */
function initTestDetails() {
  request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  request.addEventListener('paymentmethodchange', (event) => {
    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 + '/other',
          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'},
            },
          ],
        },
      ],
      paymentMethodErrors: {country: 'Unsupported country'},
      displayItems: [
        {
          label: 'Display item',
          amount: {currency: 'CNY', value: '0.04'},
        },
      ],
      shippingOptions: [
        {
          label: 'Shipping option',
          id: 'id',
          amount: {currency: 'JPY', value: '0.05'},
        },
      ],
    });
  });
  return request;
}

/**
 * Verifies that PaymentRequestEvent.changePaymentMethod() returns a subset of
 * details passed into PaymentMethodChangeEvent.updateWith() method.
 */
function testDetails() {
  outputChangePaymentMethodReturnValue(initTestDetails());
}