Skip to content

Commit

Permalink
Add tests for the draft bot mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
progval committed Jul 1, 2021
1 parent 98824a4 commit f8ab876
Show file tree
Hide file tree
Showing 5 changed files with 141 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,15 @@ ERGO_SELECTORS := \
# testNoticeNonexistentChannel fails because of https://github.com/inspircd/inspircd/issues/1849
# testDirectMessageEcho fails because of https://github.com/inspircd/inspircd/issues/1851
# testKeyValidation fails because of https://github.com/inspircd/inspircd/issues/1850
# testBotPrivateMessage and testBotChannelMessage fail because https://github.com/inspircd/inspircd/pull/1910 is not released yet
INSPIRCD_SELECTORS := \
not Ergo \
and not deprecated \
and not strict \
and not testNoticeNonexistentChannel \
and not testDirectMessageEcho \
and not testKeyValidation \
and not testBotPrivateMessage and not testBotChannelMessage \
$(EXTRA_SELECTORS)

MAMMON_SELECTORS := \
Expand Down
1 change: 1 addition & 0 deletions irctest/controllers/inspircd.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
target="services.example.org">
# Protocol:
<module name="botmode">
<module name="cap">
<module name="ircv3">
<module name="ircv3_accounttag">
Expand Down
136 changes: 136 additions & 0 deletions irctest/server_tests/test_bot_mode.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
"""
Draft bot mode specification, as defined in
<https://ircv3.net/specs/extensions/bot-mode>
"""

from irctest import cases
from irctest.numerics import RPL_WHOISBOT
from irctest.patma import ANYDICT, ANYSTR, StrRe


@cases.mark_specifications("IRCv3")
@cases.mark_isupport("BOT")
class BotModeTestCase(cases.BaseServerTestCase):
def setUp(self):
super().setUp()
self.connectClient("modegetter")
self._mode_char = self.server_support["BOT"]

def _initBot(self):
self.assertEqual(
len(self._mode_char),
1,
fail_msg=(
f"BOT ISUPPORT token should be exactly one character, "
f"but is: {self._mode_char!r}"
),
)

self.connectClient("botnick", "bot")

self.sendLine("bot", f"MODE botnick +{self._mode_char}")

# Check echoed mode
self.assertMessageMatch(
self.getMessage("bot"),
command="MODE",
params=["botnick", StrRe(r"\+?" + self._mode_char)],
)

def testBotMode(self):
self._initBot()

def testBotWhois(self):
self._initBot()

self.connectClient("usernick", "user")
self.sendLine("user", "WHOIS botnick")
messages = self.getMessages("user")
messages = [msg for msg in messages if msg.command == RPL_WHOISBOT]
self.assertEqual(
len(messages),
1,
msg=(
f"Expected exactly one RPL_WHOISBOT ({RPL_WHOISBOT}), "
f"got: {messages}"
),
)

(message,) = messages
self.assertMessageMatch(
message, command=RPL_WHOISBOT, params=["usernick", "botnick", ANYSTR]
)

def testBotPrivateMessage(self):
self._initBot()

self.connectClient("usernick", "user", capabilities=["message-tags"])

self.sendLine("bot", "PRIVMSG usernick :beep boop")
self.assertMessageMatch(
self.getMessage("user"),
command="PRIVMSG",
params=["usernick", "beep boop"],
tags={"draft/bot": None, **ANYDICT},
)

def testBotChannelMessage(self):
self._initBot()

self.connectClient("usernick", "user", capabilities=["message-tags"])

self.sendLine("bot", "JOIN #chan")
self.sendLine("user", "JOIN #chan")
self.getMessages("bot")
self.getMessages("user")

self.sendLine("bot", "PRIVMSG #chan :beep boop")
self.assertMessageMatch(
self.getMessage("user"),
command="PRIVMSG",
params=["#chan", "beep boop"],
tags={"draft/bot": None, **ANYDICT},
)

def testBotWhox(self):
self._initBot()

self.connectClient("usernick", "user", capabilities=["message-tags"])

self.sendLine("bot", "JOIN #chan")
self.sendLine("user", "JOIN #chan")
self.getMessages("bot")
self.getMessages("user")

self.sendLine("user", "WHO #chan")
msg1 = self.getMessage("user")
self.assertMessageMatch(
msg1, command="352", fail_msg="Expected WHO response (352), got: {msg}"
)
msg2 = self.getMessage("user")
self.assertMessageMatch(
msg2, command="352", fail_msg="Expected WHO response (352), got: {msg}"
)

if msg1.params[5] == "botnick":
msg = msg1
elif msg2.params[5] == "botnick":
msg = msg2
else:
assert False, "No WHO response contained botnick"

self.assertMessageMatch(
msg,
command="352",
params=[
"usernick",
"#chan",
ANYSTR, # ident
ANYSTR, # hostname
ANYSTR, # server
"botnick",
StrRe(f".*{self._mode_char}.*"),
ANYSTR, # realname
],
fail_msg="Expected WHO response with bot flag, got: {msg}",
)
1 change: 1 addition & 0 deletions irctest/specifications.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ def from_name(cls, name: str) -> Capabilities:

@enum.unique
class IsupportTokens(enum.Enum):
BOT = "BOT"
MONITOR = "MONITOR"
STATUSMSG = "STATUSMSG"

Expand Down
1 change: 1 addition & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@ markers =
sts

# isupport tokens
BOT
MONITOR
STATUSMSG

0 comments on commit f8ab876

Please sign in to comment.