diff --git a/irctest/irc_utils/ambiguities.py b/irctest/irc_utils/ambiguities.py deleted file mode 100644 index 4fac710..0000000 --- a/irctest/irc_utils/ambiguities.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Handles ambiguities of RFCs. -""" - -from typing import List - - -def normalize_namreply_params(params: List[str]) -> List[str]: - # So… RFC 2812 says: - # "( "=" / "*" / "@" ) - # :[ "@" / "+" ] *( " " [ "@" / "+" ] ) - # but spaces seem to be missing (eg. before the colon), so we - # don't know if there should be one before the and its - # prefix. - # So let's normalize this to “with space”, and strip spaces at the - # end of the nick list. - params = list(params) # copy the list - if len(params) == 3: - assert params[1][0] in "=*@", params - params.insert(1, params[1][0]) - params[2] = params[2][1:] - params[3] = params[3].rstrip() - return params diff --git a/irctest/server_tests/join.py b/irctest/server_tests/join.py index 833f9c1..1a78763 100644 --- a/irctest/server_tests/join.py +++ b/irctest/server_tests/join.py @@ -6,7 +6,6 @@ The JOIN command (`RFC 1459 """ from irctest import cases, runner -from irctest.irc_utils import ambiguities from irctest.numerics import ( ERR_BADCHANMASK, ERR_FORBIDDENCHANNEL, @@ -75,33 +74,23 @@ class JoinTestCase(cases.BaseServerTestCase): for m in self.getMessages(1): if m.command == "353": - self.assertIn( - len(m.params), - (3, 4), - m, - fail_msg="RPL_NAM_REPLY with number of arguments " - "<3 or >4: {msg}", + self.assertMessageMatch( + m, params=["foo", StrRe(r"[=\*@]"), "#chan", StrRe("[@+]?foo")] ) - params = ambiguities.normalize_namreply_params(m.params) - self.assertIn( - params[1], - "=*@", + + self.connectClient("bar") + self.sendLine(2, "JOIN #chan") + + for m in self.getMessages(2): + if m.command == "353": + self.assertMessageMatch( m, - fail_msg="Bad channel prefix: {item} not in {list}: {msg}", - ) - self.assertEqual( - params[2], - "#chan", - m, - fail_msg="Bad channel name: {got} instead of " "{expects}: {msg}", - ) - self.assertIn( - params[3], - {"foo", "@foo", "+foo"}, - m, - fail_msg="Bad user list: should contain only user " - '"foo" with an optional "+" or "@" prefix, but got: ' - "{msg}", + params=[ + "bar", + StrRe(r"[=\*@]"), + "#chan", + StrRe("([@+]?foo bar|bar [@+]?foo)"), + ], ) def testJoinTwice(self): @@ -115,34 +104,8 @@ class JoinTestCase(cases.BaseServerTestCase): # if the join is successful, or has an error among the given set. for m in self.getMessages(1): if m.command == "353": - self.assertIn( - len(m.params), - (3, 4), - m, - fail_msg="RPL_NAM_REPLY with number of arguments " - "<3 or >4: {msg}", - ) - params = ambiguities.normalize_namreply_params(m.params) - self.assertIn( - params[1], - "=*@", - m, - fail_msg="Bad channel prefix: {item} not in {list}: {msg}", - ) - self.assertEqual( - params[2], - "#chan", - m, - fail_msg="Bad channel name: {got} instead of " "{expects}: {msg}", - ) - self.assertIn( - params[3], - {"foo", "@foo", "+foo"}, - m, - fail_msg='Bad user list after user "foo" joined twice ' - "the same channel: should contain only user " - '"foo" with an optional "+" or "@" prefix, but got: ' - "{msg}", + self.assertMessageMatch( + m, params=["foo", StrRe(r"[=\*@]"), "#chan", StrRe("[@+]?foo")] ) def testJoinPartiallyInvalid(self): diff --git a/irctest/server_tests/multi_prefix.py b/irctest/server_tests/multi_prefix.py index ed57b9c..fd3d821 100644 --- a/irctest/server_tests/multi_prefix.py +++ b/irctest/server_tests/multi_prefix.py @@ -24,11 +24,6 @@ class MultiPrefixTestCase(cases.BaseServerTestCase): self.sendLine(1, "NAMES #chan") reply = self.getMessage(1) - self.assertMessageMatch( - reply, - command="353", - fail_msg="Expected NAMES response (353) with @+foo, got: {msg}", - ) self.assertMessageMatch( reply, command="353", @@ -47,9 +42,57 @@ class MultiPrefixTestCase(cases.BaseServerTestCase): 8, "Expected WHO response (352) with 8 params, got: {msg}".format(msg=msg), ) - self.assertTrue( - "@+" in msg.params[6], + self.assertIn( + "@+", + msg.params[6], 'Expected WHO response (352) with "@+" in param 7, got: {msg}'.format( msg=msg ), ) + + @cases.xfailIfSoftware( + ["irc2", "Bahamut"], "irc2 and Bahamut send a trailing space" + ) + def testNoMultiPrefix(self): + """When not requested, only the highest prefix should be sent""" + self.connectClient("foo") + self.joinChannel(1, "#chan") + self.sendLine(1, "MODE #chan +v foo") + self.getMessages(1) + + # TODO(dan): Make sure +v is voice + + self.sendLine(1, "NAMES #chan") + reply = self.getMessage(1) + self.assertMessageMatch( + reply, + command="353", + params=["foo", ANYSTR, "#chan", "@foo"], + fail_msg="Expected NAMES response (353) with @foo, got: {msg}", + ) + self.getMessages(1) + + self.sendLine(1, "WHO #chan") + msg = self.getMessage(1) + self.assertEqual( + msg.command, "352", msg, fail_msg="Expected WHO response (352), got: {msg}" + ) + self.assertGreaterEqual( + len(msg.params), + 8, + "Expected WHO response (352) with 8 params, got: {msg}".format(msg=msg), + ) + self.assertIn( + "@", + msg.params[6], + 'Expected WHO response (352) with "@" in param 7, got: {msg}'.format( + msg=msg + ), + ) + self.assertNotIn( + "+", + msg.params[6], + 'Expected WHO response (352) with no "+" in param 7, got: {msg}'.format( + msg=msg + ), + )