summaryrefslogtreecommitdiffstats
path: root/toolkit/identity/tests/unit/test_relying_party.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/identity/tests/unit/test_relying_party.js')
-rw-r--r--toolkit/identity/tests/unit/test_relying_party.js255
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();
+}