<!DOCTYPE html>
<meta charset="utf-8">
<title>Tests for PaymentRequest.hasEnrolledInstrument() method</title>
<link rel="help" href="https://w3c.github.io/payment-request/#hasenrolledinstrument-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>
<script>
"use strict";

setup({ allow_uncaught_exception: true });

const unsupportedMethods = [
  { supportedMethods: "this-is-not-supported" },
  { supportedMethods: "https://not.supported" },
];
const defaultMethods = Object.freeze([
  {
    supportedMethods: "basic-card",
    data: {
      supportedNetworks: [ 'visa' ],
    },
  }
]);
const defaultDetails = Object.freeze({
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "1.00",
    },
  },
});

promise_test(async t => {
  const request = new PaymentRequest(unsupportedMethods, defaultDetails);
  assert_false(
    await request.hasEnrolledInstrument(),
    "hasEnrolledInstrument() should resolve to false."
  );
}, `hasEnrolledInstrument() resolves to false for unsupported payment methods.`);

promise_test(async t => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const [acceptPromise, hasEnrolledInstrumentPromise] = await test_driver.bless(
      "show payment request",
      () => {
        const acceptPromise = request.show();  // Sets state to "interactive"
        const hasEnrolledInstrumentPromise = request.hasEnrolledInstrument();
        return [acceptPromise, hasEnrolledInstrumentPromise];
      });
  await promise_rejects_dom(t, "InvalidStateError", hasEnrolledInstrumentPromise);

  await request.abort();
  await promise_rejects_dom(t, "AbortError", acceptPromise);
}, `If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException.`);

promise_test(async t => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const [abortPromise, acceptPromise] = await test_driver.bless( "show payment request", () => {
    const acceptPromise = request.show();  // Sets state to "interactive"
    acceptPromise.catch(() => {});  // no-op, just to handle unhandled rejection in devtools.
    const abortPromise =request.abort();  // Sets state to "closed"
    return [abortPromise, acceptPromise];
  });
  await abortPromise;
  await promise_rejects_dom(t, "AbortError", acceptPromise);

  const hasEnrolledInstrumentPromise = request.hasEnrolledInstrument();
  await promise_rejects_dom(t, "InvalidStateError", hasEnrolledInstrumentPromise);
}, `If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException.`);
</script>

<small>
  If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
  and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
</small>
