summaryrefslogtreecommitdiff
path: root/service/test
diff options
context:
space:
mode:
Diffstat (limited to 'service/test')
-rw-r--r--service/test/unit/adapter/services/test_mail_sender.py40
-rw-r--r--service/test/unit/bitmask_libraries/test_smtp.py58
-rw-r--r--service/test/unit/bitmask_libraries/test_smtp_cert_downloader.py78
3 files changed, 122 insertions, 54 deletions
diff --git a/service/test/unit/adapter/services/test_mail_sender.py b/service/test/unit/adapter/services/test_mail_sender.py
index 421a5f6d..d8c33f17 100644
--- a/service/test/unit/adapter/services/test_mail_sender.py
+++ b/service/test/unit/adapter/services/test_mail_sender.py
@@ -13,17 +13,45 @@
#
# 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 leap.mail.outgoing.service import OutgoingMail
from twisted.trial import unittest
from mockito import mock, when, verify, any, unstub
-from pixelated.adapter.services.mail_sender import MailSender, SMTPDownException
+from pixelated.adapter.services.mail_sender import LocalSmtpMailSender, SMTPDownException, MailSender
from pixelated.adapter.model.mail import InputMail
+from pixelated.bitmask_libraries.smtp import LeapSMTPConfig
+from pixelated.support.functional import flatten
from test.support.test_helper import mail_dict
-from twisted.internet import reactor
+from twisted.internet import reactor, defer
from twisted.internet.defer import Deferred
class MailSenderTest(unittest.TestCase):
+
+ def setUp(self):
+ self._cert_path = u'/some/cert/path'
+ self._keymanager_mock = mock()
+ self._remote_smtp_host = 'some.host.test'
+ self._remote_smtp_port = 1234
+ self._smtp_config = LeapSMTPConfig('someone@somedomain.tld', self._cert_path, self._remote_smtp_host, self._remote_smtp_port)
+
+ def tearDown(self):
+ unstub()
+
+ @defer.inlineCallbacks
+ def test_iterates_over_recipients(self):
+ sender = MailSender(self._smtp_config, self._keymanager_mock)
+ input_mail = InputMail.from_dict(mail_dict())
+
+ when(OutgoingMail).send_message(any(), any()).thenAnswer(lambda: defer.succeed(None))
+
+ yield sender.sendmail(input_mail)
+
+ for recipient in flatten([input_mail.to, input_mail.cc, input_mail.bcc]):
+ verify(OutgoingMail).send_message(any(), recipient)
+
+
+class LocalSmtpMailSenderTest(unittest.TestCase):
def setUp(self):
self.smtp = mock()
self.smtp.local_smtp_port_number = 4650
@@ -32,7 +60,7 @@ class MailSenderTest(unittest.TestCase):
def test_sendmail(self):
when(reactor).connectTCP('localhost', 4650, any()).thenReturn(None)
input_mail = InputMail.from_dict(mail_dict())
- mail_sender = MailSender('someone@somedomain.tld', self.smtp)
+ mail_sender = LocalSmtpMailSender('someone@somedomain.tld', self.smtp)
return self._succeed(mail_sender.sendmail(input_mail))
@@ -44,7 +72,7 @@ class MailSenderTest(unittest.TestCase):
input_mail = InputMail.from_dict(mail_dict())
- mail_sender = MailSender('someone@somedomain.tld', self.smtp)
+ mail_sender = LocalSmtpMailSender('someone@somedomain.tld', self.smtp)
sent_deferred = mail_sender.sendmail(input_mail)
@@ -55,7 +83,7 @@ class MailSenderTest(unittest.TestCase):
def test_senmail_returns_deffered(self):
when(reactor).connectTCP('localhost', 4650, any()).thenReturn(None)
input_mail = InputMail.from_dict(mail_dict())
- mail_sender = MailSender('someone@somedomain.tld', self.smtp)
+ mail_sender = LocalSmtpMailSender('someone@somedomain.tld', self.smtp)
deferred = mail_sender.sendmail(input_mail)
@@ -66,7 +94,7 @@ class MailSenderTest(unittest.TestCase):
def test_doesnt_send_mail_if_smtp_is_not_running(self):
self.smtp.ensure_running = lambda: False
- mail_sender = MailSender('someone@somedomain.tld', self.smtp)
+ mail_sender = LocalSmtpMailSender('someone@somedomain.tld', self.smtp)
deferred = mail_sender.sendmail({})
diff --git a/service/test/unit/bitmask_libraries/test_smtp.py b/service/test/unit/bitmask_libraries/test_smtp.py
index 9481c488..22b69b9e 100644
--- a/service/test/unit/bitmask_libraries/test_smtp.py
+++ b/service/test/unit/bitmask_libraries/test_smtp.py
@@ -13,29 +13,10 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
-import sys
-
import os
from mock import MagicMock, patch
from test_abstract_leap import AbstractLeapTest
-from pixelated.bitmask_libraries.smtp import LeapSmtp
-from httmock import all_requests, HTTMock, urlmatch
-
-
-@all_requests
-def not_found_mock(url, request):
- sys.stderr.write('url=%s\n' % url.netloc)
- sys.stderr.write('path=%s\n' % url.path)
- return {'status_code': 404,
- 'content': 'foobar'}
-
-
-@urlmatch(netloc='api.some-server.test:4430', path='/1/cert')
-def ca_cert_mock(url, request):
- return {
- "status_code": 200,
- "content": "some content"
- }
+from pixelated.bitmask_libraries.smtp import LeapSmtp, LeapSMTPConfig
class LeapSmtpTest(AbstractLeapTest):
@@ -43,58 +24,39 @@ class LeapSmtpTest(AbstractLeapTest):
def setUp(self):
super(LeapSmtpTest, self).setUp()
- self.provider.fetch_smtp_json.return_value = {
- 'hosts': {
- 'leap-mx': {
- 'hostname': 'smtp.some-sever.test',
- 'port': '1234'
- }
- }
- }
self.config.timeout_in_s = 15
-
- def test_that_client_cert_gets_downloaded(self):
- smtp = LeapSmtp(self.provider, self.auth, self.keymanager)
-
- with HTTMock(ca_cert_mock, not_found_mock):
- smtp._download_client_certificates()
-
- path = self._client_cert_path()
- self.assertTrue(os.path.isfile(path))
+ self._smtp_config = LeapSMTPConfig('test_user@some-server.test', self._client_cert_path(), 'smtp.some-server.test', 1234)
def _client_cert_path(self):
return os.path.join(self.leap_home, 'providers', 'some-server.test', 'keys', 'client', 'smtp.pem')
@patch('pixelated.bitmask_libraries.smtp.setup_smtp_gateway')
def test_that_start_calls_setup_smtp_gateway(self, gateway_mock):
- smtp = LeapSmtp(self.provider, self.auth, self.keymanager)
+ smtp = LeapSmtp(self._smtp_config, self.keymanager)
port = 500
smtp.local_smtp_port_number = port
gateway_mock.return_value = (None, None)
- with HTTMock(ca_cert_mock, not_found_mock):
- smtp.ensure_running()
+ smtp.ensure_running()
cert_path = self._client_cert_path()
- gateway_mock.assert_called_with(keymanager=self.keymanager, smtp_cert=cert_path, smtp_key=cert_path, userid='test_user@some-server.test', smtp_port='1234', encrypted_only=False, smtp_host='smtp.some-sever.test', port=port)
+ gateway_mock.assert_called_with(smtp_cert=cert_path, userid='test_user@some-server.test', smtp_port=1234, smtp_key=cert_path, keymanager=self.keymanager, encrypted_only=False, smtp_host='smtp.some-server.test', port=port)
def test_that_client_stop_does_nothing_if_not_started(self):
- smtp = LeapSmtp(self.provider, self.auth, self.keymanager)
+ smtp = LeapSmtp(self._smtp_config, self.keymanager)
- with HTTMock(not_found_mock):
- smtp.stop()
+ smtp.stop()
@patch('pixelated.bitmask_libraries.smtp.setup_smtp_gateway')
def test_that_running_smtp_sevice_is_stopped(self, gateway_mock):
- smtp = LeapSmtp(self.provider, self.auth, self.keymanager)
+ smtp = LeapSmtp(self._smtp_config, self.keymanager)
smtp_service = MagicMock()
smtp_port = MagicMock()
gateway_mock.return_value = (smtp_service, smtp_port)
- with HTTMock(ca_cert_mock, not_found_mock):
- smtp.ensure_running()
- smtp.stop()
+ smtp.ensure_running()
+ smtp.stop()
smtp_port.stopListening.assert_called_with()
smtp_service.doStop.assert_called_with()
diff --git a/service/test/unit/bitmask_libraries/test_smtp_cert_downloader.py b/service/test/unit/bitmask_libraries/test_smtp_cert_downloader.py
new file mode 100644
index 00000000..5644ab6a
--- /dev/null
+++ b/service/test/unit/bitmask_libraries/test_smtp_cert_downloader.py
@@ -0,0 +1,78 @@
+#
+# Copyright (c) 2015 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/>.
+import unittest
+from mockito import mock, unstub
+from requests import HTTPError
+from pixelated.bitmask_libraries.session import SmtpCertDownloader
+from tempfile import NamedTemporaryFile
+from httmock import all_requests, HTTMock, urlmatch
+
+CERTIFICATE_DATA = 'some cert data'
+
+
+@all_requests
+def not_found_mock(url, request):
+ return {'status_code': 404,
+ 'content': 'foobar'}
+
+
+@urlmatch(netloc='api.some-server.test:4430', path='/1/cert')
+def ca_cert_mock(url, request):
+ return {
+ "status_code": 200,
+ "content": CERTIFICATE_DATA
+ }
+
+
+class TestSmtpCertDownloader(unittest.TestCase):
+
+ def setUp(self):
+ self._provider = mock()
+ self._config = mock()
+ self._config.leap_home = '/tmp'
+ self._auth = mock()
+
+ self._provider.config = self._config
+ self._provider.api_uri = 'https://api.some-server.test:4430'
+ self._provider.api_version = '1'
+ self._provider.server_name = 'some.host.tld'
+
+ self._auth.session_id = 'some session id'
+ self._auth.token = 'some token'
+
+ def tearDown(self):
+ unstub()
+
+ def test_download_certificate(self):
+ with HTTMock(ca_cert_mock, not_found_mock):
+ cert_data = SmtpCertDownloader(self._provider, self._auth).download()
+
+ self.assertEqual(CERTIFICATE_DATA, cert_data)
+
+ def test_error_if_not_found(self):
+ downloader = SmtpCertDownloader(self._provider, self._auth)
+ with HTTMock(not_found_mock):
+ self.assertRaises(HTTPError, downloader.download)
+
+ def test_download_to(self):
+ downloader = SmtpCertDownloader(self._provider, self._auth)
+
+ with NamedTemporaryFile() as tmp_file:
+ with HTTMock(ca_cert_mock, not_found_mock):
+ downloader.download_to(tmp_file.name)
+
+ file_content = open(tmp_file.name).read()
+ self.assertEqual(CERTIFICATE_DATA, file_content)