<!DOCTYPE html>
<meta charset="utf-8" />
<title>Tests for PaymentRequestEvent.changePaymentMethod()</title>
<link
  rel="help"
  href="https://w3c.github.io/payment-handler/#changepaymentmethod-method"
/>
<link rel="manifest" href="/payment-handler/manifest.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>
  async function runTests(registration) {
    const methodName = window.location.origin + '/payment-handler/payment-app/';
    await registration.paymentManager.instruments.clear();
    await registration.paymentManager.instruments.set('instrument-key', {
      name: 'Instrument Name',
      method: methodName,
    });

    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.');
  }

  registerAndActiveServiceWorker(
    'app-change-payment-method.js',
    'payment-app/',
    runTests
  );
</script>
