<!DOCTYPE html>
<title>Credential Management API: create() basics.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(function(t) {
    return promise_rejects_dom(t, "NotSupportedError",
            navigator.credentials.create());
}, "navigator.credentials.create() with no argument.");

promise_test(function(t) {
    return promise_rejects_dom(t, "NotSupportedError",
            navigator.credentials.create({}));
}, "navigator.credentials.create() with empty argument.");

promise_test(function(t) {
    var credential_data = {
        id: 'id',
        password: 'pencil',
    };

    return navigator.credentials.create({password: credential_data})
        .then(function(credential) {
            assert_equals(credential.id, 'id');
            assert_equals(credential.name, '');
            assert_equals(credential.iconURL, '');
            assert_equals(credential.type, 'password');
            assert_equals(credential.password, 'pencil');
        });
}, "navigator.credentials.create() with valid PasswordCredentialData");

promise_test(function(t) {
    var f = document.createElement('form');
    f.innerHTML = "<input type='text' name='theId' value='musterman' autocomplete='username'>"
        + "<input type='text' name='thePassword' value='sekrit' autocomplete='current-password'>"
        + "<input type='text' name='theIcon' value='https://example.com/photo' autocomplete='photo'>"
        + "<input type='text' name='theExtraField' value='extra'>"
        + "<input type='text' name='theName' value='friendly name' autocomplete='name'>";

    return navigator.credentials.create({password: f})
        .then(function(credential) {
            assert_equals(credential.id, 'musterman');
            assert_equals(credential.name, 'friendly name');
            assert_equals(credential.iconURL, 'https://example.com/photo');
            assert_equals(credential.type, 'password');
            assert_equals(credential.password, 'sekrit');
        });
}, "navigator.credentials.create() with valid HTMLFormElement");

promise_test(function(t) {
    return promise_rejects_js(t, TypeError,
            navigator.credentials.create({password: "bogus password data"}));
}, "navigator.credentials.create() with bogus password data");

promise_test(function(t) {
    var federated_data = {
        id: 'id',
        provider: 'https://example.com/',
    };

    return navigator.credentials.create({federated: federated_data})
        .then(function(credential) {
            assert_equals(credential.id, 'id');
            assert_equals(credential.name, '');
            assert_equals(credential.iconURL, '');
            assert_equals(credential.type, 'federated');
        });
}, "navigator.credentials.create() with valid FederatedCredentialData");

promise_test(function(t) {
    return promise_rejects_js(t, TypeError,
            navigator.credentials.create({federated: "bogus federated data"}));
}, "navigator.credentials.create() with bogus federated data");

promise_test(function(t) {
    return promise_rejects_js(t, TypeError,
            navigator.credentials.create({publicKey: "bogus publicKey data"}));
}, "navigator.credentials.create() with bogus publicKey data");

promise_test(function(t) {
    var credential_data = {
        id: 'id',
        password: 'pencil',
    };

    var federated_data = {
        id: 'id',
        provider: 'https://example.com/',
    };

    return promise_rejects_dom(t, "NotSupportedError",
            navigator.credentials.create({
                password: credential_data,
                federated: federated_data,
            }));
}, "navigator.credentials.create() with both PasswordCredentialData and FederatedCredentialData");

promise_test(function(t) {
    return promise_rejects_js(t, TypeError,
            navigator.credentials.create({
                password: "bogus password data",
                federated: "bogus federated data",
            }));
}, "navigator.credentials.create() with bogus password and federated data");

promise_test(function(t) {
    return promise_rejects_js(t, TypeError,
            navigator.credentials.create({
                federated: "bogus federated data",
                publicKey: "bogus publicKey data",
            }));
}, "navigator.credentials.create() with bogus federated and publicKey data");

promise_test(function(t) {
    return promise_rejects_js(t, TypeError,
            navigator.credentials.create({
                password: "bogus password data",
                publicKey: "bogus publicKey data",
            }));
}, "navigator.credentials.create() with bogus password and publicKey data");

promise_test(function(t) {
    return promise_rejects_js(t, TypeError,
            navigator.credentials.create({
                password: "bogus password data",
                federated: "bogus federated data",
                publicKey: "bogus publicKey data",
            }));
}, "navigator.credentials.create() with bogus password, federated, and publicKey data");

promise_test(function(t) {
    return promise_rejects_dom(t, "NotSupportedError",
            navigator.credentials.create({bogus_key: "bogus data"}));
}, "navigator.credentials.create() with bogus data");
</script>
