<!DOCTYPE html>
<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<meta charset="utf-8">
<title>Test for PaymentRequestUpdateEvent's updateWith() method</title>
<link rel="help" href="https://w3c.github.io/browser-payment-api/#updatewith-method">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
const examplePay = Object.freeze({ supportedMethods: "https://example.com/pay" });
const defaultMethods = Object.freeze([examplePay]);
const defaultDetails = Object.freeze({
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "1.00",
    },
  },
});

test(() => {
  // Smoke test - checks target is set as expected
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const ev = new PaymentRequestUpdateEvent("test");
  request.dispatchEvent(ev);
  assert_equals(ev.target, request, "The request and the target at the same");
}, "Let target be the request which is dispatching the event.");

// Github issue: https://github.com/w3c/browser-payment-api/issues/546
test(() => {
  const untrustedEvents = [
    new PaymentRequestUpdateEvent("just a test"),
    new PaymentRequestUpdateEvent("shippingaddresschange"),
    new PaymentRequestUpdateEvent("shippingoptionchange"),
  ].forEach(ev => {
    assert_throws_dom(
      "InvalidStateError",
      () => {
        ev.updateWith(Promise.resolve());
      },
      `untrusted event of type "${ev.type}" must throw "InvalidStateError"`
    );
  });
}, `Calling .updateWith() with an undispatched untrusted event throws "InvalidStateError"`);

// Github issue: https://github.com/w3c/browser-payment-api/issues/546
test(() => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const untrustedEvents = [
    new PaymentRequestUpdateEvent("just a test"),
    new PaymentRequestUpdateEvent("shippingaddresschange"),
    new PaymentRequestUpdateEvent("shippingoptionchange"),
  ].map(ev => {
    request.dispatchEvent(ev); // set .target and dispatch flag
    // unstrusted event.
    assert_throws_dom(
      "InvalidStateError",
      () => {
        ev.updateWith(Promise.resolve())
      },
      `untrusted event of type "${ev.type}" must throw "InvalidStateError"`
    );
  });
}, `Calling .updateWith() with a dispatched, untrusted event, throws "InvalidStateError"`);

</script>
