From 3863e28bf593591b1b323f8b848233b9e6a1947b Mon Sep 17 00:00:00 2001 From: Folker Bernitt Date: Wed, 14 Oct 2015 14:35:16 +0200 Subject: Support reply to mail sent by me - Issue #491 --- .../pixelated/adapter/mailstore/leap_mailstore.py | 15 +++++++-- .../test/unit/adapter/mailstore/test_leap_mail.py | 38 +++++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/service/pixelated/adapter/mailstore/leap_mailstore.py b/service/pixelated/adapter/mailstore/leap_mailstore.py index f3351dbd..ec8407a7 100644 --- a/service/pixelated/adapter/mailstore/leap_mailstore.py +++ b/service/pixelated/adapter/mailstore/leap_mailstore.py @@ -147,15 +147,26 @@ class LeapMail(Mail): sender_mail = InputMail.FROM_EMAIL_ADDRESS recipients = self._decoded_header_utf_8(self._reply_recipient('To')) - recipients.append(sender_mail) + if not self._parsed_mail_matches(sender_mail, InputMail.FROM_EMAIL_ADDRESS) or len(recipients) == 0: + recipients.append(sender_mail) recipients = self.remove_duplicates(recipients) ccs = self._decoded_header_utf_8(self._reply_recipient('Cc')) - result['single'] = sender_mail + result['single'] = self._single_reply_recipient(recipients, sender_mail) result['all']['to-field'] = recipients result['all']['cc-field'] = ccs return result + def _single_reply_recipient(self, recipients, sender_mail): + """ + Currently the domain model expects only one single recipient for reply action. But it should support an array, + or even better: there should not be any conceptual difference between reply and reply all for this logic + """ + if self._parsed_mail_matches(sender_mail, InputMail.FROM_EMAIL_ADDRESS): + return recipients[0] + else: + return sender_mail + def remove_duplicates(self, recipients): return list(set(recipients)) diff --git a/service/test/unit/adapter/mailstore/test_leap_mail.py b/service/test/unit/adapter/mailstore/test_leap_mail.py index 224d1e1e..ef585654 100644 --- a/service/test/unit/adapter/mailstore/test_leap_mail.py +++ b/service/test/unit/adapter/mailstore/test_leap_mail.py @@ -116,7 +116,7 @@ class TestLeapMail(TestCase): self.assertEqual([expected_address], mail.as_dict()['replying']['all']['cc-field']) self.assertEqual(expected_address, mail.as_dict()['replying']['single']) - def test_reply_result_does_not_contain_own_address_in_to_with_spaces(self): + def test_reply_all_result_does_not_contain_own_address_in_to_with_spaces(self): my_address = 'myaddress@example.test' with patch('pixelated.adapter.mailstore.leap_mailstore.InputMail.FROM_EMAIL_ADDRESS', my_address): @@ -126,7 +126,7 @@ class TestLeapMail(TestCase): self.assertEqual(['receiver@example.test', 'test@example.test'], mail.as_dict()['replying']['all']['to-field']) - def test_reply_result_does_not_contain_own_address_in_to_with_name(self): + def test_reply_all_result_does_not_contain_own_address_in_to_with_name(self): my_address = 'myaddress@example.test' with patch('pixelated.adapter.mailstore.leap_mailstore.InputMail.FROM_EMAIL_ADDRESS', my_address): @@ -136,7 +136,7 @@ class TestLeapMail(TestCase): self.assertEqual(['receiver@example.test', 'test@example.test'], mail.as_dict()['replying']['all']['to-field']) - def test_reply_result_does_not_contain_own_address_in_to_with_encoded(self): + def test_reply_all_result_does_not_contain_own_address_in_to_with_encoded(self): my_address = 'myaddress@example.test' with patch('pixelated.adapter.mailstore.leap_mailstore.InputMail.FROM_EMAIL_ADDRESS', my_address): @@ -146,7 +146,7 @@ class TestLeapMail(TestCase): self.assertEqual(['receiver@example.test', 'test@example.test'], mail.as_dict()['replying']['all']['to-field']) - def test_reply_result_does_not_contain_own_address_in_cc(self): + def test_reply_all_result_does_not_contain_own_address_in_cc(self): my_address = 'myaddress@example.test' with patch('pixelated.adapter.mailstore.leap_mailstore.InputMail.FROM_EMAIL_ADDRESS', my_address): @@ -157,6 +157,36 @@ class TestLeapMail(TestCase): self.assertEqual([], mail.as_dict()['replying']['all']['cc-field']) + def test_reply_all_result_does_not_contain_own_address_if_sender(self): + my_address = 'myaddress@example.test' + + with patch('pixelated.adapter.mailstore.leap_mailstore.InputMail.FROM_EMAIL_ADDRESS', my_address): + mail = LeapMail('', 'INBOX', + {'From': 'myaddress@example.test', + 'To': 'receiver@example.test'}) + + self.assertEqual(['receiver@example.test'], mail.as_dict()['replying']['all']['to-field']) + + def test_reply_all_result_does_contain_own_address_if_only_recipient(self): + my_address = 'myaddress@example.test' + + with patch('pixelated.adapter.mailstore.leap_mailstore.InputMail.FROM_EMAIL_ADDRESS', my_address): + mail = LeapMail('', 'INBOX', + {'From': 'myaddress@example.test', + 'To': 'myaddress@example.test'}) + + self.assertEqual(['myaddress@example.test'], mail.as_dict()['replying']['all']['to-field']) + + def test_reply_result_swaps_sender_and_recipient_if_i_am_the_sender(self): + my_address = 'myaddress@example.test' + + with patch('pixelated.adapter.mailstore.leap_mailstore.InputMail.FROM_EMAIL_ADDRESS', my_address): + mail = LeapMail('', 'INBOX', + {'From': 'myaddress@example.test', + 'To': 'recipient@example.test'}) + + self.assertEqual('recipient@example.test', mail.as_dict()['replying']['single']) + def test_as_dict_with_mixed_encodings(self): subject = 'Another test with =?iso-8859-1?B?3G1s5Px0?= =?iso-8859-1?Q?s?=' mail = LeapMail('', 'INBOX', -- cgit v1.2.3