diff options
Diffstat (limited to 'service')
-rw-r--r-- | service/pixelated/adapter/services/mail_service.py | 5 | ||||
-rw-r--r-- | service/pixelated/resources/mails_resource.py | 19 | ||||
-rw-r--r-- | service/test/unit/resources/test_archive_resource.py | 32 |
3 files changed, 56 insertions, 0 deletions
diff --git a/service/pixelated/adapter/services/mail_service.py b/service/pixelated/adapter/services/mail_service.py index 53f7615e..5485ae18 100644 --- a/service/pixelated/adapter/services/mail_service.py +++ b/service/pixelated/adapter/services/mail_service.py @@ -132,5 +132,10 @@ class MailService(object): yield self.mail_store.move_mail_to_mailbox(mail_id, 'INBOX') @defer.inlineCallbacks + def archive_mail(self, mail_id): + yield self.mail_store.add_mailbox('ARCHIVE') + yield self.mail_store.move_mail_to_mailbox(mail_id, 'ARCHIVE') + + @defer.inlineCallbacks def delete_permanent(self, mail_id): yield self.mail_store.delete_mail(mail_id) diff --git a/service/pixelated/resources/mails_resource.py b/service/pixelated/resources/mails_resource.py index 499610de..5b5335b9 100644 --- a/service/pixelated/resources/mails_resource.py +++ b/service/pixelated/resources/mails_resource.py @@ -94,6 +94,24 @@ class MailsRecoverResource(Resource): return NOT_DONE_YET +class MailsArchiveResource(Resource): + isLeaf = True + + def __init__(self, mail_service): + Resource.__init__(self) + self._mail_service = mail_service + + def render_POST(self, request): + idents = json.loads(request.content.read())['idents'] + deferreds = [] + for ident in idents: + deferreds.append(self._mail_service.archive_mail(ident)) + d = defer.gatherResults(deferreds, consumeErrors=True) + d.addCallback(lambda _: respond_json_deferred({'successMessage': 'Your message was archived'}, request)) + d.addErrback(lambda _: respond_json_deferred(None, request, status_code=500)) + return NOT_DONE_YET + + class MailsResource(Resource): def _register_smtp_error_handler(self): @@ -108,6 +126,7 @@ class MailsResource(Resource): Resource.__init__(self) self.putChild('delete', MailsDeleteResource(mail_service)) self.putChild('recover', MailsRecoverResource(mail_service)) + self.putChild('archive', MailsArchiveResource(mail_service)) self.putChild('read', MailsReadResource(mail_service)) self.putChild('unread', MailsUnreadResource(mail_service)) diff --git a/service/test/unit/resources/test_archive_resource.py b/service/test/unit/resources/test_archive_resource.py new file mode 100644 index 00000000..28078222 --- /dev/null +++ b/service/test/unit/resources/test_archive_resource.py @@ -0,0 +1,32 @@ +import unittest +import json +from mockito import mock, when, verify +from test.unit.resources import DummySite +from twisted.web.test.requesthelper import DummyRequest +from pixelated.resources.mails_resource import MailsArchiveResource +from twisted.internet import defer + + +class TestArchiveResource(unittest.TestCase): + def setUp(self): + self.mail_service = mock() + self.web = DummySite(MailsArchiveResource(self.mail_service)) + + def test_render_POST_should_archive_mails(self): + request = DummyRequest(['/mails/archive']) + request.method = 'POST' + content = mock() + when(content).read().thenReturn(json.dumps({'idents': ['1', '2']})) + + when(self.mail_service).archive_mail('1').thenReturn(defer.Deferred()) + when(self.mail_service).archive_mail('2').thenReturn(defer.Deferred()) + + request.content = content + d = self.web.get(request) + + def assert_response(_): + verify(self.mail_service).archive_mail('1') + verify(self.mail_service).archive_mail('2') + + d.addCallback(assert_response) + return d |