<!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="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.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", TypeError);
    new CreateCredentialsTest("options.publicKey.excludeCredentials", {}).runTest("Bad excludeCredentials: empty object", 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_dom(t, "InvalidStateError", p, "expected to fail on excluded credential");
            });
    }, "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_dom */
</script>
