summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
Diffstat (limited to 'service')
-rw-r--r--service/pixelated/adapter/services/mailbox.py52
-rw-r--r--service/pixelated/adapter/services/mailboxes.py99
-rw-r--r--service/test/unit/adapter/test_mail_service.py8
-rw-r--r--service/test/unit/adapter/test_mailbox.py44
-rw-r--r--service/test/unit/adapter/test_mailboxes.py44
5 files changed, 4 insertions, 243 deletions
diff --git a/service/pixelated/adapter/services/mailbox.py b/service/pixelated/adapter/services/mailbox.py
deleted file mode 100644
index de86f79d..00000000
--- a/service/pixelated/adapter/services/mailbox.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#
-# 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 twisted.internet import defer
-
-
-class Mailbox(object):
-
- def __init__(self, mailbox_name, querier, search_engine):
- self.mailbox_name = mailbox_name
- self.mailbox_tag = mailbox_name.lower()
- self.search_engine = search_engine
- self.querier = querier
-
- @property
- @defer.inlineCallbacks
- def fresh(self):
- defer.returnValue((yield self.querier.get_lastuid(self.mailbox_name)) == 0)
-
- def mail(self, mail_id):
- return self.querier.mail(mail_id)
-
- @defer.inlineCallbacks
- def add(self, mail):
- added_mail = yield self.querier.create_mail(mail, self.mailbox_name)
-
- self.search_engine.index_mail(added_mail)
- defer.returnValue(added_mail)
-
- @defer.inlineCallbacks
- def remove(self, ident):
- mail = yield self.querier.mail(ident)
- self.search_engine.remove_from_index(mail.ident)
- yield mail.remove_all_tags()
- yield self.querier.remove_mail(mail)
-
- @classmethod
- def create(cls, mailbox_name, soledad_querier, search_engine):
- return Mailbox(mailbox_name, soledad_querier, search_engine)
diff --git a/service/pixelated/adapter/services/mailboxes.py b/service/pixelated/adapter/services/mailboxes.py
deleted file mode 100644
index f8420326..00000000
--- a/service/pixelated/adapter/services/mailboxes.py
+++ /dev/null
@@ -1,99 +0,0 @@
-#
-# 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 twisted.internet import defer
-from pixelated.adapter.services.mailbox import Mailbox
-from pixelated.adapter.listeners.mailbox_indexer_listener import MailboxIndexerListener
-from pixelated.adapter.model.mail import welcome_mail
-from twisted.mail.imap4 import MailboxCollision
-
-
-class Mailboxes(object):
-
- def __init__(self, account, mail_store, soledad_querier, search_engine):
- self.account = account
- self.querier = soledad_querier
- self.search_engine = search_engine
- self.mail_store = mail_store
- # for mailbox_name in account.mailboxes:
- # MailboxIndexerListener.listen(self.account, mailbox_name, soledad_querier)
-
- @defer.inlineCallbacks
- def index_mailboxes(self):
- mailboxes = yield self.account.account.list_all_mailbox_names()
- yield self._index_mailboxes(mailboxes)
-
- @defer.inlineCallbacks
- def _index_mailboxes(self, mailboxes):
- for mailbox_name in mailboxes:
- yield MailboxIndexerListener.listen(self.account, mailbox_name, self.mail_store)
-
- @defer.inlineCallbacks
- def _create_or_get(self, mailbox_name):
- mailbox_name = mailbox_name.upper()
- # if mailbox_name not in self.account.mailboxes:
- if mailbox_name not in (yield self.account.account.list_all_mailbox_names()):
- try:
- yield self.account.addMailbox(mailbox_name)
- except MailboxCollision:
- pass
- # It means that it is already created. FIXME Why list_all fails to tell?
- yield MailboxIndexerListener.listen(self.account, mailbox_name, self.mail_store)
- defer.returnValue(Mailbox.create(mailbox_name, self.querier, self.search_engine))
-
- @property
- def inbox(self):
- return self._create_or_get('INBOX')
-
- @property
- def drafts(self):
- return self._create_or_get('DRAFTS')
-
- @property
- def trash(self):
- return self._create_or_get('TRASH')
-
- @property
- def sent(self):
- return self._create_or_get('SENT')
-
- @defer.inlineCallbacks
- def mailboxes(self):
- mailboxes_names = yield self.account.account.list_all_mailbox_names()
- defer.returnValue([(yield self._create_or_get(leap_mailbox_name)) for leap_mailbox_name in mailboxes_names])
-
- def move_to_trash(self, mail_id):
- return self._move_to(mail_id, self.trash)
-
- def move_to_inbox(self, mail_id):
- return self._move_to(mail_id, self.inbox)
-
- @defer.inlineCallbacks
- def _move_to(self, mail_id, mailbox):
- mailbox = yield mailbox
- mail = yield self.querier.mail(mail_id)
- mail.set_mailbox(mailbox.mailbox_name)
- mail.save()
- defer.returnValue(mail)
-
- def mail(self, mail_id):
- return self.querier.mail(mail_id)
-
- @defer.inlineCallbacks
- def add_welcome_mail_for_fresh_user(self):
- inbox = yield self._create_or_get('INBOX')
- if (yield inbox.fresh):
- mail = welcome_mail()
- yield inbox.add(mail)
diff --git a/service/test/unit/adapter/test_mail_service.py b/service/test/unit/adapter/test_mail_service.py
index 43fd21d1..79161a04 100644
--- a/service/test/unit/adapter/test_mail_service.py
+++ b/service/test/unit/adapter/test_mail_service.py
@@ -121,12 +121,12 @@ class TestMailService(unittest.TestCase):
verify(self.mail_store).move_mail_to_mailbox(1, 'TRASH')
+ @defer.inlineCallbacks
def test_recover_mail(self):
mail_to_recover = PixelatedMail.from_soledad(*leap_mail(), soledad_querier=None)
when(self.mail_service).mail(1).thenReturn(mail_to_recover)
- when(self.mailboxes).move_to_inbox(1).thenReturn(mail_to_recover)
+ when(self.mail_store).move_mail_to_mailbox(1, 'INBOX').thenReturn(mail_to_recover)
- self.mail_service.recover_mail(1)
+ yield self.mail_service.recover_mail(1)
- verify(self.mailboxes).move_to_inbox(1)
- verify(self.search_engine).index_mail(mail_to_recover)
+ verify(self.mail_store).move_mail_to_mailbox(1, 'INBOX')
diff --git a/service/test/unit/adapter/test_mailbox.py b/service/test/unit/adapter/test_mailbox.py
deleted file mode 100644
index e3e02f04..00000000
--- a/service/test/unit/adapter/test_mailbox.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# 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 twisted.trial import unittest
-
-from pixelated.adapter.model.mail import PixelatedMail
-from pixelated.adapter.services.mailbox import Mailbox
-from mockito import mock, when, verify
-from test.support import test_helper
-from twisted.internet import defer
-
-
-class PixelatedMailboxTest(unittest.TestCase):
- def setUp(self):
- self.querier = mock()
- self.search_engine = mock()
- self.mailbox = Mailbox('INBOX', self.querier, self.search_engine)
-
- def test_remove_message_from_mailbox(self):
- mail = PixelatedMail.from_soledad(*test_helper.leap_mail(), soledad_querier=self.querier)
- when(self.querier).mail(1).thenReturn(mail)
-
- self.mailbox.remove(1)
-
- verify(self.querier).remove_mail(mail)
-
- @defer.inlineCallbacks
- def test_fresh_mailbox_checking_lastuid(self):
- when(self.querier).get_lastuid('INBOX').thenReturn(0)
- self.assertTrue(self.mailbox.fresh)
- when(self.querier).get_lastuid('INBOX').thenReturn(1)
- self.assertFalse((yield self.mailbox.fresh))
diff --git a/service/test/unit/adapter/test_mailboxes.py b/service/test/unit/adapter/test_mailboxes.py
deleted file mode 100644
index efd3df6b..00000000
--- a/service/test/unit/adapter/test_mailboxes.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# 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/>.
-import unittest
-
-from pixelated.adapter.model.mail import PixelatedMail
-from pixelated.adapter.services.mailboxes import Mailboxes
-from mockito import mock, when, verify
-from twisted.internet import defer
-from test.support import test_helper
-from mock import MagicMock
-
-
-class PixelatedMailboxesTest(unittest.TestCase):
-
- def setUp(self):
- self.querier = mock()
- self.mail_store = mock()
- self.search_engine = mock()
- self.account = MagicMock()
- self.mailboxes = Mailboxes(self.account, self.mail_store, self.querier, self.search_engine)
-
- @defer.inlineCallbacks
- def test_move_to_inbox(self):
- mail = PixelatedMail.from_soledad(*test_helper.leap_mail(), soledad_querier=self.querier)
- when(self.querier).mail(1).thenReturn(mail)
- when(mail).save().thenReturn(None)
-
- mail.set_mailbox('TRASH')
- recovered_mail = yield self.mailboxes.move_to_inbox(1)
- self.assertEquals('INBOX', recovered_mail.mailbox_name)
- verify(mail).save()