<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
<title>Test for the 'secure-payment-confirmation' payment method constructor</title>
<link rel="help" href="https://w3c.github.io/secure-payment-confirmation/#sctn-payment-method-spc">
<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 general tests for constructing a Secure Payment
// Confirmation payment request, that are not parts of the 'steps to validate
// payment method data'. For those, see constructor-validate-payment-method-data.https.html

test(() => {
  new PaymentRequest([{
    supportedMethods: 'secure-payment-confirmation',
    data: {
      // All valid parameters.
      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: 'relying-party.example',
    },
  }], details);
}, 'Valid payment method data does not throw exceptions.');

test(() => {
  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,
      // Omitted timeout field.
      instrument: {
        displayName: 'X',
        icon: 'https://example.test/icon.png',
      },
      rpId: 'relying-party.example',
    },
  }], details);
}, 'The timeout field is optional.');

test(() => {
  assert_throws_js(RangeError, () => {
    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: 'relying-party.example',
      },
    }, {supportedMethods: 'https://example.com/pay'}], details);
  });
}, 'Extra payment method not allowed afterward.');

test(() => {
  assert_throws_js(RangeError, () => {
    new PaymentRequest([{supportedMethods: 'https://example.com/pay'}, {
      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: 'relying-party.example',
      },
    }], details);
  });
}, 'Extra payment method not allowed beforehand.');

test(() => {
  assert_throws_js(TypeError, () => {
    new PaymentRequest([{
      supportedMethods: 'secure-payment-confirmation',
      data: {
        // Omitted credentialIds field.
        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);
  });
}, 'The credentialIds field is required.');

test(() => {
  assert_throws_js(TypeError, () => {
    new PaymentRequest([{
      supportedMethods: 'secure-payment-confirmation',
      data: {
        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],
        // Omitted challenge field.
        payeeOrigin: window.location.origin,
        timeout: 60000,
        instrument: {
          displayName: 'X',
          icon: 'https://example.test/icon.png',
        },
        rpId: 'relying-party.example',
      },
    }], details);
  });
}, 'The challenge field is required.');

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,
        rpId: 'relying-party.example',
        // Omitted instrument field.
      },
    }], details);
  });
}, 'Instrument field is required.');

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: {
          // Ommitted instrument display name.
          icon: 'https://example.test/icon.png',
        },
        rpId: 'relying-party.example',
      },
    }], details);
  });
}, 'Instrument display name is required.');

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',
          // Ommitted instrument icon.
        },
        rpId: 'relying-party.example',
      },
    }], details);
  });
}, 'Instrument icon is required.');

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',
        },
        // Omitted rpId.
      },
    }], details);
  });
}, 'rpId is required.');
</script>
