irctest/irctest/server_tests/multiline.py

138 lines
5.3 KiB
Python
Raw Normal View History

2019-12-29 17:26:26 +00:00
"""
`Draft IRCv3 multiline <https://ircv3.net/specs/extensions/multiline>`_
2019-12-29 17:26:26 +00:00
"""
from irctest import cases
from irctest.patma import ANYDICT, StrRe
2019-12-29 17:26:26 +00:00
2021-02-22 18:02:13 +00:00
CAP_NAME = "draft/multiline"
BATCH_TYPE = "draft/multiline"
CONCAT_TAG = "draft/multiline-concat"
2019-12-29 17:26:26 +00:00
2021-02-22 18:02:13 +00:00
base_caps = ["message-tags", "batch", "echo-message", "server-time", "labeled-response"]
2019-12-29 17:26:26 +00:00
2022-04-12 16:48:03 +00:00
class MultilineTestCase(cases.BaseServerTestCase):
@cases.mark_capabilities("draft/multiline")
2019-12-29 17:26:26 +00:00
def testBasic(self):
self.connectClient(
2021-02-22 18:02:13 +00:00
"alice", capabilities=(base_caps + [CAP_NAME]), skip_if_cap_nak=True
)
2021-02-22 18:02:13 +00:00
self.joinChannel(1, "#test")
self.connectClient("bob", capabilities=(base_caps + [CAP_NAME]))
self.joinChannel(2, "#test")
self.connectClient("charlie", capabilities=base_caps)
self.joinChannel(3, "#test")
2019-12-29 17:26:26 +00:00
self.getMessages(1)
self.getMessages(2)
self.getMessages(3)
2021-02-22 18:02:13 +00:00
self.sendLine(1, "@label=xyz BATCH +123 %s #test" % (BATCH_TYPE,))
self.sendLine(1, "@batch=123 PRIVMSG #test hello")
self.sendLine(1, "@batch=123 PRIVMSG #test :#how is ")
self.sendLine(1, "@batch=123;%s PRIVMSG #test :everyone?" % (CONCAT_TAG,))
self.sendLine(1, "BATCH -123")
2019-12-29 17:26:26 +00:00
echo = self.getMessages(1)
batchStart, batchEnd = echo[0], echo[-1]
self.assertMessageMatch(
batchStart,
command="BATCH",
params=[StrRe(r"\+.*"), BATCH_TYPE, "#test"],
tags={"label": "xyz", **ANYDICT},
)
2021-02-22 18:02:13 +00:00
self.assertEqual(batchStart.tags.get("label"), "xyz")
self.assertMessageMatch(batchEnd, command="BATCH", params=[StrRe("-.*")])
self.assertEqual(
batchStart.params[0][1:],
batchEnd.params[0][1:],
fail_msg="batch start and end do not match",
)
2021-02-22 18:02:13 +00:00
msgid = batchStart.tags.get("msgid")
time = batchStart.tags.get("time")
2019-12-29 17:26:26 +00:00
assert msgid
assert time
privmsgs = echo[1:-1]
for msg in privmsgs:
self.assertMessageMatch(msg, command="PRIVMSG")
2021-02-22 18:02:13 +00:00
self.assertNotIn("msgid", msg.tags)
self.assertNotIn("time", msg.tags)
2019-12-29 17:26:26 +00:00
self.assertIn(CONCAT_TAG, echo[3].tags)
relay = self.getMessages(2)
batchStart, batchEnd = relay[0], relay[-1]
self.assertMessageMatch(
batchStart, command="BATCH", params=[StrRe(r"\+.*"), BATCH_TYPE, "#test"]
)
2020-12-15 09:41:25 +00:00
batchTag = batchStart.params[0][1:]
self.assertMessageMatch(batchEnd, command="BATCH", params=["-" + batchTag])
2021-02-22 18:02:13 +00:00
self.assertEqual(batchStart.tags.get("msgid"), msgid)
self.assertEqual(batchStart.tags.get("time"), time)
2019-12-29 17:26:26 +00:00
privmsgs = relay[1:-1]
for msg in privmsgs:
self.assertMessageMatch(msg, command="PRIVMSG")
2021-02-22 18:02:13 +00:00
self.assertNotIn("msgid", msg.tags)
self.assertNotIn("time", msg.tags)
self.assertEqual(msg.tags.get("batch"), batchTag)
2019-12-29 17:26:26 +00:00
self.assertIn(CONCAT_TAG, relay[3].tags)
fallback_relay = self.getMessages(3)
relayed_fmsgids = []
for msg in fallback_relay:
self.assertMessageMatch(msg, command="PRIVMSG")
2021-02-22 18:02:13 +00:00
relayed_fmsgids.append(msg.tags.get("msgid"))
self.assertEqual(msg.tags.get("time"), time)
2019-12-29 17:26:26 +00:00
self.assertNotIn(CONCAT_TAG, msg.tags)
2021-02-22 18:02:13 +00:00
self.assertEqual(relayed_fmsgids, [msgid] + [None] * (len(fallback_relay) - 1))
2020-05-14 16:27:38 +00:00
@cases.mark_capabilities("draft/multiline")
2020-05-14 16:27:38 +00:00
def testBlankLines(self):
self.connectClient(
2021-02-22 18:02:13 +00:00
"alice", capabilities=(base_caps + [CAP_NAME]), skip_if_cap_nak=True
)
2021-02-22 18:02:13 +00:00
self.joinChannel(1, "#test")
self.connectClient("bob", capabilities=(base_caps + [CAP_NAME]))
self.joinChannel(2, "#test")
self.connectClient("charlie", capabilities=base_caps)
self.joinChannel(3, "#test")
2020-05-14 16:27:38 +00:00
self.getMessages(1)
self.getMessages(2)
self.getMessages(3)
2021-02-22 18:02:13 +00:00
self.sendLine(
1, "@label=xyz;+client-only-tag BATCH +123 %s #test" % (BATCH_TYPE,)
)
self.sendLine(1, "@batch=123 PRIVMSG #test :")
self.sendLine(1, "@batch=123 PRIVMSG #test :#how is ")
self.sendLine(1, "@batch=123;%s PRIVMSG #test :everyone?" % (CONCAT_TAG,))
self.sendLine(1, "BATCH -123")
2020-05-14 16:27:38 +00:00
self.getMessages(1)
relay = self.getMessages(2)
batch_start = relay[0]
privmsgs = relay[1:-1]
self.assertEqual(len(privmsgs), 3)
self.assertMessageMatch(privmsgs[0], command="PRIVMSG", params=["#test", ""])
self.assertMessageMatch(
2021-02-22 18:02:13 +00:00
privmsgs[1], command="PRIVMSG", params=["#test", "#how is "]
)
self.assertMessageMatch(
2021-02-22 18:02:13 +00:00
privmsgs[2], command="PRIVMSG", params=["#test", "everyone?"]
)
self.assertIn("+client-only-tag", batch_start.tags)
msgid = batch_start.tags["msgid"]
2020-05-14 16:27:38 +00:00
fallback_relay = self.getMessages(3)
self.assertEqual(len(fallback_relay), 2)
self.assertMessageMatch(
2021-02-22 18:02:13 +00:00
fallback_relay[0], command="PRIVMSG", params=["#test", "#how is "]
)
self.assertMessageMatch(
2021-02-22 18:02:13 +00:00
fallback_relay[1], command="PRIVMSG", params=["#test", "everyone?"]
)
self.assertIn("+client-only-tag", fallback_relay[0].tags)
self.assertIn("+client-only-tag", fallback_relay[1].tags)
self.assertEqual(fallback_relay[0].tags["msgid"], msgid)