<!DOCTYPE html>
<meta charset="utf-8">
<title>Test for PaymentRequest.abort() method</title>
<link rel="help" href="https://w3c.github.io/browser-payment-api/#abort-method">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src='/resources/testdriver-vendor.js'></script>
<script src="/resources/testdriver.js"></script>
<script>
"use strict";
setup({
  // Ignore unhandled rejections resulting from .show()'s acceptPromise
  // not being explicitly handled.
  allow_uncaught_exception: true,
  explicit_timeout: true,
});
const basicCard = Object.freeze({ supportedMethods: "basic-card" });
const applePay = Object.freeze({
  supportedMethods: "https://apple.com/apple-pay",
});
const defaultMethods = Object.freeze([basicCard, applePay]);
const defaultDetails = Object.freeze({
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "1.00",
    },
  },
});

promise_test(async t => {
  // request is in "created" state
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  await promise_rejects(t, "InvalidStateError", request.abort());
}, `Throws if the promise [[state]] is not "interactive"`);

promise_test(async t => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const acceptPromise = test_driver.bless("show payment request", () =>
    request.show()
  );
  try {
    await request.abort();
  } catch (err) {
    assert_unreached("Unexpected promise rejection: " + err.message);
  }
  await promise_rejects(t, "AbortError", acceptPromise);
  // As request is now "closed", trying to show it will fail
  await promise_rejects(t, "InvalidStateError", request.show());
}, "The same request cannot be shown multiple times.");

promise_test(async t => {
  // request is in "created" state.
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  await promise_rejects(t, "InvalidStateError", request.abort());
  // Call it again, for good measure.
  await promise_rejects(t, "InvalidStateError", request.abort());
  // The request's state is "created", so let's show it
  // which changes the state to "interactive.".
  const acceptPromise = test_driver.bless("show payment request", () =>
    request.show()
  );
  // Let's set request the state to "closed" by calling .abort()
  try {
    await request.abort();
  } catch (err) {
    assert_unreached("Unexpected promise rejection: " + err.message);
  }
  // The request is now "closed", so...
  await promise_rejects(t, "InvalidStateError", request.abort());
  await promise_rejects(t, "AbortError", acceptPromise);
}, "Aborting a request before it is shown doesn't prevent it from being shown later.");

promise_test(async t => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const promises = new Set([request.abort(), request.abort(), request.abort()]);
  assert_equals(promises.size, 3, "Must have three unique objects");
}, "Calling abort() multiple times is always a new object.");
</script>

