<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
<title>Test for registering a PublicKeyCredential with "payment" extension</title>
<link rel="help" href="https://w3c.github.io/secure-payment-confirmation/#client-extension-processing-registration">
<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=../webauthn/helpers.js></script>
<body></body>
<script>
class CreatePaymentCredentialsTest extends CreateCredentialsTest {
  constructor(authenticatorSelection) {
    super('options.publicKey.extensions', {
      payment: { isPayment: true },
    });
    this.testObject.options.publicKey.authenticatorSelection = {
      userVerification: 'required',
      residentKey: 'required',
      authenticatorAttachment: 'platform',
    };
    authenticatorSelection ||= {};
    // Override specific fields.
    extendObject(this.testObject.options.publicKey.authenticatorSelection, authenticatorSelection);
  }
}

standardSetup(function() {
  // good creates
  new CreatePaymentCredentialsTest().runTest('Payment credential is created successfully.');
  new CreatePaymentCredentialsTest({residentKey: 'preferred'})
      .runTest('Payment credential allows residentKey to be "preferred".');

  // bad creates
  new CreatePaymentCredentialsTest({userVerification: 'preferred'})
      .runTest('Payment credential requires userVerification to be "required", not "preferred".', "NotSupportedError");
  new CreatePaymentCredentialsTest({userVerification: 'discouraged'})
      .runTest('Payment credential requires userVerification to be "required", not "discouraged".', "NotSupportedError");
  new CreatePaymentCredentialsTest({residentKey: 'discouraged'})
      .runTest('Payment credential does not allow residentKey to be "discouraged".', "NotSupportedError");
  new CreatePaymentCredentialsTest({authenticatorAttachment: 'cross-platform'})
      .runTest('Payment credential requires authenticatorAttachment to be "platform", not "cross-platform".', "NotSupportedError");

  // abort creates
  let abortController = new AbortController();
  abortController.abort();
  new CreatePaymentCredentialsTest()
      .modify("options.signal", abortController.signal)
      .runTest("Payment credential abort without reason", "AbortError");

  abortController = new AbortController();
  abortController.abort(new Error('error'));
  new CreatePaymentCredentialsTest()
      .modify("options.signal", abortController.signal)
      .runTest("Payment credential abort reason with Error", Error);
}, {
  protocol: 'ctap2_1',
  transport: 'internal',
  hasResidentKey: true,
  hasUserVerification: true,
  isUserVerified: true,
});
</script>
