gecko-dev/toolkit/identity/tests/unit/test_authentication.js

160 строки
4.7 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
XPCOMUtils.defineLazyModuleGetter(this, "IDService",
"resource://gre/modules/identity/Identity.jsm",
"IdentityService");
XPCOMUtils.defineLazyModuleGetter(this, "jwcrypto",
"resource://gre/modules/identity/jwcrypto.jsm");
function test_begin_authentication_flow() {
do_test_pending();
let _provId = null;
// set up a watch, to be consistent
let mockedDoc = mock_doc(null, TEST_URL, function(action, params) {});
IDService.RP.watch(mockedDoc);
// The identity-auth notification is sent up to the UX from the
// _doAuthentication function. Be ready to receive it and call
// beginAuthentication
makeObserver("identity-auth", function (aSubject, aTopic, aData) {
do_check_neq(aSubject, null);
do_check_eq(aSubject.wrappedJSObject.provId, _provId);
do_test_finished();
run_next_test();
});
setup_provisioning(
TEST_USER,
function(caller) {
_provId = caller.id;
IDService.IDP.beginProvisioning(caller);
}, function() {},
{
beginProvisioningCallback: function(email, duration_s) {
// let's say this user needs to authenticate
IDService.IDP._doAuthentication(_provId, {idpParams:TEST_IDPPARAMS});
}
}
);
}
function test_complete_authentication_flow() {
do_test_pending();
let _provId = null;
let _authId = null;
let id = TEST_USER;
let callbacksFired = false;
let loginStateChanged = false;
let identityAuthComplete = false;
// The result of authentication should be a successful login
IDService.reset();
setup_test_identity(id, TEST_CERT, function() {
// set it up so we're supposed to be logged in to TEST_URL
get_idstore().setLoginState(TEST_URL, true, id);
// When we authenticate, our ready callback will be fired.
// At the same time, a separate topic will be sent up to the
// the observer in the UI. The test is complete when both
// events have occurred.
let mockedDoc = mock_doc(id, TEST_URL, call_sequentially(
function(action, params) {
do_check_eq(action, 'ready');
do_check_eq(params, undefined);
// if notification already received by observer, test is done
callbacksFired = true;
if (loginStateChanged && identityAuthComplete) {
do_test_finished();
run_next_test();
}
}
));
makeObserver("identity-auth-complete", function(aSubject, aTopic, aData) {
identityAuthComplete = true;
do_test_finished();
run_next_test();
});
makeObserver("identity-login-state-changed", function (aSubject, aTopic, aData) {
do_check_neq(aSubject, null);
do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id);
do_check_eq(aData, id);
// if callbacks in caller doc already fired, test is done.
loginStateChanged = true;
if (callbacksFired && identityAuthComplete) {
do_test_finished();
run_next_test();
}
});
IDService.RP.watch(mockedDoc);
// Create a provisioning flow for our auth flow to attach to
setup_provisioning(
TEST_USER,
function(provFlow) {
_provId = provFlow.id;
IDService.IDP.beginProvisioning(provFlow);
}, function() {},
{
beginProvisioningCallback: function(email, duration_s) {
// let's say this user needs to authenticate
IDService.IDP._doAuthentication(_provId, {idpParams:TEST_IDPPARAMS});
// test_begin_authentication_flow verifies that the right
// message is sent to the UI. So that works. Moving on,
// the UI calls setAuthenticationFlow ...
_authId = uuid();
IDService.IDP.setAuthenticationFlow(_authId, _provId);
// ... then the UI calls beginAuthentication ...
authCaller.id = _authId;
IDService.IDP._provisionFlows[_provId].caller = authCaller;
IDService.IDP.beginAuthentication(authCaller);
}
}
);
});
// A mock calling context
let authCaller = {
doBeginAuthenticationCallback: function doBeginAuthenticationCallback(identity) {
do_check_eq(identity, TEST_USER);
// completeAuthentication will emit "identity-auth-complete"
IDService.IDP.completeAuthentication(_authId);
},
doError: function(err) {
log("OW! My doError callback hurts!", err);
},
};
}
let TESTS = [];
TESTS.push(test_begin_authentication_flow);
TESTS.push(test_complete_authentication_flow);
TESTS.forEach(add_test);
function run_test() {
run_next_test();
}