| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <meta name="timeout" content="long"> |
| <title>Tests for the 'secure-payment-confirmation' steps to validate payment method data</title> |
| <link rel="help" href="https://w3c.github.io/secure-payment-confirmation/#sctn-steps-to-validate-payment-method-data"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| 'use strict'; |
| |
| const details = {total: |
| {label: 'Total', amount: {value: '0.01', currency: 'USD'}}}; |
| |
| // This file contains tests for the 'steps to validate payment method data', |
| // which occurs during construction of the PaymentRequest. For general tests |
| // around construction, see constructor.https.html. |
| |
| test(() => { |
| assert_throws_js(RangeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| relyingPartyId: 'relying-party.example', |
| // Empty credentialIds field. |
| credentialIds: [], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Empty credentialIds field throws exception.'); |
| |
| test(() => { |
| assert_throws_js(RangeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| relyingPartyId: 'relying-party.example', |
| credentialIds: [ |
| Uint8Array.from('c1', c => c.charCodeAt(0)), |
| new Uint8Array(), // Empty |
| Uint8Array.from('c2', c => c.charCodeAt(0)), |
| ], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Empty ID within credentialIds field throws exception.'); |
| |
| test(() => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [ |
| Uint8Array.from('c1', c => c.charCodeAt(0)), |
| Uint8Array.from('c2', c => c.charCodeAt(0)) |
| ], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| // Omitted payee origin, instead with payee name. |
| payeeName: 'Example Merchant', |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }, 'Multiple IDs in credentialIds is valid.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| // Large credentialIds value. |
| credentialIds: [Uint8Array.from( |
| 'x'.repeat(1024 * 1024), c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Large credentialIds value throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| // Null challenge fields. |
| challenge: null, |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Null challenge field throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| // Empty challenge fields. |
| challenge: [], |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Empty challenge field throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| // Large challenge value. |
| challenge: Uint8Array.from('x'.repeat(1024 * 1024), c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Large challenge value throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: '', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Empty instrument.displayName field throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: '', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Empty instrument.icon field throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'thisisnotaurl', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Invalid instrument.icon URL throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'domains cannot have spaces.com', |
| }, |
| }], details); |
| }); |
| }, 'Invalid rpId field throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| // Omitted payee origin and payee name. |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Omitting both payee origin and payee name throws exception.'); |
| |
| test(() => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| // Omitted payee origin, instead with payee name. |
| payeeName: 'Example Merchant', |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }, 'Payee name without payee origin is valid.'); |
| |
| test(() => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| // Both payee origin and payee name. |
| payeeName: 'Example Merchant', |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }, 'Providing both payee name and payee origin is valid.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| // Empty payee name |
| payeeName: '', |
| payeeOrigin: window.location.origin, |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Empty payee name throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeName: 'Example Merchant', |
| // Empty payee origin |
| payeeOrigin: '', |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Empty payee origin throws exception.'); |
| |
| test(() => { |
| assert_throws_js(TypeError, () => { |
| new PaymentRequest([{ |
| supportedMethods: 'secure-payment-confirmation', |
| data: { |
| credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], |
| challenge: Uint8Array.from('x', c => c.charCodeAt(0)), |
| payeeName: 'Example Merchant', |
| payeeOrigin: 'http://thepayee.com', |
| timeout: 60000, |
| instrument: { |
| displayName: 'X', |
| icon: 'https://example.test/icon.png', |
| }, |
| rpId: 'relying-party.example', |
| }, |
| }], details); |
| }); |
| }, 'Non-HTTPS payee origin throws exception.'); |
| </script> |