summaryrefslogtreecommitdiff
path: root/service/test/unit/config/test_sessions.py
diff options
context:
space:
mode:
Diffstat (limited to 'service/test/unit/config/test_sessions.py')
-rw-r--r--service/test/unit/config/test_sessions.py160
1 files changed, 160 insertions, 0 deletions
diff --git a/service/test/unit/config/test_sessions.py b/service/test/unit/config/test_sessions.py
new file mode 100644
index 00000000..be418a73
--- /dev/null
+++ b/service/test/unit/config/test_sessions.py
@@ -0,0 +1,160 @@
+#
+# Copyright (c) 2014 ThoughtWorks, Inc.
+#
+# Pixelated is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pixelated is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
+
+from mock import patch
+from mock import MagicMock
+from twisted.internet import defer
+from pixelated.config.sessions import LeapSession, SessionCache
+
+from test.unit.bitmask_libraries.test_abstract_leap import AbstractLeapTest
+from leap.common.events.catalog import KEYMANAGER_FINISHED_KEY_GENERATION
+
+
+class SessionTest(AbstractLeapTest):
+
+ def setUp(self):
+ super(SessionTest, self).setUp()
+ self.smtp_mock = MagicMock()
+
+ @patch('pixelated.config.sessions.register')
+ @patch('pixelated.config.sessions.Account')
+ @defer.inlineCallbacks
+ def test_background_jobs_are_started_during_initial_sync(self, *unused):
+ mailFetcherMock = MagicMock()
+ with patch('pixelated.config.sessions.reactor.callFromThread', new=_execute_func) as _:
+ with patch.object(LeapSession, '_create_incoming_mail_fetcher', return_value=mailFetcherMock) as _:
+ session = self._create_session()
+ yield session.first_required_sync()
+ mailFetcherMock.startService.assert_called_once()
+
+ @patch('pixelated.config.sessions.register')
+ @patch('pixelated.config.sessions.unregister')
+ @patch('pixelated.config.sessions.Account')
+ @defer.inlineCallbacks
+ def test_that_close_stops_background_jobs(self, *unused):
+ with patch('pixelated.config.sessions.reactor.callFromThread', new=_execute_func) as _:
+ with patch('pixelated.config.sessions.LeapSession._create_incoming_mail_fetcher') as mail_fetcher_mock:
+ session = self._create_session()
+ yield session.first_required_sync()
+ session.close()
+ mail_fetcher_mock.stopService.assert_called_once()
+
+ def test_that_sync_defers_to_soledad(self):
+ with patch('pixelated.config.sessions.reactor.callFromThread', new=_execute_func) as _:
+ with patch('pixelated.config.sessions.LeapSession._create_incoming_mail_fetcher') as mail_fetcher_mock:
+ session = self._create_session()
+ yield session.sync()
+ self.soledad_session.sync.assert_called_once()
+
+ def test_session_registers_to_generated_keys(self):
+ email = 'someone@somedomain.tld'
+ self.provider.address_for.return_value = email
+ with patch('pixelated.config.sessions.register') as register_mock:
+ session = self._create_session()
+
+ register_mock.assert_called_once_with(KEYMANAGER_FINISHED_KEY_GENERATION, session._set_fresh_account, uid=email)
+
+ @patch('pixelated.config.sessions.register')
+ def test_close_unregisters_from_generate_keys_events(self, _):
+ email = 'someone@somedomain.tld'
+ self.provider.address_for.return_value = email
+ session = self._create_session()
+
+ with patch('pixelated.config.sessions.unregister') as unregister_mock:
+ session.close()
+
+ unregister_mock.assert_called_once_with(KEYMANAGER_FINISHED_KEY_GENERATION, uid=email)
+
+ @patch('pixelated.config.sessions.register')
+ def test_close_stops_soledad(self, _):
+ email = 'someone@somedomain.tld'
+ self.provider.address_for.return_value = email
+ session = self._create_session()
+
+ with patch('pixelated.config.sessions.unregister') as unregister_mock:
+ session.close()
+
+ self.soledad_session.close.assert_called_once_with()
+
+ @patch('pixelated.config.sessions.register')
+ def test_close_removes_session_from_cache(self, _):
+ email = 'someone@somedomain.tld'
+ self.provider.address_for.return_value = email
+ session = self._create_session()
+
+ key = SessionCache.session_key(self.provider, self.auth.username)
+ SessionCache.remember_session(key, session)
+
+ self.assertEqual(session, SessionCache.lookup_session(key))
+
+ with patch('pixelated.config.sessions.unregister') as unregister_mock:
+ session.close()
+
+ self.assertIsNone(SessionCache.lookup_session(key))
+
+ @patch('pixelated.config.sessions.register')
+ def test_close_ends_account_session(self, _):
+ account_mock = MagicMock()
+ email = 'someone@somedomain.tld'
+ self.provider.address_for.return_value = email
+ session = self._create_session()
+ session.account = account_mock
+
+ with patch('pixelated.config.sessions.unregister') as unregister_mock:
+ session.close()
+
+ account_mock.end_session.assert_called_once_with()
+
+ @patch('pixelated.config.sessions.register')
+ def test_session_fresh_is_initially_false(self, _):
+ session = self._create_session()
+
+ self.assertFalse(session.fresh_account)
+
+ @patch('pixelated.config.sessions.register')
+ def test_session_sets_status_to_fresh_on_key_generation_event(self, _):
+ session = self._create_session()
+ self.provider.address_for.return_value = 'someone@somedomain.tld'
+
+ session._set_fresh_account(None, 'someone@somedomain.tld')
+
+ self.assertTrue(session.fresh_account)
+
+ @patch('pixelated.config.sessions.register')
+ def test_closed_session_not_reused(self, _):
+ session = self._create_session()
+ SessionCache.remember_session('somekey', session)
+ session._is_closed = True
+
+ result = SessionCache.lookup_session('somekey')
+
+ self.assertIsNone(result)
+
+ @patch('pixelated.config.sessions.register')
+ def test_session_does_not_set_status_fresh_for_unkown_emails(self, _):
+ session = self._create_session()
+ self.provider.address_for.return_value = 'someone@somedomain.tld'
+
+ session._set_fresh_account(None, 'another_email@somedomain.tld')
+
+ self.assertFalse(session.fresh_account)
+
+ def _create_session(self):
+ return LeapSession(self.provider, self.auth, self.mail_store, self.soledad_session, self.keymanager, self.smtp_mock)
+
+
+def _execute_func(func):
+ func()