diff options
Diffstat (limited to 'toolkit/identity/tests/unit/test_relying_party.js')
-rw-r--r-- | toolkit/identity/tests/unit/test_relying_party.js | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/toolkit/identity/tests/unit/test_relying_party.js b/toolkit/identity/tests/unit/test_relying_party.js new file mode 100644 index 000000000..e78d22779 --- /dev/null +++ b/toolkit/identity/tests/unit/test_relying_party.js @@ -0,0 +1,255 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +XPCOMUtils.defineLazyModuleGetter(this, "RelyingParty", + "resource://gre/modules/identity/RelyingParty.jsm"); + +function resetState() { + get_idstore().reset(); + RelyingParty.reset(); +} + +function test_watch_loggedin_ready() { + do_test_pending(); + + resetState(); + + let id = TEST_USER; + setup_test_identity(id, TEST_CERT, function() { + let store = get_idstore(); + + // set it up so we're supposed to be logged in to TEST_URL + store.setLoginState(TEST_URL, true, id); + RelyingParty.watch(mock_doc(id, TEST_URL, function(action, params) { + do_check_eq(action, 'ready'); + do_check_eq(params, undefined); + + do_test_finished(); + run_next_test(); + })); + }); +} + +function test_watch_loggedin_login() { + do_test_pending(); + + resetState(); + + let id = TEST_USER; + setup_test_identity(id, TEST_CERT, function() { + let store = get_idstore(); + + // set it up so we're supposed to be logged in to TEST_URL + store.setLoginState(TEST_URL, true, id); + + // check for first a login() call, then a ready() call + RelyingParty.watch(mock_doc(null, TEST_URL, call_sequentially( + function(action, params) { + do_check_eq(action, 'login'); + do_check_neq(params, null); + }, + function(action, params) { + do_check_eq(action, 'ready'); + do_check_null(params); + + do_test_finished(); + run_next_test(); + } + ))); + }); +} + +function test_watch_loggedin_logout() { + do_test_pending(); + + resetState(); + + let id = TEST_USER; + let other_id = "otherid@foo.com"; + setup_test_identity(other_id, TEST_CERT, function() { + setup_test_identity(id, TEST_CERT, function() { + let store = get_idstore(); + + // set it up so we're supposed to be logged in to TEST_URL + // with id, not other_id + store.setLoginState(TEST_URL, true, id); + + // this should cause a login with an assertion for id, + // not for other_id + RelyingParty.watch(mock_doc(other_id, TEST_URL, call_sequentially( + function(action, params) { + do_check_eq(action, 'login'); + do_check_neq(params, null); + }, + function(action, params) { + do_check_eq(action, 'ready'); + do_check_null(params); + + do_test_finished(); + run_next_test(); + } + ))); + }); + }); +} + +function test_watch_notloggedin_ready() { + do_test_pending(); + + resetState(); + + RelyingParty.watch(mock_doc(null, TEST_URL, function(action, params) { + do_check_eq(action, 'ready'); + do_check_eq(params, undefined); + + do_test_finished(); + run_next_test(); + })); +} + +function test_watch_notloggedin_logout() { + do_test_pending(); + + resetState(); + + RelyingParty.watch(mock_doc(TEST_USER, TEST_URL, call_sequentially( + function(action, params) { + do_check_eq(action, 'logout'); + do_check_eq(params, undefined); + + let store = get_idstore(); + do_check_null(store.getLoginState(TEST_URL)); + }, + function(action, params) { + do_check_eq(action, 'ready'); + do_check_eq(params, undefined); + do_test_finished(); + run_next_test(); + } + ))); +} + +function test_request() { + do_test_pending(); + + // set up a watch, to be consistent + let mockedDoc = mock_doc(null, TEST_URL, function(action, params) { + // this isn't going to be called for now + // XXX but it is called - is that bad? + }); + + RelyingParty.watch(mockedDoc); + + // be ready for the UX identity-request notification + makeObserver("identity-request", function (aSubject, aTopic, aData) { + do_check_neq(aSubject, null); + + do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id); + + do_test_finished(); + run_next_test(); + }); + + RelyingParty.request(mockedDoc.id, {}); +} + +/* + * ensure the forceAuthentication param can be passed through + */ +function test_request_forceAuthentication() { + do_test_pending(); + + let mockedDoc = mock_doc(null, TEST_URL, function(action, params) {}); + + RelyingParty.watch(mockedDoc); + + makeObserver("identity-request", function(aSubject, aTopic, aData) { + do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id); + do_check_eq(aSubject.wrappedJSObject.forceAuthentication, true); + do_test_finished(); + run_next_test(); + }); + + RelyingParty.request(mockedDoc.id, {forceAuthentication: true}); +} + +/* + * ensure the issuer can be forced + */ +function test_request_forceIssuer() { + do_test_pending(); + + let mockedDoc = mock_doc(null, TEST_URL, function(action, params) {}); + + RelyingParty.watch(mockedDoc); + + makeObserver("identity-request", function(aSubject, aTopic, aData) { + do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id); + do_check_eq(aSubject.wrappedJSObject.issuer, "https://ozten.co.uk"); + do_test_finished(); + run_next_test(); + }); + + RelyingParty.request(mockedDoc.id, {issuer: "https://ozten.co.uk"}); +} +function test_logout() { + do_test_pending(); + + resetState(); + + let id = TEST_USER; + setup_test_identity(id, TEST_CERT, function() { + let store = get_idstore(); + + // set it up so we're supposed to be logged in to TEST_URL + store.setLoginState(TEST_URL, true, id); + + let doLogout; + let mockedDoc = mock_doc(id, TEST_URL, call_sequentially( + function(action, params) { + do_check_eq(action, 'ready'); + do_check_eq(params, undefined); + + do_timeout(100, doLogout); + }, + function(action, params) { + do_check_eq(action, 'logout'); + do_check_eq(params, undefined); + }, + function(action, params) { + do_check_eq(action, 'ready'); + do_check_eq(params, undefined); + + do_test_finished(); + run_next_test(); + })); + + doLogout = function() { + RelyingParty.logout(mockedDoc.id); + do_check_false(store.getLoginState(TEST_URL).isLoggedIn); + do_check_eq(store.getLoginState(TEST_URL).email, TEST_USER); + }; + + RelyingParty.watch(mockedDoc); + }); +} + +var TESTS = [ + test_watch_loggedin_ready, + test_watch_loggedin_login, + test_watch_loggedin_logout, + test_watch_notloggedin_ready, + test_watch_notloggedin_logout, + test_request, + test_request_forceAuthentication, + test_request_forceIssuer, + test_logout, +]; + +TESTS.forEach(add_test); + +function run_test() { + run_next_test(); +} |