From 33ac29beffa23c844900ae0b8f189e955bbde9d2 Mon Sep 17 00:00:00 2001 From: Jefferson Stachelski Date: Tue, 20 Oct 2015 21:08:29 -0200 Subject: Refactored the welcome mail logic and add a test --- service/pixelated/application.py | 18 +------ service/pixelated/config/leap.py | 49 ++++++++++++------ service/test/integration/test_welcome_mail.py | 43 ---------------- service/test/unit/test_welcome_mail.py | 73 +++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 76 deletions(-) delete mode 100644 service/test/integration/test_welcome_mail.py create mode 100644 service/test/unit/test_welcome_mail.py (limited to 'service') diff --git a/service/pixelated/application.py b/service/pixelated/application.py index 51763fa2..dfeb8d82 100644 --- a/service/pixelated/application.py +++ b/service/pixelated/application.py @@ -19,13 +19,10 @@ from twisted.internet import defer from twisted.internet import ssl from OpenSSL import SSL from OpenSSL import crypto -from email import message_from_file -import os -from pixelated.adapter.model.mail import InputMail from pixelated.config import arguments from pixelated.config.services import Services -from pixelated.config.leap import initialize_leap, CREATE_WELCOME_MAIL +from pixelated.config.leap import initialize_leap from pixelated.config import logger from pixelated.config.site import PixelatedSite from pixelated.resources.loading_page import LoadingResource @@ -77,18 +74,6 @@ def _ssl_options(sslkey, sslcert): return options -def welcome_mail(leap_session): - if CREATE_WELCOME_MAIL(): - current_path = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(current_path, 'assets', 'welcome.mail')) as mail_template_file: - mail_template = message_from_file(mail_template_file) - - input_mail = InputMail.from_python_mail(mail_template) - - leap_session.mail_store.add_mail('INBOX', input_mail.raw) - return leap_session - - def initialize(): args = arguments.parse_user_agent_args() logger.init(debug=args.debug) @@ -100,7 +85,6 @@ def initialize(): args.organization_mode, args.leap_home) - deferred.addCallback(welcome_mail) deferred.addCallback( lambda leap_session: start_user_agent( loading_app, diff --git a/service/pixelated/config/leap.py b/service/pixelated/config/leap.py index 83b913a8..0409e54f 100644 --- a/service/pixelated/config/leap.py +++ b/service/pixelated/config/leap.py @@ -1,18 +1,19 @@ from __future__ import absolute_import +from leap.common.events import (server as events_server, + register, catalog as events) +from email import message_from_file from pixelated.config import credentials -from leap.common.events import server as events_server, register, catalog as events from pixelated.bitmask_libraries.config import LeapConfig from pixelated.bitmask_libraries.certs import LeapCertificate from pixelated.bitmask_libraries.provider import LeapProvider from pixelated.bitmask_libraries.session import LeapSessionFactory +from pixelated.adapter.model.mail import InputMail from twisted.internet import defer +import os +import logging -_CREATE_WELCOME_MAIL = False - - -def CREATE_WELCOME_MAIL(): - return _CREATE_WELCOME_MAIL +fresh_account = False @defer.inlineCallbacks @@ -24,9 +25,12 @@ def initialize_leap(leap_provider_cert, initial_sync=True): init_monkeypatches() events_server.ensure_server() - check_new_account() - provider, username, password = credentials.read(organization_mode, credentials_file) - LeapCertificate.set_cert_and_fingerprint(leap_provider_cert, leap_provider_cert_fingerprint) + register(events.KEYMANAGER_FINISHED_KEY_GENERATION, + set_fresh_account) + provider, username, password = credentials.read(organization_mode, + credentials_file) + LeapCertificate.set_cert_and_fingerprint(leap_provider_cert, + leap_provider_cert_fingerprint) config = LeapConfig(leap_home=leap_home, start_background_jobs=True) provider = LeapProvider(provider, config) @@ -36,17 +40,30 @@ def initialize_leap(leap_provider_cert, if initial_sync: leap_session = yield leap_session.initial_sync() + global fresh_account + if fresh_account: + add_welcome_mail(leap_session.mail_store) + defer.returnValue(leap_session) -def init_monkeypatches(): - import pixelated.extensions.requests_urllib3 +def add_welcome_mail(mail_store): + current_path = os.path.dirname(os.path.abspath(__file__)) + with open(os.path.join(current_path, + '..', + 'assets', + 'welcome.mail')) as mail_template_file: + mail_template = message_from_file(mail_template_file) + + input_mail = InputMail.from_python_mail(mail_template) + logging.getLogger('pixelated.config.leap').info('Adding the welcome mail') + mail_store.add_mail('INBOX', input_mail.raw) -def mark_to_create_welcome_mail(_, x): - global _CREATE_WELCOME_MAIL - _CREATE_WELCOME_MAIL = True +def init_monkeypatches(): + import pixelated.extensions.requests_urllib3 -def check_new_account(): - register(events.KEYMANAGER_FINISHED_KEY_GENERATION, mark_to_create_welcome_mail) +def set_fresh_account(_, x): + global fresh_account + fresh_account = True diff --git a/service/test/integration/test_welcome_mail.py b/service/test/integration/test_welcome_mail.py deleted file mode 100644 index dfd106dc..00000000 --- a/service/test/integration/test_welcome_mail.py +++ /dev/null @@ -1,43 +0,0 @@ -# -# 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 . - -from test.support.integration import SoledadTestBase -from twisted.internet import defer -from pixelated.adapter.model.mail import welcome_mail - - -class TestWelcomeMail(SoledadTestBase): - - @defer.inlineCallbacks - def _test_welcome_mail_is_added_only_once(self): - yield self._add_welcome_mail() - # yield self._add_welcome_mail() # TODO: verificar o pq de add 2 mails quando chamado 3 vezes - # yield self._add_welcome_mail() - inbox_mails = yield self.get_mails_by_mailbox_name('INBOX') - self.assertEquals(1, len(inbox_mails)) - - def _add_welcome_mail(self): - mail = welcome_mail() - self.add_mail_to_inbox(mail) - - @defer.inlineCallbacks - def _test_empty_mailbox_doesnt_mean_fresh_mailbox(self): - yield self.mailboxes.add_welcome_mail_for_fresh_user() - inbox_mails = yield self.get_mails_by_tag('inbox') - yield self.delete_mail(inbox_mails[0].ident) - yield self.mailboxes.add_welcome_mail_for_fresh_user() - inbox_mails = yield self.get_mails_by_tag('inbox') - self.assertEquals(0, len(inbox_mails)) diff --git a/service/test/unit/test_welcome_mail.py b/service/test/unit/test_welcome_mail.py new file mode 100644 index 00000000..7e9ab0c9 --- /dev/null +++ b/service/test/unit/test_welcome_mail.py @@ -0,0 +1,73 @@ +# +# 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 os +import unittest +from mockito import verify, mock +from mockito.matchers import Matcher +from email import message_from_file +from pixelated.config.leap import add_welcome_mail +from pixelated.adapter.model.mail import InputMail + + +class TestWelcomeMail(unittest.TestCase): + + def test_add_welcome_mail(self): + mail_store = mock() + input_mail = self._get_welcome_mail() + + add_welcome_mail(mail_store) + capture = WelcomeMailCapture() + + verify(mail_store).add_mail('INBOX', capture) + capture.assert_mail(input_mail.raw) + + def _get_welcome_mail(self): + current_path = os.path.dirname(os.path.abspath(__file__)) + with open(os.path.join(current_path, + '..', + '..', + 'pixelated', + 'assets', + 'welcome.mail')) as mail_template_file: + mail_template = message_from_file(mail_template_file) + + return InputMail.from_python_mail(mail_template) + + +class WelcomeMailCapture(Matcher): + + def matches(self, arg): + self.value = arg + return True + + def assert_mail(self, mail): + captured_mail = self._format(self.value) + expected_mail = self._format(mail) + assert captured_mail == expected_mail + + def _format(self, mail): + splitter = '\n' + arr = mail.split(splitter) + arr = self._remove_variable_value(arr) + + return splitter.join(arr) + + def _remove_variable_value(self, arr): + arr.pop(0) + arr.pop(6) + arr.pop(44) + return arr -- cgit v1.2.3