<!DOCTYPE html>
<title>Web Authentication API: PublicKeyCredential's [[create]] failure cases.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/util.js"></script>
<script>
    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
                timeout: 0,
            }
        };
        internals.mockCredentialsMessenger.setDidTimeOut();

        return promise_rejects(t, "NotAllowedError",
            navigator.credentials.create(options));
    }, "PublicKeyCredential's [[create]] with timeout");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "example.com",
                    id: "example.com"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };
        return promise_rejects(t, "SecurityError",
            navigator.credentials.create(options));
    }, "PublicKeyCredential's [[create]] with a mismatched RP ID");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "localhost",
                    id: "localhost"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "Appleseed",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [ ],
            }
        };
        return promise_rejects(t, "NotSupportedError",
            navigator.credentials.create(options));
    }, "PublicKeyCredential's [[create]] with an empty pubKeyCredParams");

    promise_test(function(t) {
        const options = {
            publicKey: {
                rp: {
                    name: "localhost",
                    id: "localhost"
                },
                user: {
                    name: "John Appleseed",
                    id: asciiToUint8Array("123456"),
                    displayName: "John",
                },
                challenge: asciiToUint8Array("123456"),
                pubKeyCredParams: [{ type: "public-key", alg: -7 }],
            }
        };
        internals.mockCredentialsMessenger.setDidUserCancel();

        return promise_rejects(t, "NotAllowedError",
            navigator.credentials.create(options));
    }, "PublicKeyCredential's [[create]] with user cancellations");
</script>
