From f273d2abeefa0d77d306bcfab3135195afbc31c3 Mon Sep 17 00:00:00 2001 From: Lisa Junger Date: Wed, 19 Nov 2014 10:44:08 +0100 Subject: added functionality for reply all to service. --- service/test/integration/drafts_test.py | 2 ++ service/test/integration/reply_test.py | 42 ++++++++++++++++++++++ service/test/unit/adapter/mail_service_test.py | 8 +++++ service/test/unit/adapter/mail_test.py | 9 +++++ .../test/unit/controllers/mails_controller_test.py | 7 ++++ 5 files changed, 68 insertions(+) create mode 100644 service/test/integration/reply_test.py (limited to 'service/test') diff --git a/service/test/integration/drafts_test.py b/service/test/integration/drafts_test.py index 2ba14dfd..7fd0a46b 100644 --- a/service/test/integration/drafts_test.py +++ b/service/test/integration/drafts_test.py @@ -14,6 +14,8 @@ # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see . +import unittest + from test.support.integration import * diff --git a/service/test/integration/reply_test.py b/service/test/integration/reply_test.py new file mode 100644 index 00000000..177cbb6b --- /dev/null +++ b/service/test/integration/reply_test.py @@ -0,0 +1,42 @@ +# +# 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 . + +import unittest +from test.support.integration_helper import MailBuilder, SoledadTestBase +from pixelated.adapter.mail import InputMail + + +class ReplyTest(SoledadTestBase): + + def setUp(self): + SoledadTestBase.setUp(self) + + def tearDown(self): + SoledadTestBase.tearDown(self) + + def test_get_provides_template_for_reply_all(self): + InputMail.FROM_EMAIL_ADDRESS = 'user@pixelated.org' + mail = MailBuilder().with_subject('some subject').with_to_addresses(['user@pixelated.org', 'another@pixelated.org']).with_ident(1).build_input_mail() + self.add_mail_to_inbox(mail) + + mails = self.get_mails_by_tag('inbox') + self.assertNotIn('read', mails[0].status) + + response = self.reply_all_template(mail.ident) + + self.assertEquals(200, response['code']) + self.assertEquals(['another@pixelated.org'], response['body']['header']['to'][0]) + self.assertEquals('Re: some subject', response['body']['header']['subject']) diff --git a/service/test/unit/adapter/mail_service_test.py b/service/test/unit/adapter/mail_service_test.py index c69f8f74..e5085724 100644 --- a/service/test/unit/adapter/mail_service_test.py +++ b/service/test/unit/adapter/mail_service_test.py @@ -49,3 +49,11 @@ class TestMailService(unittest.TestCase): self.mail_service.delete_mail(1) verify(self.mailboxes).move_to_trash(1) + + def test_reply_all_template(self): + mail = mock() + when(self.mail_service).mail(1).thenReturn(mail) + + self.mail_service.reply_all_template(1) + + verify(mail).to_reply_template() diff --git a/service/test/unit/adapter/mail_test.py b/service/test/unit/adapter/mail_test.py index e0879b44..cf821035 100644 --- a/service/test/unit/adapter/mail_test.py +++ b/service/test/unit/adapter/mail_test.py @@ -125,6 +125,15 @@ class TestPixelatedMail(unittest.TestCase): self.assertNotIn('\n', address) self.assertNotIn(',', address) self.assertEquals(4, len(mail.headers[header_label])) + def test_to_reply_template_removes_user_from_to(self): + InputMail.FROM_EMAIL_ADDRESS = 'user@pixelated.org' + fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent']) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) + hdoc.content['headers']['To'] = ['me@pixelated.org', 'user@pixelated.org'] + + template = mail.to_reply_template() + + self.assertFalse('user@pixelated.org' in template['header']['to'][0]) def test_content_type_is_read_from_headers_for_plain_mail_when_converted_to_raw(self): fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent'], body=u'some umlaut \xc3', extra_headers={'Content-Type': 'text/plain; charset=ISO-8859-1'}) diff --git a/service/test/unit/controllers/mails_controller_test.py b/service/test/unit/controllers/mails_controller_test.py index 6d566c83..c5234039 100644 --- a/service/test/unit/controllers/mails_controller_test.py +++ b/service/test/unit/controllers/mails_controller_test.py @@ -113,6 +113,13 @@ class TestMailsController(unittest.TestCase): verify(self.mail_service).delete_permanent(1) + def test_reply_all_returns_template(self): + when(self.mail_service).reply_all_template(1).thenReturn(self.input_mail.json) + + self.mails_controller.reply_all_template(self.dummy_request, 1) + + verify(self.mail_service).reply_all_template(1) + def _successfuly_send_mail(self, ident, mail): sent_mail = mock() sent_mail.mailbox_name = 'TRASH' -- cgit v1.2.3 From 9e53c0ddcdd5cd74cda0e9cb6cb05183adbe579c Mon Sep 17 00:00:00 2001 From: Alexandre Pretto Nunes Date: Thu, 27 Nov 2014 17:37:14 -0200 Subject: #135 Have the service respond the email details with who should be on to: and cc: when replying --- service/test/unit/adapter/mail_test.py | 31 ++++++++++++---------- .../test/unit/controllers/mails_controller_test.py | 1 - 2 files changed, 17 insertions(+), 15 deletions(-) (limited to 'service/test') diff --git a/service/test/unit/adapter/mail_test.py b/service/test/unit/adapter/mail_test.py index cf821035..4cc29287 100644 --- a/service/test/unit/adapter/mail_test.py +++ b/service/test/unit/adapter/mail_test.py @@ -71,7 +71,10 @@ class TestPixelatedMail(unittest.TestCase): def test_as_dict(self): fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent']) hdoc.content['headers']['Subject'] = 'The subject' - hdoc.content['headers']['From'] = 'me@pixelated.org' + hdoc.content['headers']['From'] = 'someone@pixelated.org' + hdoc.content['headers']['To'] = 'me@pixelated.org' + + InputMail.FROM_EMAIL_ADDRESS = 'me@pixelated.org' mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) @@ -80,16 +83,25 @@ class TestPixelatedMail(unittest.TestCase): self.assertEquals(_dict, {'body': 'body', 'header': { 'date': dateparser.parse(hdoc.content['date']).isoformat(), - 'from': 'me@pixelated.org', - 'subject': 'The subject' + 'from': 'someone@pixelated.org', + 'subject': 'The subject', + 'to': ['me@pixelated.org'], + 'cc': [], + 'bcc': [] }, 'ident': 'chash', 'mailbox': 'inbox', 'security_casing': {'imprints': [], 'locks': []}, 'status': ['recent'], 'tags': [], - 'attachments': [] - }) + 'attachments': [], + 'replying': { + 'single': 'someone@pixelated.org', + 'all': { + 'to-field': ['someone@pixelated.org'], + 'cc-field': [] + } + }}) def test_alternatives_body(self): parts = {'alternatives': [], 'attachments': []} @@ -125,15 +137,6 @@ class TestPixelatedMail(unittest.TestCase): self.assertNotIn('\n', address) self.assertNotIn(',', address) self.assertEquals(4, len(mail.headers[header_label])) - def test_to_reply_template_removes_user_from_to(self): - InputMail.FROM_EMAIL_ADDRESS = 'user@pixelated.org' - fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent']) - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) - hdoc.content['headers']['To'] = ['me@pixelated.org', 'user@pixelated.org'] - - template = mail.to_reply_template() - - self.assertFalse('user@pixelated.org' in template['header']['to'][0]) def test_content_type_is_read_from_headers_for_plain_mail_when_converted_to_raw(self): fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent'], body=u'some umlaut \xc3', extra_headers={'Content-Type': 'text/plain; charset=ISO-8859-1'}) diff --git a/service/test/unit/controllers/mails_controller_test.py b/service/test/unit/controllers/mails_controller_test.py index c5234039..3e28e6b0 100644 --- a/service/test/unit/controllers/mails_controller_test.py +++ b/service/test/unit/controllers/mails_controller_test.py @@ -122,7 +122,6 @@ class TestMailsController(unittest.TestCase): def _successfuly_send_mail(self, ident, mail): sent_mail = mock() - sent_mail.mailbox_name = 'TRASH' sent_mail.as_dict = lambda: self.input_mail.json return sent_mail -- cgit v1.2.3 From 0c53cdd869613f063b4f647b3f8de194a3417b60 Mon Sep 17 00:00:00 2001 From: Alexandre Pretto Nunes Date: Tue, 2 Dec 2014 10:32:33 -0200 Subject: #135 Use reply-to field instead of from when present --- service/test/unit/adapter/mail_test.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'service/test') diff --git a/service/test/unit/adapter/mail_test.py b/service/test/unit/adapter/mail_test.py index 4cc29287..f436bb6c 100644 --- a/service/test/unit/adapter/mail_test.py +++ b/service/test/unit/adapter/mail_test.py @@ -103,6 +103,25 @@ class TestPixelatedMail(unittest.TestCase): } }}) + def test_use_reply_to_address_for_replying(self): + fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent']) + hdoc.content['headers']['Subject'] = 'The subject' + hdoc.content['headers']['From'] = 'someone@pixelated.org' + hdoc.content['headers']['Reply-To'] = 'reply-to-this-address@pixelated.org' + hdoc.content['headers']['To'] = 'me@pixelated.org, \nalice@pixelated.org' + + InputMail.FROM_EMAIL_ADDRESS = 'me@pixelated.org' + + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) + + _dict = mail.as_dict() + + self.assertEquals(_dict['replying'], {'single': 'reply-to-this-address@pixelated.org', + 'all': { + 'to-field': ['alice@pixelated.org', 'reply-to-this-address@pixelated.org'], + 'cc-field': [] + }}) + def test_alternatives_body(self): parts = {'alternatives': [], 'attachments': []} parts['alternatives'].append({'content': 'blablabla', 'headers': {'Content-Type': 'text/plain'}}) -- cgit v1.2.3 From bd8fd4d18c1f43d2a393cb5cf7aea6abb523fd9a Mon Sep 17 00:00:00 2001 From: Alexandre Pretto Nunes Date: Wed, 3 Dec 2014 15:43:25 -0200 Subject: #135 fix python unit tests --- service/test/unit/adapter/mail_test.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'service/test') diff --git a/service/test/unit/adapter/mail_test.py b/service/test/unit/adapter/mail_test.py index f436bb6c..332fad8a 100644 --- a/service/test/unit/adapter/mail_test.py +++ b/service/test/unit/adapter/mail_test.py @@ -69,10 +69,11 @@ class TestPixelatedMail(unittest.TestCase): self.assertEquals(mail.fdoc.content['flags'], []) def test_as_dict(self): - fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent']) - hdoc.content['headers']['Subject'] = 'The subject' - hdoc.content['headers']['From'] = 'someone@pixelated.org' - hdoc.content['headers']['To'] = 'me@pixelated.org' + headers = {'Subject': 'The subject', + 'From': 'someone@pixelated.org', + 'To': 'me@pixelated.org'} + fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent'], + extra_headers=headers) InputMail.FROM_EMAIL_ADDRESS = 'me@pixelated.org' @@ -104,11 +105,12 @@ class TestPixelatedMail(unittest.TestCase): }}) def test_use_reply_to_address_for_replying(self): - fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent']) - hdoc.content['headers']['Subject'] = 'The subject' - hdoc.content['headers']['From'] = 'someone@pixelated.org' - hdoc.content['headers']['Reply-To'] = 'reply-to-this-address@pixelated.org' - hdoc.content['headers']['To'] = 'me@pixelated.org, \nalice@pixelated.org' + headers = {'Subject': 'The subject', + 'From': 'someone@pixelated.org', + 'Reply-To': 'reply-to-this-address@pixelated.org', + 'To': 'me@pixelated.org, \nalice@pixelated.org'} + fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent'], + extra_headers=headers) InputMail.FROM_EMAIL_ADDRESS = 'me@pixelated.org' @@ -144,10 +146,12 @@ class TestPixelatedMail(unittest.TestCase): self.assertRegexpMatches(mail.body, '([\s\S]*100%){2}') def test_clean_line_breaks_on_address_headers(self): - fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent']) - hdoc.content['headers']['To'] = 'One ,\nTwo , Normal ,\nalone@mail.com' - hdoc.content['headers']['Bcc'] = hdoc.content['headers']['To'] - hdoc.content['headers']['Cc'] = hdoc.content['headers']['To'] + many_recipients = 'One ,\nTwo , Normal ,\nalone@mail.com' + headers = {'Cc': many_recipients, + 'Bcc': many_recipients, + 'To': many_recipients} + fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent'], + extra_headers=headers) mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) -- cgit v1.2.3