Example #1
0
 def test_unit__get_auth_headers__ok__nominal_test(self):
     mf = MailFetcher(
         host="host_imap",
         port="993",
         use_ssl=True,
         password="******",
         folder="INBOX",
         use_idle=True,
         use_html_parsing=True,
         use_txt_parsing=True,
         lockfile_path="email_fetcher.lock",
         api_base_url="http://127.0.0.1:6543/api",
         burst=True,
         api_key="apikey",
         reply_to_pattern="",
         references_pattern="",
         connection_max_lifetime=60,
         heartbeat=60,
         user="******",
     )
     headers = mf._get_auth_headers("*****@*****.**")
     assert "Tracim-Api-Key" in headers
     assert "Tracim-Api-Login" in headers
     assert headers["Tracim-Api-Key"] == "apikey"
     assert headers["Tracim-Api-Login"] == "*****@*****.**"
Example #2
0
    def test_unit___get_content_info__err_403__no_right_to_see(self):
        content_json = {"code": None, "details": {"error_detail": {}}, "message": "more info..."}

        responses.add(
            responses.GET, "http://127.0.0.1:6543/api/contents/1", json=content_json, status=403
        )
        mf = MailFetcher(
            host="host_imap",
            port="993",
            use_ssl=True,
            password="******",
            folder="INBOX",
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path="email_fetcher.lock",
            api_base_url="http://127.0.0.1:6543/api/",
            burst=True,
            api_key="apikey",
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern="",
            references_pattern="",
            user="******",
        )
        auth_headers = {"Tracim-Api-Key": "apikey", "Tracim-Api-Login": "******"}
        mock = Mock()
        mock.return_value = auth_headers
        mf._get_auth_headers = mock

        with pytest.raises(BadStatusCode):
            mf._get_content_info(1, user_email="*****@*****.**")
Example #3
0
 def test_unit__get_auth_headers__ok__nominal_test(self):
     mf = MailFetcher(
         host='host_imap',
         port='993',
         use_ssl=True,
         password='******',
         folder='INBOX',
         use_idle=True,
         use_html_parsing=True,
         use_txt_parsing=True,
         lockfile_path='email_fetcher.lock',
         api_base_url='http://127.0.0.1:6543/api',
         burst=True,
         api_key='apikey',
         reply_to_pattern='',
         references_pattern='',
         connection_max_lifetime=60,
         heartbeat=60,
         user='******',
     )
     headers = mf._get_auth_headers('*****@*****.**')
     assert 'Tracim-Api-Key' in headers
     assert 'Tracim-Api-Login' in headers
     assert headers['Tracim-Api-Key'] == 'apikey'
     assert headers['Tracim-Api-Login'] == '*****@*****.**'
Example #4
0
    def test_unit__create_comment_request__ok__nominal_test(self):
        mail = Mock()
        mail.get_body.return_value = "CONTENT"
        mail.get_key.return_value = "1"
        mail.get_from_address.return_value = "*****@*****.**"

        content_info = {
            "author": {
                "avatar_url": None,
                "public_name": "Global manager",
                "user_id": 1
            },
            "content_id": 1,
            "content_type": "thread",
            "created": "2018-08-24T15:00:08Z",
            "current_revision_id": 29,
            "is_archived": False,
            "is_deleted": False,
            "label": "coucou",
            "last_modifier": {
                "avatar_url": None,
                "public_name": "Global manager",
                "user_id": 1
            },
            "modified": "2018-08-24T15:00:08Z",
            "parent_id": None,
            "raw_content": "",
            "show_in_ui": True,
            "slug": "coucou",
            "status": "open",
            "sub_content_types": ["comment"],
            "workspace_id": 4,
        }

        mf = MailFetcher(
            host="host_imap",
            port="993",
            use_ssl=True,
            password="******",
            folder="INBOX",
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path="email_fetcher.lock",
            api_base_url="http://127.0.0.1:6543/api/",
            burst=True,
            api_key="apikey",
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern="",
            references_pattern="",
            user="******",
        )
        mf._get_content_info = Mock()
        mf._get_content_info.return_value = content_info
        method, endpoint, body = mf._create_comment_request(mail)
        assert method == "POST"
        assert endpoint == "http://127.0.0.1:6543/api/workspaces/4/contents/1/comments"
        assert body == {"raw_content": "CONTENT"}
