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