From 6d72d76f7753004c84d1a0eed6667b551c11b626 Mon Sep 17 00:00:00 2001 From: Folker Bernitt Date: Mon, 27 Jul 2015 17:27:24 +0200 Subject: Added add mailbox and add message behaviour. - Add message does not yet mail index --- service/pixelated/adapter/mailstore/__init__.py | 3 ++ .../pixelated/adapter/mailstore/leap_mailstore.py | 18 +++++++ service/test/integration/test_leap_mailstore.py | 11 +++- .../test/support/integration/app_test_client.py | 10 +++- .../test/support/integration/soledad_test_base.py | 1 + .../unit/adapter/mailstore/test_leap_mailstore.py | 61 ++++++++++++++++++++-- 6 files changed, 98 insertions(+), 6 deletions(-) (limited to 'service') diff --git a/service/pixelated/adapter/mailstore/__init__.py b/service/pixelated/adapter/mailstore/__init__.py index 05d21e8b..47fd9869 100644 --- a/service/pixelated/adapter/mailstore/__init__.py +++ b/service/pixelated/adapter/mailstore/__init__.py @@ -37,5 +37,8 @@ class MailStore(object): def get_mailbox_names(self): pass + def add_mailbox(self, mailbox_name): + pass + def get_mailbox_mail_ids(self, mailbox_name): pass diff --git a/service/pixelated/adapter/mailstore/leap_mailstore.py b/service/pixelated/adapter/mailstore/leap_mailstore.py index 1b72707f..9b6e0e0d 100644 --- a/service/pixelated/adapter/mailstore/leap_mailstore.py +++ b/service/pixelated/adapter/mailstore/leap_mailstore.py @@ -85,6 +85,21 @@ class LeapMailStore(MailStore): mails = yield self.get_mails(mail_ids) defer.returnValue(mails) + @defer.inlineCallbacks + def add_mailbox(self, mailbox_name): + mailbox = yield self._get_or_create_mailbox(mailbox_name) + defer.returnValue(mailbox) + + @defer.inlineCallbacks + def add_mail(self, mailbox_name, raw_msg): + mailbox = yield self._get_or_create_mailbox(mailbox_name) + message = SoledadMailAdaptor().get_msg_from_string(Message, raw_msg) + message.get_wrapper().set_mbox_uuid(mailbox.doc_id) + message.get_wrapper().create(self.soledad) + + # add behavious from insert_mdoc_id from mail.py + defer.returnValue(mailbox) + @defer.inlineCallbacks def _leap_message_to_leap_mail(self, mail_id, message, include_body): if include_body: @@ -95,5 +110,8 @@ class LeapMailStore(MailStore): defer.returnValue(mail) + def _get_or_create_mailbox(self, mailbox_name): + return SoledadMailAdaptor().get_or_create_mbox(self.soledad, mailbox_name) + def _fetch_msg_from_soledad(self, mail_id): return SoledadMailAdaptor().get_msg_from_mdoc_id(Message, self.soledad, mail_id) diff --git a/service/test/integration/test_leap_mailstore.py b/service/test/integration/test_leap_mailstore.py index f666b645..dbe0ffb0 100644 --- a/service/test/integration/test_leap_mailstore.py +++ b/service/test/integration/test_leap_mailstore.py @@ -26,8 +26,9 @@ from uuid import uuid4 class LeapMailStoreTest(SoledadTestBase): + @defer.inlineCallbacks def setUp(self): - super(LeapMailStoreTest, self).setUp() + yield super(LeapMailStoreTest, self).setUp() self.adaptor = SoledadMailAdaptor() self.mbox_uuid = str(uuid4()) self.store = LeapMailStore(self.soledad) @@ -52,6 +53,14 @@ class LeapMailStoreTest(SoledadTestBase): self.assertEqual(1, len(mails)) self.assertEqual('Itaque consequatur repellendus provident sunt quia.', mails[0].subject) + @defer.inlineCallbacks + def test_add_mail(self): + yield self.adaptor.initialize_store(self.soledad) + mail = _load_mail_from_file('mbox00000000') + mailbox = yield self.store.add_mailbox('INBOX') + + msg = yield self.store.add_mail('INBOX', mail.as_string()) + @defer.inlineCallbacks def _create_mail_in_soledad(self, mail): message = self._convert_mail_to_leap_message(mail) diff --git a/service/test/support/integration/app_test_client.py b/service/test/support/integration/app_test_client.py index da237284..67cd9df0 100644 --- a/service/test/support/integration/app_test_client.py +++ b/service/test/support/integration/app_test_client.py @@ -15,6 +15,7 @@ # along with Pixelated. If not, see . import json import multiprocessing +from leap.mail.adaptors.soledad import SoledadMailAdaptor from mockito import mock import os import shutil @@ -61,7 +62,8 @@ class AppTestClient(object): PixelatedMail.from_email_address = self.MAIL_ADDRESS - self.soledad = initialize_soledad(tempdir=soledad_test_folder) + self.soledad = yield initialize_soledad(tempdir=soledad_test_folder) + self.soledad_querier = self._create_soledad_querier(self.soledad, self.INDEX_KEY) self.keymanager = mock() @@ -225,6 +227,7 @@ class AppTestClient(object): return res +@defer.inlineCallbacks def initialize_soledad(tempdir): if os.path.isdir(tempdir): shutil.rmtree(tempdir) @@ -257,4 +260,7 @@ def initialize_soledad(tempdir): cert_file, defer_encryption=False, syncable=False) - return _soledad + + yield SoledadMailAdaptor().initialize_store(_soledad) + + defer.returnValue(_soledad) diff --git a/service/test/support/integration/soledad_test_base.py b/service/test/support/integration/soledad_test_base.py index 979b1f96..2ebd6749 100644 --- a/service/test/support/integration/soledad_test_base.py +++ b/service/test/support/integration/soledad_test_base.py @@ -13,6 +13,7 @@ # # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see . +from twisted.internet import defer from twisted.trial import unittest from test.support.integration.app_test_client import AppTestClient diff --git a/service/test/unit/adapter/mailstore/test_leap_mailstore.py b/service/test/unit/adapter/mailstore/test_leap_mailstore.py index 26dd21f0..57dfa292 100644 --- a/service/test/unit/adapter/mailstore/test_leap_mailstore.py +++ b/service/test/unit/adapter/mailstore/test_leap_mailstore.py @@ -18,13 +18,13 @@ from uuid import uuid4 from email.parser import Parser import os from leap.soledad.common.document import SoledadDocument - +from leap.mail.adaptors.soledad_indexes import MAIL_INDEXES from twisted.internet.defer import FirstError from twisted.trial.unittest import TestCase from leap.mail import constants from twisted.internet import defer from mockito import mock, when, verify, any -from leap.mail.adaptors.soledad import SoledadMailAdaptor +from leap.mail.adaptors.soledad import SoledadMailAdaptor, MailboxWrapper import pkg_resources from leap.mail.mail import Message @@ -171,6 +171,39 @@ class TestLeapMailStore(TestCase): self.assertEqual('Itaque consequatur repellendus provident sunt quia.', mails[0].subject) self.assertEqual('Error illum dignissimos autem eos aspernatur.', mails[1].subject) + @defer.inlineCallbacks + def test_add_mailbox(self): + when(self.soledad).list_indexes().thenReturn(defer.succeed(MAIL_INDEXES)).thenReturn(defer.succeed(MAIL_INDEXES)) + when(self.soledad).get_from_index('by-type-and-mbox', 'mbox', 'TEST').thenReturn(defer.succeed([])) + when(self.soledad).create_doc(any()).thenReturn(defer.succeed(None)) + self._mock_create_doc(self.mbox_uuid, MailboxWrapper(mbox='TEST')) + store = LeapMailStore(self.soledad) + + mbox = yield store.add_mailbox('TEST') + + self.assertIsNotNone(mbox) + self.assertEqual(self.mbox_uuid, mbox.doc_id) + self.assertEqual('TEST', mbox.mbox) + + @defer.inlineCallbacks + def test_add_mail(self): + {'multi': False, 'tags': [], 'deleted': False, 'mbox_uuid': '6e8e5a30_b784_43d4_a262_ad81962e5196', 'chash': 'DDE33BCB72DC69A0011CB1D4D4EF5A5F85E703C7C66C551AA51ED50334348A90', 'flags': [], 'seen': False, 'recent': False, 'type': 'flags', 'size': 566} + {'multi': False, 'tags': [], 'deleted': False, 'mbox_uuid': '', 'chash': 'DDE33BCB72DC69A0011CB1D4D4EF5A5F85E703C7C66C551AA51ED50334348A90', 'flags': [], 'seen': False, 'recent': False, 'type': 'flags', 'size': 566} + + self._add_create_mail_mocks_to_soledad('mbox00000000') + + mail = self._load_mail_from_file('mbox00000000') + when(self.soledad).list_indexes().thenReturn(defer.succeed(MAIL_INDEXES)).thenReturn(defer.succeed(MAIL_INDEXES)) + mbox = MailboxWrapper(doc_id=self.mbox_uuid, mbox='INBOX') + soledad_doc = SoledadDocument(self.mbox_uuid, json=json.dumps(mbox.serialize())) + when(self.soledad).get_from_index('by-type-and-mbox', 'mbox', 'INBOX').thenReturn(defer.succeed([soledad_doc])) + + store = LeapMailStore(self.soledad) + + mbx = yield store.add_mail('INBOX', mail.as_string()) + + self.assertEqual(self.mbox_uuid, mbx.doc_id) + def _add_mail_fixture_to_soledad(self, mail_file): mail = self._load_mail_from_file(mail_file) msg = self._convert_mail_to_leap_message(mail) @@ -188,9 +221,24 @@ class TestLeapMailStore(TestCase): return mdoc_id, fdoc_id + def _add_create_mail_mocks_to_soledad(self, mail_file): + mail = self._load_mail_from_file(mail_file) + msg = self._convert_mail_to_leap_message(mail) + wrapper = msg.get_wrapper() + + mdoc_id = wrapper.mdoc.future_doc_id + fdoc_id = wrapper.mdoc.fdoc + hdoc_id = wrapper.mdoc.hdoc + cdoc_id = wrapper.mdoc.cdocs[0] + + self._mock_create_doc(mdoc_id, wrapper.mdoc) + self._mock_create_doc(fdoc_id, wrapper.fdoc) + self._mock_create_doc(hdoc_id, wrapper.hdoc) + self._mock_create_doc(cdoc_id, wrapper.cdocs[1]) + def _convert_mail_to_leap_message(self, mail): msg = SoledadMailAdaptor().get_msg_from_string(Message, mail.as_string()) - msg.get_wrapper().mdoc.set_mbox_uuid(self.mbox_uuid) + msg.get_wrapper().set_mbox_uuid(self.mbox_uuid) return msg def _mock_soledad_doc(self, doc_id, doc): @@ -200,6 +248,13 @@ class TestLeapMailStore(TestCase): self.doc_by_id[doc_id] = soledad_doc + def _mock_create_doc(self, doc_id, doc): + soledad_doc = SoledadDocument(doc_id, json=json.dumps(doc.serialize())) + if doc.future_doc_id: + when(self.soledad).create_doc(doc.serialize(), doc_id=doc_id).thenReturn(defer.succeed(soledad_doc)) + else: + when(self.soledad).create_doc(doc.serialize()).thenReturn(defer.succeed(soledad_doc)) + def _load_mail_from_file(self, mail_file): mailset_dir = pkg_resources.resource_filename('test.unit.fixtures', 'mailset') mail_file = os.path.join(mailset_dir, 'new', mail_file) -- cgit v1.2.3