Example #5
0
    def test_unit__send_request__ok__nominal_case(self):
        content_json = {
            "author": {
                "avatar_url": None,
                "public_name": "John Doe",
                "user_id": 3
            },
            "content_id": 2,
            "created": "2018-08-27T12:12:23.807Z",
            "parent_id": 1,
            "raw_content": "<p>This is just an html comment !</p>",
        }
        responses.add(
            responses.POST,
            "http://127.0.0.1:6543/api/workspaces/4/contents/1/comments",
            status=200,
            json=content_json,
        )
        mf = MailFetcher(
            host="host_imap",
            port="993",
            use_ssl=True,
            password="******",
            folder="INBOX",
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path="email_fetcher.lock",
            api_base_url="http://127.0.0.1:6543/api/",
            burst=True,
            api_key="apikey",
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern="",
            references_pattern="",
            user="******",
        )
        imapc_mock = MagicMock()
        imapc_mock_add_flags = MagicMock()
        imapc_mock.add_flags = imapc_mock_add_flags
        email_mock = MagicMock()
        auth_headers = {
            "Tracim-Api-Key": "apikey",
            "Tracim-Api-Login": "******"
        }
        header_mock = Mock()
        header_mock.return_value = auth_headers
        mf._get_auth_headers = header_mock
        mf._send_request(
            endpoint=
            "http://127.0.0.1:6543/api/workspaces/4/contents/1/comments",
            json_body_dict={"raw_content": "CONTENT"},
            method="POST",
            imapc=imapc_mock,
            mail=email_mock,
        )

        assert imapc_mock_add_flags.call_count == 2
Example #6
0
    def test_unit__send_request__ok__nominal_case(self):
        content_json = {
          "author": {
            "avatar_url": None,
            "public_name": "John Doe",
            "user_id": 3
          },
          "content_id": 2,
          "created": "2018-08-27T12:12:23.807Z",
          "parent_id": 1,
          "raw_content": "<p>This is just an html comment !</p>"
        }
        responses.add(
            responses.POST,
            'http://127.0.0.1:6543/api/workspaces/4/contents/1/comments',
            status=200,
            json=content_json
        )
        mf = MailFetcher(
            host='host_imap',
            port='993',
            use_ssl=True,
            password='******',
            folder='INBOX',
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path='email_fetcher.lock',
            api_base_url='http://127.0.0.1:6543/api/',
            burst=True,
            api_key='apikey',
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern='',
            references_pattern='',
            user='******',
        )
        imapc_mock = MagicMock()
        imapc_mock_add_flags = MagicMock()
        imapc_mock.add_flags = imapc_mock_add_flags
        email_mock = MagicMock()
        auth_headers = {
            'Tracim-Api-Key': 'apikey',
            'Tracim-Api-Login': '******'
        }
        header_mock = Mock()
        header_mock.return_value = auth_headers
        mf._get_auth_headers = header_mock
        mf._send_request(
            endpoint='http://127.0.0.1:6543/api/workspaces/4/contents/1/comments',  # nopep8
            json_body_dict={'raw_content': 'CONTENT'},
            method='POST',
            imapc=imapc_mock,
            mail=email_mock,
        )

        assert imapc_mock_add_flags.call_count == 2
