diff --git a/src/teams_bot/bot.py b/src/teams_bot/bot.py index e09cb88..4e72d59 100644 --- a/src/teams_bot/bot.py +++ b/src/teams_bot/bot.py @@ -1,4 +1,5 @@ import logging +import time from threading import Event import pickledb @@ -44,6 +45,25 @@ class RelayPlugin: if not kvstore.get("relays"): kvstore.set("relays", list()) + @account_hookimpl + def ac_outgoing_message(self, message: deltachat.Message): + while not message.is_out_delivered(): + time.sleep(0.1) + if message.is_out_failed(): + break + begin = int(time.time()) + while not message.is_out_failed(): + time.sleep(0.1) + if int(time.time()) < begin + 10: + break # it probably just worked. + else: + error = message.get_message_info() + logging.warning( + "Outgoing message failed. Forwarding error to relay group: %s", error + ) + relay_group = self.get_relay_group(message.chat.id) + relay_group.send_text(f"Sending Message failed:\n\n{error}") + @account_hookimpl def ac_incoming_message(self, message: deltachat.Message): """This method is called on every incoming message and decides what to do with it.""" diff --git a/tests/conftest.py b/tests/conftest.py index ab31b84..8e65c1b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -141,7 +141,9 @@ def outsider(tmpdir): def account(db_path, show_ffi=False): - token = os.environ.get("DCC_NEW_TMP_EMAIL", "https://nine.testrun.org/cgi-bin/newemail.py") + token = os.environ.get( + "DCC_NEW_TMP_EMAIL", "https://nine.testrun.org/cgi-bin/newemail.py" + ) print(token) ac = deltachat.Account(str(db_path)) credentials = requests.post(token).json() diff --git a/tests/test_bot.py b/tests/test_bot.py index 882faab..fc3c51f 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -1,10 +1,14 @@ import os.path +import time import deltachat import pytest from deltachat.capi import lib as dclib +TIMEOUT = 20 + + @pytest.mark.timeout(60) def test_not_relay_groups(relaycrew, outsider): bot = relaycrew.bot @@ -215,3 +219,34 @@ def test_change_avatar(relaycrew): confirmation_msg = user.wait_next_incoming_message() assert confirmation_msg.text == "Avatar changed to this image." assert botcontact.get_profile_image() + + +def test_forward_sending_errors_to_relay_group(relaycrew): + usercrew = relaycrew.user.get_chats()[-1] + usercrew.send_text("/start_chat alice@example.org This_Message_will_fail test") + + while len(relaycrew.bot.get_chats()) < 3: + time.sleep(0.1) + out_chat = relaycrew.bot.get_chats()[-1] + outgoing_message = out_chat.get_messages()[-1] + print(outgoing_message) + begin = int(time.time()) + while not outgoing_message.is_out_failed() and int(time.time()) < begin + TIMEOUT: + time.sleep(0.1) + assert outgoing_message.is_out_failed() + + while len(relaycrew.user.get_chats()) < 2 and int(time.time()) < begin + TIMEOUT: + time.sleep(0.1) + relay_group = relaycrew.user.get_chats()[-2] + + while len(relay_group.get_messages()) < 3 and int(time.time()) < begin + TIMEOUT: + print(relay_group.get_messages()[-1].text) + time.sleep(0.1) + assert ( + "Recipient address rejected: Domain example.org does not accept mail" + not in relay_group.get_messages()[-1].text + ) + assert ( + "Invalid unencrypted mail to " + in relay_group.get_messages()[-1].text + )