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"] == "*****@*****.**"
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="*****@*****.**")
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'] == '*****@*****.**'
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"}
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
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
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
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()
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
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()
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()
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
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
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
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
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
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'}