Example #7
0
    def test_unit___get_content_info__ok__nominal_test(self):
        content_json = {
            "author": {"avatar_url": None, "public_name": "Global manager", "user_id": 1},
            "content_id": 1,
            "content_type": "thread",
            "created": "2018-08-24T15:00:08Z",
            "current_revision_id": 29,
            "is_archived": False,
            "is_deleted": False,
            "label": "coucou",
            "last_modifier": {"avatar_url": None, "public_name": "Global manager", "user_id": 1},
            "modified": "2018-08-24T15:00:08Z",
            "parent_id": None,
            "raw_content": "",
            "show_in_ui": True,
            "slug": "coucou",
            "status": "open",
            "sub_content_types": ["comment"],
            "workspace_id": 4,
        }

        responses.add(
            responses.GET, "http://127.0.0.1:6543/api/contents/1", json=content_json, status=200
        )
        mf = MailFetcher(
            host="host_imap",
            port="993",
            use_ssl=True,
            password="******",
            folder="INBOX",
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path="email_fetcher.lock",
            api_base_url="http://127.0.0.1:6543/api/",
            burst=True,
            api_key="apikey",
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern="",
            references_pattern="",
            user="******",
        )
        auth_headers = {"Tracim-Api-Key": "apikey", "Tracim-Api-Login": "******"}
        mock = Mock()
        mock.return_value = auth_headers
        mf._get_auth_headers = mock
        content_info = mf._get_content_info(1, user_email="*****@*****.**")
        assert content_info == content_json
Example #8
0
class MailFetcherDaemon(FakeDaemon):
    """
    Thread containing a daemon who fetch new mail from a mailbox and
    send http request to a tracim endpoint to handle them.
    """
    def __init__(self, config: "CFG", burst=True, *args, **kwargs):
        """
        :param config: Tracim Config
        :param burst: if true, run one time, if false, run continously
        """
        super().__init__(*args, **kwargs)
        self.config = config
        self._fetcher = None  # type: MailFetcher
        self.burst = burst

    def append_thread_callback(self, callback: typing.Callable) -> None:
        logger.warning(
            "MailFetcherrDaemon not implement append_thread_callback")
        pass

    def stop(self) -> None:
        if self._fetcher:
            self._fetcher.stop()

    def run(self) -> None:
        self._fetcher = MailFetcher(
            host=self.config.EMAIL__REPLY__IMAP__SERVER,
            port=self.config.EMAIL__REPLY__IMAP__PORT,
            user=self.config.EMAIL__REPLY__IMAP__USER,
            password=self.config.EMAIL__REPLY__IMAP__PASSWORD,
            use_ssl=self.config.EMAIL__REPLY__IMAP__USE_SSL,
            folder=self.config.EMAIL__REPLY__IMAP__FOLDER,
            heartbeat=self.config.EMAIL__REPLY__CHECK__HEARTBEAT,
            use_idle=self.config.EMAIL__REPLY__IMAP__USE_IDLE,
            connection_max_lifetime=self.config.
            EMAIL__REPLY__CONNECTION__MAX_LIFETIME,
            api_base_url=self.config.WEBSITE__BASE_URL + BASE_API,
            api_key=self.config.API__KEY,
            reply_to_pattern=self.config.EMAIL__NOTIFICATION__REPLY_TO__EMAIL,
            references_pattern=self.config.
            EMAIL__NOTIFICATION__REFERENCES__EMAIL,
            use_html_parsing=self.config.EMAIL__REPLY__USE_HTML_PARSING,
            use_txt_parsing=self.config.EMAIL__REPLY__USE_TXT_PARSING,
            lockfile_path=self.config.EMAIL__REPLY__LOCKFILE_PATH,
            burst=self.burst,
        )
        self._fetcher.run()
Example #9
0
    def test_unit___get_content_info__err_403__no_right_to_see(self):
        content_json = {
            "code": None,
            "details": {
                "error_detail": {}
            },
            "message": "more info..."
        }

        responses.add(
            responses.GET,
            'http://127.0.0.1:6543/api/contents/1',
            json=content_json,
            status=403
        )
        mf = MailFetcher(
            host='host_imap',
            port='993',
            use_ssl=True,
            password='******',
            folder='INBOX',
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path='email_fetcher.lock',
            api_base_url='http://127.0.0.1:6543/api/',
            burst=True,
            api_key='apikey',
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern='',
            references_pattern='',
            user='******',
        )
        auth_headers = {
            'Tracim-Api-Key': 'apikey',
            'Tracim-Api-Login': '******'
        }
        mock = Mock()
        mock.return_value = auth_headers
        mf._get_auth_headers = mock

        with pytest.raises(BadStatusCode):
            mf._get_content_info(1, user_email='*****@*****.**')  # nopep8
