| <!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", |
| }); |
| 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(new 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 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( |
| new 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> |