mirror of
https://github.com/chatmail/core.git
synced 2026-05-05 06:16:30 +03:00
refine bot testing and ac_member* handling
This commit is contained in:
@@ -21,6 +21,10 @@ class GroupTrackingPlugin:
|
|||||||
def ac_configure_completed(self, success):
|
def ac_configure_completed(self, success):
|
||||||
print("*** ac_configure_completed:", success)
|
print("*** ac_configure_completed:", success)
|
||||||
|
|
||||||
|
@account_hookimpl
|
||||||
|
def ac_chat_modified(self, chat):
|
||||||
|
print("*** ac_chat_modified:", chat.id, chat.get_name())
|
||||||
|
|
||||||
@account_hookimpl
|
@account_hookimpl
|
||||||
def ac_member_added(self, chat, contact, sender):
|
def ac_member_added(self, chat, contact, sender):
|
||||||
print("*** ac_member_added {} to chat {} from {}".format(
|
print("*** ac_member_added {} to chat {} from {}".format(
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ def test_echo_quit_plugin(acfactory):
|
|||||||
|
|
||||||
def test_group_tracking_plugin(acfactory, lp):
|
def test_group_tracking_plugin(acfactory, lp):
|
||||||
lp.sec("creating one group-tracking bot and two temp accounts")
|
lp.sec("creating one group-tracking bot and two temp accounts")
|
||||||
botproc = acfactory.run_bot_process(group_tracking)
|
botproc = acfactory.run_bot_process(group_tracking, ffi=False)
|
||||||
|
|
||||||
ac1, ac2 = acfactory.get_two_online_accounts(quiet=True)
|
ac1, ac2 = acfactory.get_two_online_accounts(quiet=True)
|
||||||
|
|
||||||
botproc.fnmatch_lines("""
|
botproc.fnmatch_lines("""
|
||||||
*ac_configure_completed: True*
|
*ac_configure_completed*
|
||||||
""")
|
""")
|
||||||
ac1.add_account_plugin(FFIEventLogger(ac1, "ac1"))
|
ac1.add_account_plugin(FFIEventLogger(ac1, "ac1"))
|
||||||
ac2.add_account_plugin(FFIEventLogger(ac2, "ac2"))
|
ac2.add_account_plugin(FFIEventLogger(ac2, "ac2"))
|
||||||
@@ -50,7 +50,7 @@ def test_group_tracking_plugin(acfactory, lp):
|
|||||||
ch.send_text("hello")
|
ch.send_text("hello")
|
||||||
|
|
||||||
botproc.fnmatch_lines("""
|
botproc.fnmatch_lines("""
|
||||||
*ac_chat_modified*
|
*ac_chat_modified*bot test group*
|
||||||
""".format(ac1.get_config("addr")))
|
""".format(ac1.get_config("addr")))
|
||||||
|
|
||||||
lp.sec("adding third member {}".format(ac2.get_config("addr")))
|
lp.sec("adding third member {}".format(ac2.get_config("addr")))
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from . import const
|
|||||||
from .capi import ffi, lib
|
from .capi import ffi, lib
|
||||||
from .cutil import as_dc_charpointer, from_dc_charpointer, iter_array, DCLot
|
from .cutil import as_dc_charpointer, from_dc_charpointer, iter_array, DCLot
|
||||||
from .chat import Chat
|
from .chat import Chat
|
||||||
from .message import Message
|
from .message import Message, map_system_message
|
||||||
from .contact import Contact
|
from .contact import Contact
|
||||||
from .tracker import ImexTracker
|
from .tracker import ImexTracker
|
||||||
from . import hookspec, iothreads
|
from . import hookspec, iothreads
|
||||||
@@ -65,8 +65,7 @@ class Account(object):
|
|||||||
|
|
||||||
@hookspec.account_hookimpl
|
@hookspec.account_hookimpl
|
||||||
def ac_process_ffi_event(self, ffi_event):
|
def ac_process_ffi_event(self, ffi_event):
|
||||||
name, kwargs = self._map_ffi_event(ffi_event)
|
for name, kwargs in self._map_ffi_event(ffi_event):
|
||||||
if name is not None:
|
|
||||||
ev = HookEvent(self, name=name, kwargs=kwargs)
|
ev = HookEvent(self, name=name, kwargs=kwargs)
|
||||||
self._hook_event_queue.put(ev)
|
self._hook_event_queue.put(ev)
|
||||||
|
|
||||||
@@ -622,48 +621,26 @@ class Account(object):
|
|||||||
data1 = ffi_event.data1
|
data1 = ffi_event.data1
|
||||||
if data1 == 0 or data1 == 1000:
|
if data1 == 0 or data1 == 1000:
|
||||||
success = data1 == 1000
|
success = data1 == 1000
|
||||||
return "ac_configure_completed", dict(success=success)
|
yield "ac_configure_completed", dict(success=success)
|
||||||
elif name == "DC_EVENT_INCOMING_MSG":
|
elif name == "DC_EVENT_INCOMING_MSG":
|
||||||
msg = self.get_message_by_id(ffi_event.data2)
|
msg = self.get_message_by_id(ffi_event.data2)
|
||||||
return self._map_incoming(msg)
|
yield map_system_message(msg) or ("ac_incoming_message", dict(message=msg))
|
||||||
elif name == "DC_EVENT_MSGS_CHANGED":
|
elif name == "DC_EVENT_MSGS_CHANGED":
|
||||||
if ffi_event.data2 != 0:
|
if ffi_event.data2 != 0:
|
||||||
msg = self.get_message_by_id(ffi_event.data2)
|
msg = self.get_message_by_id(ffi_event.data2)
|
||||||
if msg.is_outgoing():
|
if msg.is_outgoing():
|
||||||
evname, kwargs = self._map_incoming(msg)
|
res = map_system_message(msg)
|
||||||
if evname.startswith("ac_member"):
|
if res and res[0].startswith("ac_member"):
|
||||||
return evname, kwargs
|
yield res
|
||||||
if msg.is_in_fresh():
|
yield "ac_outgoing_message", dict(message=msg)
|
||||||
return self._map_incoming(msg)
|
elif msg.is_in_fresh():
|
||||||
|
yield map_system_message(msg) or ("ac_incoming_message", dict(message=msg))
|
||||||
elif name == "DC_EVENT_MSG_DELIVERED":
|
elif name == "DC_EVENT_MSG_DELIVERED":
|
||||||
msg = self.get_message_by_id(ffi_event.data2)
|
msg = self.get_message_by_id(ffi_event.data2)
|
||||||
return "ac_message_delivered", dict(message=msg)
|
yield "ac_message_delivered", dict(message=msg)
|
||||||
elif name == "DC_EVENT_CHAT_MODIFIED":
|
elif name == "DC_EVENT_CHAT_MODIFIED":
|
||||||
chat = self.get_chat_by_id(ffi_event.data1)
|
chat = self.get_chat_by_id(ffi_event.data1)
|
||||||
return "ac_chat_modified", dict(chat=chat)
|
yield "ac_chat_modified", dict(chat=chat)
|
||||||
return None, {}
|
|
||||||
|
|
||||||
def _map_incoming(self, msg):
|
|
||||||
if msg.is_system_message():
|
|
||||||
res = parse_system_add_remove(msg.text)
|
|
||||||
if res:
|
|
||||||
contact = msg.account.get_contact_by_addr(res[1])
|
|
||||||
if contact:
|
|
||||||
d = dict(chat=msg.chat, contact=contact, sender=msg.get_sender_contact())
|
|
||||||
return "ac_member_" + res[0], d
|
|
||||||
return "ac_incoming_message", dict(message=msg)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_system_add_remove(text):
|
|
||||||
# Member Me (x@y) removed by a@b.
|
|
||||||
# Member x@y removed by a@b
|
|
||||||
text = text.lower()
|
|
||||||
parts = text.split()
|
|
||||||
if parts[0] == "member":
|
|
||||||
if parts[2] in ("removed", "added"):
|
|
||||||
return parts[2], parts[1]
|
|
||||||
if parts[3] in ("removed", "added"):
|
|
||||||
return parts[3], parts[2].strip("()")
|
|
||||||
|
|
||||||
|
|
||||||
def _destroy_dc_context(dc_context, dc_context_unref=lib.dc_context_unref):
|
def _destroy_dc_context(dc_context, dc_context_unref=lib.dc_context_unref):
|
||||||
|
|||||||
@@ -320,3 +320,26 @@ def get_viewtype_code_from_name(view_type_name):
|
|||||||
return code
|
return code
|
||||||
raise ValueError("message typecode not found for {!r}, "
|
raise ValueError("message typecode not found for {!r}, "
|
||||||
"available {!r}".format(view_type_name, list(_view_type_mapping.values())))
|
"available {!r}".format(view_type_name, list(_view_type_mapping.values())))
|
||||||
|
|
||||||
|
|
||||||
|
# some helper code for turning system messages into hook events
|
||||||
|
def map_system_message(msg):
|
||||||
|
if msg.is_system_message():
|
||||||
|
res = parse_system_add_remove(msg.text)
|
||||||
|
if res:
|
||||||
|
contact = msg.account.get_contact_by_addr(res[1])
|
||||||
|
if contact:
|
||||||
|
d = dict(chat=msg.chat, contact=contact, sender=msg.get_sender_contact())
|
||||||
|
return "ac_member_" + res[0], d
|
||||||
|
|
||||||
|
|
||||||
|
def parse_system_add_remove(text):
|
||||||
|
# Member Me (x@y) removed by a@b.
|
||||||
|
# Member x@y removed by a@b
|
||||||
|
text = text.lower()
|
||||||
|
parts = text.split()
|
||||||
|
if parts[0] == "member":
|
||||||
|
if parts[2] in ("removed", "added"):
|
||||||
|
return parts[2], parts[1]
|
||||||
|
if parts[3] in ("removed", "added"):
|
||||||
|
return parts[3], parts[2].strip("()")
|
||||||
|
|||||||
@@ -280,26 +280,28 @@ def acfactory(pytestconfig, tmpdir, request, session_liveconfig, data):
|
|||||||
ac.start()
|
ac.start()
|
||||||
return ac
|
return ac
|
||||||
|
|
||||||
def run_bot_process(self, module):
|
def run_bot_process(self, module, ffi=True):
|
||||||
fn = module.__file__
|
fn = module.__file__
|
||||||
|
|
||||||
bot_ac, bot_cfg = self.get_online_config()
|
bot_ac, bot_cfg = self.get_online_config()
|
||||||
|
|
||||||
args = [
|
args = [
|
||||||
sys.executable,
|
sys.executable,
|
||||||
|
"-u",
|
||||||
fn,
|
fn,
|
||||||
"--show-ffi",
|
|
||||||
"--email", bot_cfg["addr"],
|
"--email", bot_cfg["addr"],
|
||||||
"--password", bot_cfg["mail_pw"],
|
"--password", bot_cfg["mail_pw"],
|
||||||
bot_ac.db_path,
|
bot_ac.db_path,
|
||||||
]
|
]
|
||||||
|
if ffi:
|
||||||
|
args.insert(-1, "--show-ffi")
|
||||||
print("$", " ".join(args))
|
print("$", " ".join(args))
|
||||||
popen = subprocess.Popen(
|
popen = subprocess.Popen(
|
||||||
args=args,
|
args=args,
|
||||||
stdin=subprocess.DEVNULL,
|
stdin=subprocess.DEVNULL,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.STDOUT, # combine stdout/stderr in one stream
|
stderr=subprocess.STDOUT, # combine stdout/stderr in one stream
|
||||||
bufsize=1, # line buffering
|
bufsize=0, # line buffering
|
||||||
close_fds=True, # close all FDs other than 0/1/2
|
close_fds=True, # close all FDs other than 0/1/2
|
||||||
universal_newlines=True # give back text
|
universal_newlines=True # give back text
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ from conftest import (wait_configuration_progress,
|
|||||||
("Member tmp1@x.org added by tmp2@x.org.", ("added", "tmp1@x.org")),
|
("Member tmp1@x.org added by tmp2@x.org.", ("added", "tmp1@x.org")),
|
||||||
])
|
])
|
||||||
def test_parse_system_add_remove(msgtext, res):
|
def test_parse_system_add_remove(msgtext, res):
|
||||||
from deltachat.account import parse_system_add_remove
|
from deltachat.message import parse_system_add_remove
|
||||||
|
|
||||||
out = parse_system_add_remove(msgtext)
|
out = parse_system_add_remove(msgtext)
|
||||||
assert out == res
|
assert out == res
|
||||||
|
|||||||
Reference in New Issue
Block a user