Example #10
0
 def run(self) -> None:
     self._fetcher = MailFetcher(
         host=self.config.EMAIL_REPLY_IMAP_SERVER,
         port=self.config.EMAIL_REPLY_IMAP_PORT,
         user=self.config.EMAIL_REPLY_IMAP_USER,
         password=self.config.EMAIL_REPLY_IMAP_PASSWORD,
         use_ssl=self.config.EMAIL_REPLY_IMAP_USE_SSL,
         folder=self.config.EMAIL_REPLY_IMAP_FOLDER,
         heartbeat=self.config.EMAIL_REPLY_CHECK_HEARTBEAT,
         use_idle=self.config.EMAIL_REPLY_IMAP_USE_IDLE,
         connection_max_lifetime=self.config.
         EMAIL_REPLY_CONNECTION_MAX_LIFETIME,  # nopep8
         api_base_url=self.config.WEBSITE_BASE_URL + BASE_API_V2,
         api_key=self.config.API_KEY,
         use_html_parsing=self.config.EMAIL_REPLY_USE_HTML_PARSING,
         use_txt_parsing=self.config.EMAIL_REPLY_USE_TXT_PARSING,
         lockfile_path=self.config.EMAIL_REPLY_LOCKFILE_PATH,
         burst=self.burst)
     self._fetcher.run()
Example #11
0
 def run(self) -> None:
     self._fetcher = MailFetcher(
         host=self.config.EMAIL__REPLY__IMAP__SERVER,
         port=self.config.EMAIL__REPLY__IMAP__PORT,
         user=self.config.EMAIL__REPLY__IMAP__USER,
         password=self.config.EMAIL__REPLY__IMAP__PASSWORD,
         use_ssl=self.config.EMAIL__REPLY__IMAP__USE_SSL,
         folder=self.config.EMAIL__REPLY__IMAP__FOLDER,
         heartbeat=self.config.EMAIL__REPLY__CHECK__HEARTBEAT,
         use_idle=self.config.EMAIL__REPLY__IMAP__USE_IDLE,
         connection_max_lifetime=self.config.EMAIL__REPLY__CONNECTION__MAX_LIFETIME,
         api_base_url=self.config.WEBSITE__BASE_URL + BASE_API_V2,
         api_key=self.config.API__KEY,
         reply_to_pattern=self.config.EMAIL__NOTIFICATION__REPLY_TO__EMAIL,
         references_pattern=self.config.EMAIL__NOTIFICATION__REFERENCES__EMAIL,
         use_html_parsing=self.config.EMAIL__REPLY__USE_HTML_PARSING,
         use_txt_parsing=self.config.EMAIL__REPLY__USE_TXT_PARSING,
         lockfile_path=self.config.EMAIL__REPLY__LOCKFILE_PATH,
         burst=self.burst,
     )
     self._fetcher.run()
