<!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";
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(t, "InvalidStateError", hasEnrolledInstrumentPromise);

  await request.abort();
  await promise_rejects(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(t, "AbortError", acceptPromise);

  const hasEnrolledInstrumentPromise = request.hasEnrolledInstrument();
  await promise_rejects(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>
