<!DOCTYPE html>
<meta charset="utf-8">
<title>WebAuthn navigator.credentials.create() excludeCredentials Tests</title>
<meta name="timeout" content="long">
<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src=helpers.js></script>
<body></body>
<script>
standardSetup(function() {
    "use strict";

    // bad excludeCredentials values
    new CreateCredentialsTest("options.publicKey.excludeCredentials", "hi mom").runTest("Bad excludeCredentials: string", new TypeError());
    new CreateCredentialsTest("options.publicKey.excludeCredentials", {}).runTest("Bad excludeCredentials: empty object", new TypeError());
    // TODO: bad excludeCredentials with [{.type}] or [{.id}] or [{.transports}] wrong

    // good excludeCredentials values
    new CreateCredentialsTest({path: "options.publicKey.excludeCredentials", value: undefined}).runTest("excludeCredentials missing");
    new CreateCredentialsTest("options.publicKey.excludeCredentials", []).runTest("excludeCredentials empty array");

    // proper excludeCredentials behavior
    // should error on excluding existing credential
    promise_test((t) => {
        var cred1;
        return Promise.resolve()
            .then(() => {
                return createCredential();
            })
            .then((cred) => {
                cred1 = cred;
                var excludeCred = {
                    id: cred.rawId,
                    type: "public-key"
                };
                var args = {
                    options: {
                        publicKey: {
                            excludeCredentials: [excludeCred]
                        }
                    }
                };
                var p = createCredential(args);
                return promise_rejects (t, "NotAllowedError", p, "expected to fail on excluded credenetial");
            });
    }, "exclude existing credential");

    // should not error on excluding random credential
    promise_test(() => {
        return Promise.resolve()
            .then(() => {
                return createCredential();
            })
            .then(() => {
                var randomCredId = new Uint8Array(162);
                window.crypto.getRandomValues(randomCredId);

                var excludeCred = {
                    id: randomCredId,
                    type: "public-key"
                };
                var args = {
                    options: {
                        publicKey: {
                            excludeCredentials: [excludeCred]
                        }
                    }
                };
                return createCredential(args);
            });
    }, "exclude random (non-existing) credential");

    // TODO: exclude including transport type (USB, BLE, NFC)
});

/* JSHINT */
/* globals standardSetup, CreateCredentialsTest, createCredential, promise_test, promise_rejects */
</script>