Example #12
0
 def test_unit__notify_tracim(self):
     mf = MailFetcher(
         host='host_imap',
         port='993',
         use_ssl=True,
         password='******',
         folder='INBOX',
         use_idle=True,
         use_html_parsing=True,
         use_txt_parsing=True,
         lockfile_path='email_fetcher.lock',
         api_base_url='http://127.0.0.1:6543/api/',
         burst=True,
         api_key='apikey',
         connection_max_lifetime=60,
         heartbeat=60,
         reply_to_pattern='',
         references_pattern='',
         user='******',
     )
     imapc_mock = MagicMock()
     imapc_mock_add_flags = MagicMock()
     imapc_mock.add_flags = imapc_mock_add_flags
     mail = Mock()
     mail.get_body.return_value = 'CONTENT'
     mail.get_key.return_value = '1'
     mail.get_from_address.return_value = '*****@*****.**'
     mail2 = Mock()
     mail2.get_body.return_value = 'CONTENT2'
     mail2.get_key.return_value = '2'
     mail2.get_from_address.return_value = '*****@*****.**'
     mails = [mail, mail2]
     mf._send_request = Mock()
     mf._create_comment_request = Mock()
     mf._create_comment_request.side_effect = [
         ('POST',
         'http://127.0.0.1:6543/api/workspaces/4/contents/1/comments',
          {'raw_content': 'CONTENT'},
         ),
         ('POST',
          'http://127.0.0.1:6543/api/workspaces/4/contents/2/comments',
          {'raw_content': 'CONTENT2'},
          ),
     ]
     mf._notify_tracim(mails=mails, imapc=imapc_mock)
     args = {
         'mail': mail,
         'imapc': imapc_mock,
         'endpoint': 'http://127.0.0.1:6543/api/workspaces/4/contents/1/comments',  # nopep8
         'json_body_dict': {'raw_content': 'CONTENT'},
         'method': 'POST',
     }
     args2 = {
         'mail': mail,
         'imapc': imapc_mock,
         'endpoint': 'http://127.0.0.1:6543/api/workspaces/4/contents/2/comments',  # nopep8
         'json_body_dict': {'raw_content': 'CONTENT2'},
         'method': 'POST',
     }
     assert mf._send_request.call_count == 2
Example #13
0
 def test_unit__stop__ok__nominal_test(self):
     mf = MailFetcher(
         host="host_imap",
         port="993",
         use_ssl=True,
         password="******",
         folder="INBOX",
         use_idle=True,
         use_html_parsing=True,
         use_txt_parsing=True,
         lockfile_path="email_fetcher.lock",
         api_base_url="http://127.0.0.1:6543/api",
         burst=True,
         api_key="apikey",
         connection_max_lifetime=60,
         heartbeat=60,
         reply_to_pattern="",
         references_pattern="",
         user="******",
     )
     assert mf._is_active
     mf.stop()
     assert not mf._is_active
Example #14
0
 def test_unit__stop__ok__nominal_test(self):
     mf = MailFetcher(
         host='host_imap',
         port='993',
         use_ssl=True,
         password='******',
         folder='INBOX',
         use_idle=True,
         use_html_parsing=True,
         use_txt_parsing=True,
         lockfile_path='email_fetcher.lock',
         api_base_url='http://127.0.0.1:6543/api',
         burst=True,
         api_key='apikey',
         connection_max_lifetime=60,
         heartbeat=60,
         reply_to_pattern='',
         references_pattern='',
         user='******',
     )
     assert mf._is_active
     mf.stop()
     assert not mf._is_active
Example #15
0
 def test_unit__notify_tracim(self):
     mf = MailFetcher(
         host="host_imap",
         port="993",
         use_ssl=True,
         password="******",
         folder="INBOX",
         use_idle=True,
         use_html_parsing=True,
         use_txt_parsing=True,
         lockfile_path="email_fetcher.lock",
         api_base_url="http://127.0.0.1:6543/api/",
         burst=True,
         api_key="apikey",
         connection_max_lifetime=60,
         heartbeat=60,
         reply_to_pattern="",
         references_pattern="",
         user="******",
     )
     imapc_mock = MagicMock()
     imapc_mock_add_flags = MagicMock()
     imapc_mock.add_flags = imapc_mock_add_flags
     mail = Mock()
     mail.get_body.return_value = "CONTENT"
     mail.get_key.return_value = "1"
     mail.get_from_address.return_value = "*****@*****.**"
     mail2 = Mock()
     mail2.get_body.return_value = "CONTENT2"
     mail2.get_key.return_value = "2"
     mail2.get_from_address.return_value = "*****@*****.**"
     mails = [mail, mail2]
     mf._send_request = Mock()
     mf._create_comment_request = Mock()
     mf._create_comment_request.side_effect = [
         (
             "POST",
             "http://127.0.0.1:6543/api/workspaces/4/contents/1/comments",
             {
                 "raw_content": "CONTENT"
             },
         ),
         (
             "POST",
             "http://127.0.0.1:6543/api/workspaces/4/contents/2/comments",
             {
                 "raw_content": "CONTENT2"
             },
         ),
     ]
     mf._notify_tracim(mails=mails, imapc=imapc_mock)
     assert mf._send_request.call_count == 2
