<!DOCTYPE html>
<meta charset="utf-8">
<title>WebAuthn navigator.credentials.get() extensions 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";

    var dummyExtension = {
        foo: true,
        bar: "yup"
    };
    var credPromise = createCredential();

    // bad extension values
    new GetCredentialsTest("options.publicKey.extensions", "hi mom")
        .addCredential(credPromise)
        .runTest("Bad extensions: extensions is string", new TypeError());
    new GetCredentialsTest("options.publicKey.extensions", null)
        .addCredential(credPromise)
        .runTest("Bad extensions: extensions is null", new TypeError());
    new GetCredentialsTest("options.publicKey.extensions", [])
        .addCredential(credPromise)
        .runTest("Bad extensions: extensions is empty Array", new TypeError());
    new GetCredentialsTest("options.publicKey.extensions", new ArrayBuffer(0))
        .addCredential(credPromise)
        .runTest("Bad extensions: extensions is empty ArrayBuffer", new TypeError());
    var badJson = '{"foo": true, "bar: "yup"}'; // missing quote after "bar"
    new GetCredentialsTest("options.publicKey.extensions", {foo: badJson})
        .addCredential(credPromise)
        .runTest("Bad extensions: malformatted JSON", new TypeError());
    new GetCredentialsTest("options.publicKey.extensions", {foo: dummyExtension})
        .addCredential(credPromise)
        .runTest("Bad extensions: JavaScript object", new TypeError());
    var badExtId = {};
    badExtId[createRandomString(65)] = dummyExtension;
    new GetCredentialsTest("options.publicKey.extensions", {badExtId: dummyExtension})
        .addCredential(credPromise)
        .runTest("Bad extensions: extension ID too long", new TypeError());

    // phony extensions
    // TODO: not sure if this should pass or fail
    // should be clarified as part of https://github.com/w3c/webauthn/pull/765
    var randomExtId = {};
    randomExtId[createRandomString(64)] = dummyExtension;
    new GetCredentialsTest("options.publicKey.extensions", {foo: JSON.stringify(randomExtId)})
        .addCredential(credPromise)
        .runTest("extensions is a nonsensical JSON string");

    // TODO
    // defined extensions:
    // * appid
    // * txAuthSimple
    // * txAuthGeneric
    // * authnSel
    // * exts
    // * uvi
    // * loc
    // * uvm
});

/* JSHINT */
/* globals standardSetup, GetCredentialsTest, createRandomString, createCredential */
</script>
