<!DOCTYPE html> <meta charset="utf-8" />
<title>Validates PaymentMethodData's data member during construction</title>
<link
  rel="help"
  href="https://w3c.github.io/browser-payment-api/#constructor"
/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
  const details = {
    total: {
      label: "Total",
      amount: {
        currency: "USD",
        value: "0.00",
      },
    },
  };

  test(() => {
    new PaymentRequest([{ supportedMethods: "basic-card" }], details);
    new PaymentRequest(
      [{ supportedMethods: "https://apple.com/apple-pay" }],
      details
    );
  }, "Smoke test.");

  const knownPMIs = ["basic-card", "https://apple.com/apple-pay"];
  const unknownPMIs = ["fake-pmi", "https://does-not.exist"];

  promise_test(async t => {
    for (const supportedMethods of [].concat(knownPMIs).concat(unknownPMIs)) {
      const method = { supportedMethods };
      const request = new PaymentRequest([method], details);
      assert_throws(
        new TypeError(),
        () => {
          const badMethod = Object.assign(
            {},
            method,
            { data: 123 } // <- this will throw
          );
          new PaymentRequest([badMethod], details);
        },
        "PaymentMethodData.data can't be converted to an Object."
      );
    }
  }, "Tries to convert data member during Payment Request construction, irrespective of PMI.");

  promise_test(async t => {
    for (const supportedMethods of knownPMIs) {
      const method = { supportedMethods };
      const request = new PaymentRequest([method], details);

      // Only check the PMIs that are actually supported
      if (!(await request.canMakePayment())) continue;

      assert_throws(
        new TypeError(),
        () => {
          const badMethod = Object.assign(
            {},
            method,
            /* This is invalid in both Apple Pay and Basic Card */
            { data: { supportedNetworks: "this will throw" } }
          );
          new PaymentRequest([badMethod], details);
        },
        "PaymentMethodData.data is invalid."
      );
    }
  }, "Converts PaymentMethodData's data to mandated IDL type during PaymentRequest construction.");
</script>
