From 5a0d81e35b97113df983d8fd3fcbdb995606f56a Mon Sep 17 00:00:00 2001 From: Bruno Wagner Goncalves Date: Thu, 7 Aug 2014 18:31:22 -0300 Subject: Closes #2 +@shyba +@bwagner - Implemented behavior when calling get /mails, only works with basic tag search yet --- service/app/adapter/mail_service.py | 28 ++++++++++++++-- service/test/adapter/mail_service_test.py | 53 +++++++++++++++++++++++++++---- 2 files changed, 73 insertions(+), 8 deletions(-) (limited to 'service') diff --git a/service/app/adapter/mail_service.py b/service/app/adapter/mail_service.py index c2ba5e5e..a5bb1506 100644 --- a/service/app/adapter/mail_service.py +++ b/service/app/adapter/mail_service.py @@ -8,6 +8,9 @@ from app.bitmask_libraries.auth import LeapCredentials class MailService: + + SPECIAL_BOXES = ['inbox', 'sent', 'drafts', 'trash'] + def __init__(self): try: self.username = 'test_user' @@ -25,11 +28,32 @@ class MailService: self.leap_config = LeapConfig(leap_home=self.leapdir) self.provider = LeapProvider(self.server_name, self.leap_config) self.leap_session = LeapSessionFactory(self.provider).create(LeapCredentials(self.username, self.password)) - self.mail_box = self.leap_session.account.getMailbox(self.mailbox_name) + self.account = self.leap_session.account + self.mailbox = self.account.getMailbox(self.mailbox_name) def mails(self, query): - return self.mail_box.messages + mailbox = self._switch_mailbox(query['tags'][0]) + return mailbox.messages if mailbox else [] + def _switch_mailbox(self, name): + mailbox = None + if name in self.SPECIAL_BOXES: + self._create_mailbox(name) + try: + mailbox = self.account.getMailbox(name) + except Exception, e: + if not 'MailboxException' == e.__class__.__name__: + raise e + return mailbox + + def _create_mailbox(self, name): + created = False + try: + created = self.account.addMailbox(name) + except Exception, e: + if not 'MailboxCollision' == e.__class__.__name__: + raise e + return created def drafts(self): return [] diff --git a/service/test/adapter/mail_service_test.py b/service/test/adapter/mail_service_test.py index dfaee058..84822038 100644 --- a/service/test/adapter/mail_service_test.py +++ b/service/test/adapter/mail_service_test.py @@ -1,16 +1,57 @@ import sys import os import unittest +from mock import patch +from mock import Mock from app.adapter.mail_service import MailService +class MailboxCollision(Exception): + pass + + +class MailboxException(Exception): + pass + + class TestMailService(unittest.TestCase): - def test_initialization(self): - mail_service = MailService() + def setUp(self): + self.mail_service = MailService() + + def test_request_mail_has_mailbox(self): + with patch.object(self.mail_service, '_switch_mailbox', return_value=Mock()): + mails = self.mail_service.mails({'tags': ['inbox']}) + self.assertIsNotNone(mails) + + def test_request_mail_has_mailbox(self): + with patch.object(self.mail_service, '_switch_mailbox', return_value=None): + mails = self.mail_service.mails({'tags': ['inbox']}) + self.assertEqual(mails, []) + + def test_switch_mailbox_special_tag(self): + mailbox = Mock() + with patch.object(self.mail_service.account, 'getMailbox', return_value=mailbox): + new_mailbox = self.mail_service._switch_mailbox('sent') + self.assertEqual(new_mailbox, mailbox) + + def test_switch_mailbox_custom_tag_exists(self): + mailbox = Mock() + with patch.object(self.mail_service.account, 'getMailbox', return_value=mailbox): + returned_mailbox = self.mail_service._switch_mailbox('custom') + self.assertEqual(mailbox, returned_mailbox) + + def test_switch_mailbox_custom_tag_not_exists(self): + mailbox = Mock() + with patch.object(self.mail_service.account, 'getMailbox', side_effect=MailboxException()): + mailbox = self.mail_service._switch_mailbox('custom') + self.assertIsNone(mailbox) + + def test_create_new_mailbox(self): + with patch.object(self.mail_service.account, 'addMailbox', return_value=True) as addMailbox: + self.assertTrue(self.mail_service._create_mailbox('teste')) - def test_receive_mail(self): - mail_service = MailService() - mails = mail_service.mails("") - self.assertIsNotNone(mails) + def test_create_existing_mailbox(self): + with patch.object(self.mail_service.account, 'addMailbox', side_effect=MailboxCollision()) as addMailbox: + self.assertFalse(self.mail_service._create_mailbox('teste')) -- cgit v1.2.3