<!DOCTYPE html>
<meta charset="utf-8" />
<title>Tests for PaymentRequestEvent.changePaymentMethod()</title>
<link
  rel="help"
  href="https://w3c.github.io/web-based-payment-handler/#changepaymentmethod-method"
/>
<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>
<p>If the payment sheet is shown, please authorize the mock payment.</p>
<script>
const methodName = window.location.origin
    + '/web-based-payment-handler/change-payment-method-manual-manifest.json';

promise_test(async (t) => {
  const request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  // Intentionally do not respond to the 'paymentmethodchange' event.
  const response = await test_driver.bless('showing a payment sheet', () =>
    request.show()
  );
  const complete_promise = response.complete('success');

  assert_equals(response.details.changePaymentMethodReturned, null);

  return complete_promise;
}, 'If updateWith(details) is not run, changePaymentMethod() returns null.');

promise_test(async (t) => {
  const request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  request.addEventListener('paymentmethodchange', (event) => {
    assert_equals(event.methodName, methodName);
    assert_equals(event.methodDetails.country, 'US');
    event.updateWith(Promise.reject('Error'));
  });
  const response_promise = test_driver.bless(
    'showing a payment sheet',
    () => request.show()
  );

  return promise_rejects_dom(t, 'AbortError', response_promise);
}, 'If updateWith(details) is rejected, abort the PaymentRequest.show().');

promise_test(async (t) => {
  const request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  request.addEventListener('paymentmethodchange', (event) => {
    assert_equals(event.methodName, methodName);
    assert_equals(event.methodDetails.country, 'US');
    event.updateWith(
      new Promise(() => {
        throw 'Error for test';
      })
    );
  });
  const response_promise = test_driver.bless(
    'showing a payment sheet',
    () => request.show()
  );

  return promise_rejects_dom(t, 'AbortError', response_promise);
}, 'If updateWith(details) throws inside of the promise, abort the PaymentRequest.show().');

promise_test(async (t) => {
  const request = new PaymentRequest([{supportedMethods: methodName}], {
    total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
  });
  request.addEventListener('paymentmethodchange', (event) => {
    assert_equals(event.methodName, methodName);
    assert_equals(event.methodDetails.country, 'US');
    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'},
            },
          ],
        },
      ],
      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'},
        },
      ],
    });
  });
  const response = await test_driver.bless('showing a payment sheet', () =>
    request.show()
  );
  const complete_promise = response.complete('success');
  const changePaymentMethodReturned =
    response.details.changePaymentMethodReturned;

  assert_equals(changePaymentMethodReturned.total.currency, 'GBP');
  assert_equals(changePaymentMethodReturned.total.value, '0.02');
  assert_equals(changePaymentMethodReturned.total.label, undefined);
  assert_equals(changePaymentMethodReturned.error, 'Error for test');
  assert_equals(changePaymentMethodReturned.modifiers.length, 1);
  assert_equals(changePaymentMethodReturned.displayItems, undefined);
  assert_equals(changePaymentMethodReturned.shippingOptions, undefined);
  assert_equals(
    changePaymentMethodReturned.paymentMethodErrors.country,
    'Unsupported country'
  );

  const modifier = changePaymentMethodReturned.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 changePaymentMethod() returns some details from the "paymentmethodchange" event\'s updateWith(details) call.');
</script>
