diff options
-rw-r--r-- | service/pixelated/adapter/model/mail.py | 40 | ||||
-rw-r--r-- | service/pixelated/adapter/services/mail_service.py | 5 | ||||
-rw-r--r-- | service/pixelated/adapter/soledad/soledad_reader_mixin.py | 4 | ||||
-rw-r--r-- | service/pixelated/config/services.py | 23 | ||||
-rw-r--r-- | service/pixelated/config/site.py | 6 | ||||
-rw-r--r-- | service/test/functional/features/steps/common.py | 5 | ||||
-rw-r--r-- | service/test/functional/features/steps/mail_list.py | 1 | ||||
-rw-r--r-- | service/test/support/integration/app_test_client.py | 2 | ||||
-rw-r--r-- | service/test/unit/adapter/test_mail.py | 70 | ||||
-rw-r--r-- | service/test/unit/adapter/test_mail_service.py | 32 | ||||
-rw-r--r-- | service/test/unit/config/test_site.py | 6 |
11 files changed, 80 insertions, 114 deletions
diff --git a/service/pixelated/adapter/model/mail.py b/service/pixelated/adapter/model/mail.py index 733678db..524ca48d 100644 --- a/service/pixelated/adapter/model/mail.py +++ b/service/pixelated/adapter/model/mail.py @@ -275,14 +275,13 @@ class InputMail(Mail): class PixelatedMail(Mail): @staticmethod - def from_soledad(fdoc, hdoc, bdoc, parts=None, soledad_querier=None): + def from_soledad(fdoc, hdoc, bdoc, parts=None): mail = PixelatedMail() mail.parts = parts mail.boundary = str(uuid4()).replace('-', '') mail.bdoc = bdoc mail.fdoc = fdoc mail.hdoc = hdoc - mail.querier = soledad_querier mail._mime = None return mail @@ -436,46 +435,9 @@ class PixelatedMail(Mail): def flags(self): return self.fdoc.content['flags'] - def save(self): - return self.querier.save_mail(self) - def set_mailbox(self, mailbox_name): self.fdoc.content['mbox'] = mailbox_name - def remove_all_tags(self): - return self.update_tags(set([])) - - @defer.inlineCallbacks - def update_tags(self, tags): - yield self._persist_mail_tags(tags) - defer.returnValue(self.tags) - - @defer.inlineCallbacks - def mark_as_read(self): - if Status.SEEN in self.flags: - defer.returnValue(self) - else: - self.flags.append(Status.SEEN) - yield self.save() - defer.returnValue(self) - - @defer.inlineCallbacks - def mark_as_unread(self): - if Status.SEEN in self.flags: - self.flags.remove(Status.SEEN) - yield self.save() - defer.returnValue(self) - - def mark_as_not_recent(self): - if Status.RECENT in self.flags: - self.flags.remove(Status.RECENT) - self.save() - return self - - def _persist_mail_tags(self, current_tags): - self.fdoc.content['tags'] = json.dumps(list(current_tags)) - return self.save() - def has_tag(self, tag): return tag in self.tags diff --git a/service/pixelated/adapter/services/mail_service.py b/service/pixelated/adapter/services/mail_service.py index ee8e562a..d9cb6517 100644 --- a/service/pixelated/adapter/services/mail_service.py +++ b/service/pixelated/adapter/services/mail_service.py @@ -21,9 +21,8 @@ from pixelated.adapter.services.tag_service import extract_reserved_tags class MailService(object): - def __init__(self, mail_sender, mail_store, soledad_querier, search_engine): + def __init__(self, mail_sender, mail_store, search_engine): self.mail_store = mail_store - self.querier = soledad_querier self.search_engine = search_engine self.mail_sender = mail_sender @@ -52,7 +51,7 @@ class MailService(object): raise ValueError('None of the following words can be used as tags: ' + ' '.join(reserved_words)) new_tags = self._favor_existing_tags_casing(new_tags) mail = yield self.mail(mail_id) - mail.tags |= set(new_tags) + mail.tags = set(new_tags) yield self.mail_store.update_mail(mail) defer.returnValue(mail) diff --git a/service/pixelated/adapter/soledad/soledad_reader_mixin.py b/service/pixelated/adapter/soledad/soledad_reader_mixin.py index 58dd9e8e..e86298dd 100644 --- a/service/pixelated/adapter/soledad/soledad_reader_mixin.py +++ b/service/pixelated/adapter/soledad/soledad_reader_mixin.py @@ -56,7 +56,7 @@ class SoledadReaderMixin(SoledadDbFacadeMixin, object): parts = yield self._extract_parts(hdoc.content) fdocs_hdocs_bdocs_parts.append((fdoc, hdoc, bdoc, parts)) - defer.returnValue([PixelatedMail.from_soledad(*raw_mail, soledad_querier=self) for raw_mail in fdocs_hdocs_bdocs_parts]) + defer.returnValue([PixelatedMail.from_soledad(*raw_mail) for raw_mail in fdocs_hdocs_bdocs_parts]) def mail_exists(self, ident): return self.get_flags_by_chash(ident) @@ -68,7 +68,7 @@ class SoledadReaderMixin(SoledadDbFacadeMixin, object): bdoc = yield self.get_content_by_phash(hdoc.content['body']) parts = yield self._extract_parts(hdoc.content) - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, parts=parts, soledad_querier=self) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, parts=parts) defer.returnValue(mail) @defer.inlineCallbacks diff --git a/service/pixelated/config/services.py b/service/pixelated/config/services.py index 092d3e9a..0a689a4b 100644 --- a/service/pixelated/config/services.py +++ b/service/pixelated/config/services.py @@ -7,6 +7,7 @@ from pixelated.adapter.search import SearchEngine from pixelated.adapter.services.draft_service import DraftService from pixelated.adapter.listeners.mailbox_indexer_listener import listen_all_mailboxes from twisted.internet import defer +from pixelated.adapter.search.index_storage_key import SearchIndexStorageKey class Services(object): @@ -20,9 +21,10 @@ class Services(object): soledad_querier = SoledadQuerier(soledad=leap_session.soledad_session.soledad) + search_index_storage_key = self.setup_search_index_storage_key(leap_session.soledad_session.soledad) yield self.setup_search_engine( leap_home, - soledad_querier) + search_index_storage_key) self.wrap_mail_store_with_indexing_mail_store(leap_session) @@ -36,21 +38,20 @@ class Services(object): self.keymanager = leap_session.nicknym self.draft_service = self.setup_draft_service(leap_session.mail_store) - yield self.post_setup(soledad_querier, leap_session) + yield self.index_all_mails() def wrap_mail_store_with_indexing_mail_store(self, leap_session): leap_session.mail_store = SearchableMailStore(leap_session.mail_store, self.search_engine) @defer.inlineCallbacks - def post_setup(self, soledad_querier, leap_session): - self.search_engine.index_mails( - mails=(yield self.mail_service.all_mails())) - # yield soledad_querier.mark_all_as_not_recent() - # yield soledad_querier.remove_duplicates() + def index_all_mails(self): + all_mails = yield self.mail_service.all_mails() + self.search_engine.index_mails(all_mails) @defer.inlineCallbacks - def setup_search_engine(self, leap_home, soledad_querier): - key = yield soledad_querier.get_index_masterkey() + def setup_search_engine(self, leap_home, search_index_storage_key): + key_unicode = yield search_index_storage_key.get_or_create_key() + key = str(key_unicode) print 'The key len is: %s' % len(key) search_engine = SearchEngine(key, agent_home=leap_home) self.search_engine = search_engine @@ -64,8 +65,10 @@ class Services(object): return MailService( pixelated_mail_sender, leap_session.mail_store, - soledad_querier, search_engine) def setup_draft_service(self, mail_store): return DraftService(mail_store) + + def setup_search_index_storage_key(self, soledad): + return SearchIndexStorageKey(soledad) diff --git a/service/pixelated/config/site.py b/service/pixelated/config/site.py index c6e55102..bd149914 100644 --- a/service/pixelated/config/site.py +++ b/service/pixelated/config/site.py @@ -2,8 +2,12 @@ from twisted.web.server import Site, Request class AddCSPHeaderRequest(Request): + HEADER_VALUES = "default-src 'self'; style-src 'self' 'unsafe-inline'" + def process(self): - self.setHeader("Content-Security-Policy", "default-src 'self'; style-src 'self' 'unsafe-inline'") + self.setHeader("Content-Security-Policy", self.HEADER_VALUES) + self.setHeader("X-Content-Security-Policy", self.HEADER_VALUES) + self.setHeader("X-Webkit-CSP", self.HEADER_VALUES) Request.process(self) diff --git a/service/test/functional/features/steps/common.py b/service/test/functional/features/steps/common.py index af801902..863fb6ca 100644 --- a/service/test/functional/features/steps/common.py +++ b/service/test/functional/features/steps/common.py @@ -45,11 +45,6 @@ def wait_for_user_alert_to_disapear(context, timeout=TIMEOUT_IN_S): wait_until_element_is_invisible_by_locator(context, (By.ID, 'user-alerts'), timeout) -def wait_for_user_alert_to_appear_and_disapear(context, timeout=TIMEOUT_IN_S): - wait_until_element_is_visible_by_locator(context, (By.ID, LOADING), timeout) - wait_until_element_is_invisible_by_locator(context, (By.ID, LOADING), timeout) - - def wait_until_elements_are_visible_by_locator(context, locator_tuple, timeout=TIMEOUT_IN_S): spend_time_in_reactor() wait = WebDriverWait(context.browser, timeout) diff --git a/service/test/functional/features/steps/mail_list.py b/service/test/functional/features/steps/mail_list.py index ff7acaf4..9b7bdb4a 100644 --- a/service/test/functional/features/steps/mail_list.py +++ b/service/test/functional/features/steps/mail_list.py @@ -102,7 +102,6 @@ def impl(context): context.current_mail_id = last_email().get_attribute('id') last_email().find_element_by_tag_name('input').click() find_element_by_id(context, 'delete-selected').click() - wait_for_user_alert_to_appear_and_disapear(context) wait_for_user_alert_to_disapear(context) spend_time_in_reactor() assert 0 == len(context.browser.find_element_by_id('mail-list').find_elements_by_tag_name('li')) diff --git a/service/test/support/integration/app_test_client.py b/service/test/support/integration/app_test_client.py index e44a8c10..089b62d7 100644 --- a/service/test/support/integration/app_test_client.py +++ b/service/test/support/integration/app_test_client.py @@ -175,7 +175,7 @@ class AppTestClient(object): return mail_sender def _create_mail_service(self, mail_sender, mail_store, soledad_querier, search_engine): - mail_service = MailService(mail_sender, mail_store, soledad_querier, search_engine) + mail_service = MailService(mail_sender, mail_store, search_engine) return mail_service def _generate_soledad_test_folder_name(self, soledad_test_folder='/tmp/soledad-test/test'): diff --git a/service/test/unit/adapter/test_mail.py b/service/test/unit/adapter/test_mail.py index 03a37c1f..0c81bda0 100644 --- a/service/test/unit/adapter/test_mail.py +++ b/service/test/unit/adapter/test_mail.py @@ -43,7 +43,7 @@ class TestPixelatedMail(unittest.TestCase): leap_mail = test_helper.leap_mail(headers={'date': leap_mail_date}) - mail = PixelatedMail.from_soledad(*leap_mail, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(*leap_mail) self.assertEqual(str(mail.headers['Date']), leap_mail_date_in_iso_format) @@ -54,7 +54,7 @@ class TestPixelatedMail(unittest.TestCase): leap_mail = test_helper.leap_mail(headers={'received': leap_mail_received_header}) - mail = PixelatedMail.from_soledad(*leap_mail, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(*leap_mail) self.assertEqual(str(mail.headers['Date']), leap_mail_date_in_iso_format) @@ -65,7 +65,7 @@ class TestPixelatedMail(unittest.TestCase): fdoc, hdoc, bdoc = test_helper.leap_mail() del hdoc.content['date'] - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc) self.assertEqual(str(mail.headers['Date']), leap_mail_date_in_iso_format) @@ -76,7 +76,7 @@ class TestPixelatedMail(unittest.TestCase): when(pixelated.support.date).iso_now().thenReturn(date_expected) leap_mail = test_helper.leap_mail(headers={'date': leap_mail_date}) - mail = PixelatedMail.from_soledad(*leap_mail, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(*leap_mail) self.assertEqual(str(mail.headers['Date']), date_expected) @@ -87,32 +87,10 @@ class TestPixelatedMail(unittest.TestCase): when(pixelated.support.date).iso_now().thenReturn(date_expected) leap_mail = test_helper.leap_mail(headers={'received': leap_mail_received_header}) - mail = PixelatedMail.from_soledad(*leap_mail, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(*leap_mail) self.assertEqual(mail.headers['Date'], date_expected) - @defer.inlineCallbacks - def test_update_tags_return_a_set_with_the_current_tags(self): - soledad_docs = test_helper.leap_mail(extra_headers={'X-tags': '["custom_1", "custom_2"]'}) - pixelated_mail = PixelatedMail.from_soledad(*soledad_docs, soledad_querier=self.querier) - - current_tags = yield pixelated_mail.update_tags({'custom_1', 'custom_3'}) - self.assertEquals({'custom_3', 'custom_1'}, current_tags) - - def test_mark_as_read(self): - mail = PixelatedMail.from_soledad(*test_helper.leap_mail(flags=[]), soledad_querier=self.querier) - - mail.mark_as_read() - - self.assertEquals(mail.fdoc.content['flags'], ['\\Seen']) - - def test_mark_as_not_recent(self): - mail = PixelatedMail.from_soledad(*test_helper.leap_mail(flags=['\\Recent']), soledad_querier=self.querier) - - mail.mark_as_not_recent() - - self.assertEquals(mail.fdoc.content['flags'], []) - def test_get_for_save_adds_from(self): InputMail.FROM_EMAIL_ADDRESS = 'me@pixelated.org' headers = {'Subject': 'The subject', @@ -133,7 +111,7 @@ class TestPixelatedMail(unittest.TestCase): InputMail.FROM_EMAIL_ADDRESS = 'me@pixelated.org' - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc) _dict = mail.as_dict() @@ -173,7 +151,7 @@ class TestPixelatedMail(unittest.TestCase): InputMail.FROM_EMAIL_ADDRESS = 'me@pixelated.org' - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc) _dict = mail.as_dict() @@ -188,7 +166,7 @@ class TestPixelatedMail(unittest.TestCase): parts['alternatives'].append({'content': 'blablabla', 'headers': {'Content-Type': 'text/plain'}}) parts['alternatives'].append({'content': '<p>blablabla</p>', 'headers': {'Content-Type': 'text/html'}}) - mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='blablabla'), parts=parts, soledad_querier=None) + mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='blablabla'), parts=parts) self.assertRegexpMatches(mail.html_body, '^<p>blablabla</p>$') self.assertRegexpMatches(mail.text_plain_body, '^blablabla$') @@ -200,7 +178,7 @@ class TestPixelatedMail(unittest.TestCase): {'content': u'content', 'headers': {u'Content-Type': u'text/plain; charset=us-ascii'}}, {'content': u'', 'headers': {u'Some info': u'info'}}]} - mail = PixelatedMail.from_soledad(None, None, None, parts=parts, soledad_querier=None) + mail = PixelatedMail.from_soledad(None, None, None, parts=parts) self.assertIsNone(mail.html_body) def test_percent_character_is_allowed_on_body(self): @@ -208,7 +186,7 @@ class TestPixelatedMail(unittest.TestCase): parts['alternatives'].append({'content': '100% happy with percentage symbol', 'headers': {'Content-Type': 'text/plain'}}) parts['alternatives'].append({'content': '<p>100% happy with percentage symbol</p>', 'headers': {'Content-Type': 'text/html'}}) - mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw="100% happy with percentage symbol"), parts=parts, soledad_querier=None) + mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw="100% happy with percentage symbol"), parts=parts) self.assertRegexpMatches(mail.text_plain_body, '([\s\S]*100%)') self.assertRegexpMatches(mail.html_body, '([\s\S]*100%)') @@ -218,7 +196,7 @@ class TestPixelatedMail(unittest.TestCase): html_headers = {'Content-Type': 'text/html; charset=utf-8', 'Content-Transfer-Encoding': 'quoted-printable'} parts = {'alternatives': [{'content': 'H=E4llo', 'headers': plain_headers}, {'content': '<p>H=C3=A4llo</p>', 'headers': html_headers}]} - mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts, soledad_querier=None) + mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts) self.assertEqual(2, len(mail.alternatives)) self.assertEquals(u'H\xe4llo', mail.text_plain_body) @@ -229,7 +207,7 @@ class TestPixelatedMail(unittest.TestCase): html_headers = {'Content-Type': 'text/html;\ncharset=utf-8', 'Content-Transfer-Encoding': 'quoted-printable'} parts = {'alternatives': [{'content': 'H=E4llo', 'headers': plain_headers}, {'content': '<p>H=C3=A4llo</p>', 'headers': html_headers}]} - mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts, soledad_querier=None) + mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts) self.assertEqual(2, len(mail.alternatives)) self.assertEquals(u'H\xe4llo', mail.text_plain_body) @@ -240,7 +218,7 @@ class TestPixelatedMail(unittest.TestCase): html_headers = {'Content-Type': 'text/html;\ncharset=utf-8', 'Content-Transfer-Encoding': 'quoted-printable'} parts = {'alternatives': [{'content': 'H=E4llo', 'headers': plain_headers}, {'content': '<p>H=C3=A4llo</p>', 'headers': html_headers}]} - mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts, soledad_querier=None) + mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts) self.assertEquals(u'H=E4llo', mail.text_plain_body) @@ -249,7 +227,7 @@ class TestPixelatedMail(unittest.TestCase): html_headers = {'Content-Type': 'text/html;\ncharset=utf-8', 'Content-Transfer-Encoding': 'quoted-printable'} parts = {'alternatives': [{'content': 'H=E4llo', 'headers': plain_headers}, {'content': '<p>H=C3=A4llo</p>', 'headers': html_headers}]} - mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts, soledad_querier=None) + mail = PixelatedMail.from_soledad(None, None, self._create_bdoc(raw='some raw body'), parts=parts) self.assertEquals(u'H=E4llo', mail.text_plain_body) self.assertEquals(u'<p>H\xe4llo</p>', mail.html_body) @@ -262,7 +240,7 @@ class TestPixelatedMail(unittest.TestCase): fdoc, hdoc, bdoc = test_helper.leap_mail(flags=['\\Recent'], extra_headers=headers) - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc) for header_label in ['To', 'Cc', 'Bcc']: for address in mail.headers[header_label]: @@ -277,7 +255,7 @@ class TestPixelatedMail(unittest.TestCase): fdoc, hdoc, bdoc = test_helper.leap_mail() parts = {'alternatives': []} parts['alternatives'].append({'content': encoded_body, 'headers': {'Content-Transfer-Encoding': 'base64'}}) - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier, parts=parts) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, parts=parts) self.assertEquals(body, mail.text_plain_body) @@ -288,7 +266,7 @@ class TestPixelatedMail(unittest.TestCase): fdoc, hdoc, bdoc = test_helper.leap_mail() parts = {'alternatives': []} parts['alternatives'].append({'content': encoded_body, 'headers': {'Content-Transfer-Encoding': '7bit'}}) - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier, parts=parts) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, parts=parts) self.assertEquals(body, mail.text_plain_body) @@ -299,7 +277,7 @@ class TestPixelatedMail(unittest.TestCase): fdoc, hdoc, bdoc = test_helper.leap_mail() parts = {'alternatives': []} parts['alternatives'].append({'content': encoded_body, 'headers': {'Content-Transfer-Encoding': '8bit'}}) - mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self.querier, parts=parts) + mail = PixelatedMail.from_soledad(fdoc, hdoc, bdoc, parts=parts) self.assertEquals(body, mail.text_plain_body) @@ -310,10 +288,10 @@ class TestPixelatedMail(unittest.TestCase): bounced_leap_mail = test_helper.leap_mail() bounced_leap_mail[1].content = hdoc - bounced_mail = PixelatedMail.from_soledad(*bounced_leap_mail, soledad_querier=self.querier) + bounced_mail = PixelatedMail.from_soledad(*bounced_leap_mail) not_bounced_leap_mail = test_helper.leap_mail() - not_bounced_mail = PixelatedMail.from_soledad(*not_bounced_leap_mail, soledad_querier=self.querier) + not_bounced_mail = PixelatedMail.from_soledad(*not_bounced_leap_mail) self.assertTrue(bounced_mail.bounced) self.assertIn('this_mail_was_bounced@domain.com', bounced_mail.bounced) @@ -334,10 +312,10 @@ class TestPixelatedMail(unittest.TestCase): temporary_bounced_leap_mail = test_helper.leap_mail() temporary_bounced_leap_mail[1].content = hdoc - temporary_bounced_mail = PixelatedMail.from_soledad(*temporary_bounced_leap_mail, soledad_querier=self.querier) + temporary_bounced_mail = PixelatedMail.from_soledad(*temporary_bounced_leap_mail) not_bounced_leap_mail = test_helper.leap_mail() - not_bounced_mail = PixelatedMail.from_soledad(*not_bounced_leap_mail, soledad_querier=self.querier) + not_bounced_mail = PixelatedMail.from_soledad(*not_bounced_leap_mail) self.assertFalse(temporary_bounced_mail.bounced) self.assertFalse(not_bounced_mail.bounced) @@ -369,7 +347,7 @@ class TestPixelatedMail(unittest.TestCase): leap_mail = test_helper.leap_mail(extra_headers={'Subject': subject, 'From': email_from, 'To': email_to, 'Cc': email_cc, 'Bcc': email_bcc}) - mail = PixelatedMail.from_soledad(*leap_mail, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(*leap_mail) self.assertEqual(str(mail.headers['Subject']), 'test encoding St\xc3\xa4ch') self.assertEqual(str(mail.headers['From']), 'St\xc3\xa4ch <stach@pixelated-project.org>') @@ -385,7 +363,7 @@ class TestPixelatedMail(unittest.TestCase): leap_mail = test_helper.leap_mail(extra_headers={'From': leap_mail_from, 'Subject': "some subject", 'To': leap_mail_to}) - mail = PixelatedMail.from_soledad(*leap_mail, soledad_querier=self.querier) + mail = PixelatedMail.from_soledad(*leap_mail) mail.headers['From'].encode('ascii') self.assertEqual(mail.headers['To'], ['"sme mluds" <lisa5@dev.pixelated-project.org>', '"sme mluds" <lisa5@dev.pixelated-project.org>']) diff --git a/service/test/unit/adapter/test_mail_service.py b/service/test/unit/adapter/test_mail_service.py index 30784769..5c035fc8 100644 --- a/service/test/unit/adapter/test_mail_service.py +++ b/service/test/unit/adapter/test_mail_service.py @@ -27,7 +27,6 @@ from twisted.internet import defer class TestMailService(unittest.TestCase): def setUp(self): self.drafts = mock() - self.querier = mock() self.mail_store = mock() self.mailboxes = mock() @@ -38,7 +37,7 @@ class TestMailService(unittest.TestCase): self.mail_sender = mock() self.search_engine = mock() - self.mail_service = MailService(self.mail_sender, self.mail_store, self.querier, self.search_engine) + self.mail_service = MailService(self.mail_sender, self.mail_store, self.search_engine) def tearDown(self): unstub() @@ -105,14 +104,26 @@ class TestMailService(unittest.TestCase): @defer.inlineCallbacks def test_mark_as_read(self): - mail = LeapMail('id', 'INBOX') - when(self.mail_store).get_mail(ANY(), include_body=True).thenReturn(mail) + mail = LeapMail(1, 'INBOX') + when(self.mail_store).get_mail(1, include_body=True).thenReturn(mail) yield self.mail_service.mark_as_read(1) self.assertIn(Status.SEEN, mail.flags) verify(self.mail_store).update_mail(mail) @defer.inlineCallbacks + def test_mark_as_unread(self): + mail = LeapMail(1, 'INBOX') + mail.flags.add(Status.SEEN) + + when(self.mail_store).get_mail(1, include_body=True).thenReturn(mail) + yield self.mail_service.mark_as_unread(1) + + verify(self.mail_store).update_mail(mail) + + self.assertNotEqual(mail.status, Status.SEEN) + + @defer.inlineCallbacks def test_delete_mail(self): mail_to_delete = LeapMail(1, 'INBOX') when(self.mail_store).get_mail(1, include_body=True).thenReturn(defer.succeed(mail_to_delete)) @@ -123,7 +134,7 @@ class TestMailService(unittest.TestCase): @defer.inlineCallbacks def test_recover_mail(self): - mail_to_recover = PixelatedMail.from_soledad(*leap_mail(), soledad_querier=None) + mail_to_recover = PixelatedMail.from_soledad(*leap_mail()) when(self.mail_service).mail(1).thenReturn(mail_to_recover) when(self.mail_store).move_mail_to_mailbox(1, 'INBOX').thenReturn(mail_to_recover) @@ -139,3 +150,14 @@ class TestMailService(unittest.TestCase): attachment = yield self.mail_service.attachment('some attachment id') self.assertEqual(attachment_dict, attachment) + + @defer.inlineCallbacks + def test_update_tags_return_a_set_with_the_current_tags(self): + mail = LeapMail(1, 'INBOX', tags={'custom_1', 'custom_2'}) + when(self.mail_store).get_mail(1, include_body=True).thenReturn(mail) + when(self.search_engine).tags(query='', skip_default_tags=True).thenReturn([]) + + updated_mail = yield self.mail_service.update_tags(1, {'custom_1', 'custom_3'}) + + verify(self.mail_store).update_mail(mail) + self.assertEqual({'custom_1', 'custom_3'}, updated_mail.tags) diff --git a/service/test/unit/config/test_site.py b/service/test/unit/config/test_site.py index 77d42ed8..1858bfaf 100644 --- a/service/test/unit/config/test_site.py +++ b/service/test/unit/config/test_site.py @@ -9,7 +9,11 @@ class TestPixelatedSite(unittest.TestCase): request = self.create_request() request.process() headers = request.headers - self.assertEqual(headers.get("Content-Security-Policy"), "default-src 'self'; style-src 'self' 'unsafe-inline'") + + header_value = "default-src 'self'; style-src 'self' 'unsafe-inline'" + self.assertEqual(headers.get("Content-Security-Policy"), header_value) + self.assertEqual(headers.get("X-Content-Security-Policy"), header_value) + self.assertEqual(headers.get("X-Webkit-CSP"), header_value) def create_request(self): channel = LineReceiver() |