Example #16
0
    def test_unit___get_content_info__ok__nominal_test(self):
        content_json = {
            "author": {
                "avatar_url": None,
                "public_name": "Global manager",
                "user_id": 1
            },
            "content_id": 1,
            "content_type": "thread",
            "created": "2018-08-24T15:00:08Z",
            "current_revision_id": 29,
            "is_archived": False,
            "is_deleted": False,
            "label": "coucou",
            "last_modifier": {
                "avatar_url": None,
                "public_name": "Global manager",
                "user_id": 1
            },
            "modified": "2018-08-24T15:00:08Z",
            "parent_id": None,
            "raw_content": "",
            "show_in_ui": True,
            "slug": "coucou",
            "status": "open",
            "sub_content_types": [
                "comment"
            ],
            "workspace_id": 4
        }

        responses.add(
            responses.GET,
            'http://127.0.0.1:6543/api/contents/1',
            json=content_json,
            status=200
        )
        mf = MailFetcher(
            host='host_imap',
            port='993',
            use_ssl=True,
            password='******',
            folder='INBOX',
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path='email_fetcher.lock',
            api_base_url='http://127.0.0.1:6543/api/',
            burst=True,
            api_key='apikey',
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern='',
            references_pattern='',
            user='******',
        )
        auth_headers = {
            'Tracim-Api-Key': 'apikey',
            'Tracim-Api-Login': '******'
        }
        mock = Mock()
        mock.return_value = auth_headers
        mf._get_auth_headers = mock
        content_info = mf._get_content_info(1, user_email='*****@*****.**')  # nopep8
        assert content_info == content_json
Example #17
0
    def test_unit__create_comment_request__ok__nominal_test(self):
        mail = Mock()
        mail.get_body.return_value = 'CONTENT'
        mail.get_key.return_value = '1'
        mail.get_from_address.return_value = '*****@*****.**'

        content_info = {
            "author": {
                "avatar_url": None,
                "public_name": "Global manager",
                "user_id": 1
            },
            "content_id": 1,
            "content_type": "thread",
            "created": "2018-08-24T15:00:08Z",
            "current_revision_id": 29,
            "is_archived": False,
            "is_deleted": False,
            "label": "coucou",
            "last_modifier": {
                "avatar_url": None,
                "public_name": "Global manager",
                "user_id": 1
            },
            "modified": "2018-08-24T15:00:08Z",
            "parent_id": None,
            "raw_content": "",
            "show_in_ui": True,
            "slug": "coucou",
            "status": "open",
            "sub_content_types": [
                "comment"
            ],
            "workspace_id": 4
        }

        mf = MailFetcher(
            host='host_imap',
            port='993',
            use_ssl=True,
            password='******',
            folder='INBOX',
            use_idle=True,
            use_html_parsing=True,
            use_txt_parsing=True,
            lockfile_path='email_fetcher.lock',
            api_base_url='http://127.0.0.1:6543/api/',
            burst=True,
            api_key='apikey',
            connection_max_lifetime=60,
            heartbeat=60,
            reply_to_pattern='',
            references_pattern='',
            user='******',
        )
        mf._get_content_info = Mock()
        mf._get_content_info.return_value = content_info
        method, endpoint, body = mf._create_comment_request(mail)
        assert method == 'POST'
        assert endpoint == 'http://127.0.0.1:6543/api/workspaces/4/contents/1/comments'  # nopep8
        assert body == {'raw_content': 'CONTENT'}