<!DOCTYPE html>
<meta charset="utf-8">
<title>Test for the 'secure-payment-confirmation' payment method authentication - accepted case</title>
<link rel="help" href="https://w3c.github.io/secure-payment-confirmation#sctn-authentication">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="utils.sub.js"></script>
<script>
'use strict';

promise_test(async t => {
  const authenticator = await window.test_driver.add_virtual_authenticator(
      AUTHENTICATOR_OPTS);
  t.add_cleanup(() => {
    return window.test_driver.remove_virtual_authenticator(authenticator);
  });

  await window.test_driver.set_spc_transaction_mode("autoaccept");
  t.add_cleanup(() => {
    return window.test_driver.set_spc_transaction_mode("none");
  });

  const credential = await createCredential();

  const challenge = 'server challenge';
  const payeeOrigin = 'https://merchant.com';
  const displayName = 'Troycard ***1234';
  const request = new PaymentRequest([{
    supportedMethods: 'secure-payment-confirmation',
    data: {
      credentialIds: [credential.rawId],
      challenge: Uint8Array.from(challenge, c => c.charCodeAt(0)),
      payeeOrigin,
      timeout: 60000,
      instrument: {
        displayName,
        icon: ICON_URL,
      },
    }
  }], PAYMENT_DETAILS);

  const responsePromise = request.show();

  const response = await responsePromise;
  await response.complete('success');

  const cred = response.details;
  assert_equals(cred.id, credential.id);

  const clientDataJSON = JSON.parse(arrayBufferToString(cred.response.clientDataJSON));
  assert_equals(clientDataJSON.type, 'payment.get');
  assert_equals(clientDataJSON.challenge, base64UrlEncode(challenge));
  assert_equals(clientDataJSON.origin, window.location.origin);
  assert_false(clientDataJSON.crossOrigin);

  // Payment-specific information.
  assert_equals(clientDataJSON.payment.rp, window.location.hostname);
  assert_equals(clientDataJSON.payment.topOrigin, window.location.origin);
  assert_equals(clientDataJSON.payment.payeeOrigin, payeeOrigin);
  assert_equals(clientDataJSON.payment.total.value, PAYMENT_DETAILS.total.amount.value);
  assert_equals(clientDataJSON.payment.total.currency, PAYMENT_DETAILS.total.amount.currency);
  assert_equals(clientDataJSON.payment.instrument.icon, ICON_URL);
  assert_equals(clientDataJSON.payment.instrument.displayName, displayName);

  // TODO: Verify cred.response.signature, to validate that it covers all fields
  // from clientDataJSON.
}, 'Successful SPC authentication');
</script>
