<!DOCTYPE html>
<meta charset="utf-8" />
<title>
  Payment Method Basic Card: steps for selecting the payment handler
</title>
<link
  rel="help"
  href="https://w3c.github.io/payment-method-basic-card/#selecting-the-payment-handler"
/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
  setup({ explicit_done: true, explicit_timeout: true });
  const defaultDetails = {
    total: {
      label: "Total",
      amount: {
        currency: "USD",
        value: "1.00",
      },
    },
  };

  function emptyDataIsAllNetworks(testableAssertion) {
    promise_test(async t => {
      const methodData = [
        {
          supportedMethods: "basic-card",
        },
      ];
      const showPromise = new PaymentRequest(methodData, defaultDetails).show();
      await promise_rejects_dom(t, "AbortError", showPromise);
    }, testableAssertion.trim());
  }

  function mixedPMILastOneWins(testableAssertion) {
    promise_test(async t => {
      const methodData = [
        {
          supportedMethods: "basic-card",
          data: {
            supportedNetworks: [],
          },
        },
        {
          supportedMethods: "basic-card",
          data: {
            supportedNetworks: ["visa"],
          },
        },
        {
          supportedMethods: "https://example.com/bobpay",
        },
      ];
      const showPromise = new PaymentRequest(methodData, defaultDetails).show();
      await promise_rejects_dom(t, "AbortError", showPromise);
    }, testableAssertion.trim());
  }

  function lastOneWinsEvenIfDataIsMissing(testableAssertion) {
    promise_test(async t => {
      const methodData = [
        {
          supportedMethods: "basic-card",
          data: {
            supportedNetworks: ["visa"],
          },
        },
        // Same as data: { supportedNetworks: [] }
        {
          supportedMethods: "basic-card",
        },
      ];
      const showPromise = new PaymentRequest(methodData, defaultDetails).show();
      await promise_rejects_dom(t, "AbortError", showPromise);
    }, testableAssertion.trim());
  }
</script>
<h1>Manual tests</h1>
<ol>
  <li>
    <p>
      To pass, this test must show the payment sheet and allow paying with any
      card.
    </p>
    <button onclick="emptyDataIsAllNetworks(this.textContent.trim())">
      If no data is passed, it's the same as passing an empty BasicCardRequest
      (i.e., allow all networks).
    </button>
  </li>
  <li>
    <p>
      To pass, this test must show the payment sheet and restrict to "visa"
      credit cards.
    </p>
    <button onclick="mixedPMILastOneWins(this.textContent.trim())">
      It ignores unknown PMIs and last "basic-card" wins - in this case, "visa".
    </button>
  </li>
  <li>
    <p>
      To pass, this test must show the payment sheet and allow paying with any
      card.
    </p>
    <button onclick="lastOneWinsEvenIfDataIsMissing(this.textContent.trim())">
      "Last one wins" even if data is missing.
    </button>
  </li>
  <li><button onclick="done()">Done!</button></li>
</ol>
