<!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 basicCard = Object.freeze({ supportedMethods: "basic-card" });
const defaultMethods = Object.freeze([basicCard]);
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(
      "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(
      "InvalidStateError",
      () => {
        ev.updateWith(Promise.resolve())
      },
      `untrusted event of type "${ev.type}" must throw "InvalidStateError"`
    );
  });
}, `Calling .updateWith() with a dispatched, untrusted event, throws "InvalidStateError"`);

</script>
