diff options
4 files changed, 65 insertions, 2 deletions
diff --git a/service/pixelated/adapter/mailstore/leap_mailstore.py b/service/pixelated/adapter/mailstore/leap_mailstore.py index c1e9f0d8..87bfea04 100644 --- a/service/pixelated/adapter/mailstore/leap_mailstore.py +++ b/service/pixelated/adapter/mailstore/leap_mailstore.py @@ -126,7 +126,6 @@ class LeapMailStore(MailStore): def copy_mail_to_mailbox(self, mail_id, mailbox_name): message = yield self._fetch_msg_from_soledad(mail_id, load_body=True) mailbox = yield self._get_or_create_mailbox(mailbox_name) - copy_wrapper = yield message.get_wrapper().copy(self.soledad, mailbox.uuid) leap_message = Message(copy_wrapper) @@ -135,6 +134,12 @@ class LeapMailStore(MailStore): defer.returnValue(mail) + @defer.inlineCallbacks + def move_mail_to_mailbox(self, mail_id, mailbox_name): + mail_copy = yield self.copy_mail_to_mailbox(mail_id, mailbox_name) + yield self.delete_mail(mail_id) + defer.returnValue(mail_copy) + def _update_mail(self, message): return message.get_wrapper().update(self.soledad) diff --git a/service/pixelated/adapter/mailstore/mailstore.py b/service/pixelated/adapter/mailstore/mailstore.py index 29d4fe67..425def92 100644 --- a/service/pixelated/adapter/mailstore/mailstore.py +++ b/service/pixelated/adapter/mailstore/mailstore.py @@ -49,6 +49,9 @@ class MailStore(object): def copy_mail_to_mailbox(self, mail_id, mailbox_name): pass + def move_mail_to_mailbox(self, mail_id, mailbox_name): + pass + def underscore_uuid(uuid): return uuid.replace('-', '_') diff --git a/service/test/support/mockito/__init__.py b/service/test/support/mockito/__init__.py new file mode 100644 index 00000000..c8ffc55e --- /dev/null +++ b/service/test/support/mockito/__init__.py @@ -0,0 +1,40 @@ +# +# 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/>. +from mockito.invocation import AnswerSelector, CompositeAnswer + + +class FunctionReturn(object): + """ + Instead of returning a constant value a function is called + """ + def __init__(self, function_answer): + self.function_answer = function_answer + + def answer(self): + return self.function_answer() + + +def thenAnswer(self, answer_function): + """mockito does not support the thenAnswer style. This method monkey patches it into the library""" + if not self.answer: + self.answer = CompositeAnswer(FunctionReturn(answer_function)) + self.invocation.stub_with(self.answer) + else: + self.answer.add(FunctionReturn(answer_function)) + + return self + +AnswerSelector.thenAnswer = thenAnswer diff --git a/service/test/unit/adapter/mailstore/test_leap_mailstore.py b/service/test/unit/adapter/mailstore/test_leap_mailstore.py index 322fa23d..92a4b63d 100644 --- a/service/test/unit/adapter/mailstore/test_leap_mailstore.py +++ b/service/test/unit/adapter/mailstore/test_leap_mailstore.py @@ -24,6 +24,7 @@ from twisted.trial.unittest import TestCase from leap.mail import constants from twisted.internet import defer from mockito import mock, when, verify, any +import test.support.mockito from leap.mail.adaptors.soledad import SoledadMailAdaptor, MailboxWrapper import pkg_resources from leap.mail.mail import Message @@ -246,6 +247,19 @@ class TestLeapMailStore(TestCase): self._assert_message_docs_created(expected_message, mail, only_mdoc_and_fdoc=True) + @defer.inlineCallbacks + def test_move_to_mailbox(self): + expected_message = self._add_create_mail_mocks_to_soledad('mbox00000000') + mail_id, fdoc_id = self._add_mail_fixture_to_soledad('mbox00000000') + self._mock_get_mailbox('TRASH') + store = LeapMailStore(self.soledad) + + mail = yield store.move_mail_to_mailbox(mail_id, 'TRASH') + + self._assert_message_docs_created(expected_message, mail, only_mdoc_and_fdoc=True) + # verify(self.soledad).delete_doc(self.doc_by_id[mail_id]) + # verify(self.soledad).delete_doc(self.doc_by_id[fdoc_id]) + def _assert_message_docs_created(self, expected_message, actual_message, only_mdoc_and_fdoc=False): wrapper = expected_message.get_wrapper() @@ -311,7 +325,8 @@ class TestLeapMailStore(TestCase): def _mock_soledad_doc(self, doc_id, doc): soledad_doc = SoledadDocument(doc_id, json=json.dumps(doc.serialize())) - when(self.soledad).get_doc(doc_id).thenReturn(defer.succeed(soledad_doc)) + # when(self.soledad).get_doc(doc_id).thenReturn(defer.succeed(soledad_doc)) + when(self.soledad).get_doc(doc_id).thenAnswer(lambda: defer.succeed(soledad_doc)) self.doc_by_id[doc_id] = soledad_doc |