<!DOCTYPE html>
<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<meta charset="utf-8">
<title>Test for MerchantValidationEvent Constructor</title>
<link rel="help" href="https://w3c.github.io/browser-payment-api/#merchantvalidationevent-constructor">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
const applePay = Object.freeze({
  supportedMethods: "https://apple.com/apple-pay",
  data: {
    version: 3,
    merchantIdentifier: "merchant.com.example",
    countryCode: "US",
    merchantCapabilities: ["supports3DS"],
    supportedNetworks: ["visa"],
  }
});
const basicCard = Object.freeze({ supportedMethods: "basic-card" });
const defaultMethods = Object.freeze([basicCard, applePay]);
const defaultDetails = Object.freeze({
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "1.00",
    },
  },
});

test(() => {
  new MerchantValidationEvent("test");
}, "MerchantValidationEvent can be constructed in secure-context.");

test(() => {
  const ev = new MerchantValidationEvent("test", {
    bubbles: true,
    cancelable: true,
    composed: true,
  });
  assert_false(ev.isTrusted, "constructed in script, so not trusted");
  assert_true(ev.bubbles, "set by EventInitDict");
  assert_true(ev.cancelable, "set by EventInitDict");
  assert_true(ev.composed, "set by EventInitDict");
  assert_equals(ev.target, null, "initially null");
  assert_equals(ev.type, "test");
}, "MerchantValidationEvent can be constructed with an EventInitDict, even if not trusted.");

test(() => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const ev = new MerchantValidationEvent("test");
  request.addEventListener("test", evt => {
    assert_equals(ev, evt);
  });
  request.dispatchEvent(ev);
}, "MerchantValidationEvent can be dispatched, even if not trusted.");

test(() => {
  const validationURL = "https://pass.com";
  const event = new MerchantValidationEvent("test", { validationURL });
  assert_idl_attribute(event, "validationURL");
  assert_equals(event.validationURL, "https://pass.com/");
}, "Must have a validationURL IDL attribute, which is initialized with to the validationURL dictionary value.");

test(() => {
  const validationURL = "http://\u005B"; // invalid URL
  assert_throws_js(TypeError, () => {
    new MerchantValidationEvent("test", { validationURL });
  });
}, "Must throw TypeError if initialized with an invalid URL.");

test(() => {
  const validationURL = "";
  const relativePaths = ["", ".", "/test"];
  for (const path of relativePaths) {
    const event = new MerchantValidationEvent("test", { validationURL: path });
    const expected = new URL(path, document.location.href).href;
    assert_equals(event.validationURL, expected);
  }
}, "Relative validationURLs use the document as the base.");

test(() => {
  const validationURL = "pass";
  const base = document.createElement("base");
  base.href = "https://pass.com";
  document.head.append(base);
  const event = new MerchantValidationEvent("test", { validationURL });
  try {
    assert_idl_attribute(event, "validationURL");
    assert_equals(event.validationURL, "https://pass.com/pass");
  } finally {
    base.remove();
  }
}, "Relative validationURLs use the document.baseURI as the base.");

test(() => {
  const methodName = "https://pass.com";
  const event = new MerchantValidationEvent("test", { methodName });
  assert_idl_attribute(event, "methodName");
  assert_equals(event.methodName, "https://pass.com");
}, "Must have a methodName IDL attribute, which is initialized with to the methodName dictionary value.");

test(() => {
  const event = new MerchantValidationEvent("test", {});
  assert_equals(event.methodName, "");
}, "When no methodName is passed, methodName attribute defaults to the empty string");

test(() => {
  const validPMIs = [
    "https://example.com/pay",
    "https://example.com/pay?version=1",
    "https://example.com/pay/version/1",
    "basic-card",
    "https://apple.com/apple-pay",
    // special case for as default value
    "",
  ];
  for (const methodName of validPMIs) {
    const event = new MerchantValidationEvent("test", { methodName });
    assert_equals(event.methodName, methodName);
  }
}, "MerchantValidationEvent can be constructed with valid PMIs");

test(() => {
  const invalidPMIs = [
    // ❌ Contains Unicode character outside the valid ranges.
    "basic-💳",
    // ❌ Contains uppercase characters.
    "Basic-Card",
    // ❌ Contains Unicode characters outside the valid ranges.
    "¡basic-*-card!",
    // ❌ Uses http://, a username, and a password.
    "http://username:password@example.com/pay",
    // ❌ Uses unknown URI scheme.
    "unknown://example.com/pay",
  ];
  for (const methodName of invalidPMIs) {
    assert_throws_js(
      RangeError,
      () => {
        const event = new MerchantValidationEvent("test", { methodName });
      },
      `expected to throw when constructed with invalid PMI: '${methodName}'`
    );
  }
}, "MerchantValidationEvent can't be constructed with invalid PMIs");
</script>
