diff --git a/irctest/server_tests/list.py b/irctest/server_tests/list.py index 2063acb..6b8f682 100644 --- a/irctest/server_tests/list.py +++ b/irctest/server_tests/list.py @@ -238,6 +238,112 @@ class ListTestCase(_BasedListTestCase): self.sendLine(3, "LIST <100") self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"}) + @cases.mark_specifications("Modern") + def testListTwoChannels(self): + """ + "Parameters: [{,}] [{,}]" + -- https://modern.ircdocs.horse/#list-message + """ + self.connectClient("foo") + + if "U" not in self.server_support.get("ELIST", ""): + raise runner.OptionalExtensionNotSupported("ELIST=U") + + if "TARGMAX" in self.server_support: + for item in (self.server_support["TARGMAX"]).split(","): + (command, max_) = item.split(":", 1) + if command == "LIST" and int(max_ or "1000") < 2: + raise runner.OptionalExtensionNotSupported("TARGMAX=LIST >= 2") + + self.sendLine(1, "JOIN #chan1") + self.getMessages(1) + self.sendLine(1, "JOIN #chan2") + self.getMessages(1) + self.sendLine(1, "JOIN #chan3") + self.getMessages(1) + + self.connectClient("bar") + self.sendLine(2, "JOIN #chan2") + self.getMessages(2) + + self.connectClient("baz") + + self.sendLine(3, "LIST") + self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2", "#chan3"}) + + self.sendLine(3, "LIST #chan1,#chan2") + self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"}) + + @cases.mark_isupport("ELIST") + @cases.mark_specifications("Modern") + def testListTwoParams(self): + """ + "Parameters: [{,}] [{,}]" + -- https://modern.ircdocs.horse/#list-message + """ + self.connectClient("foo") + + if "U" not in self.server_support.get("ELIST", ""): + raise runner.OptionalExtensionNotSupported("ELIST=U") + + self.sendLine(1, "JOIN #chan1") + self.getMessages(1) + self.sendLine(1, "JOIN #chan2") + self.getMessages(1) + + self.connectClient("bar") + self.sendLine(2, "JOIN #chan2") + self.getMessages(2) + + self.connectClient("baz") + + self.sendLine(3, "LIST #chan1 >0") + self.assertEqual(self._parseChanList(3), {"#chan1"}) + + self.sendLine(3, "LIST #chan1 <1") + self.assertEqual(self._parseChanList(3), set()) + + self.sendLine(3, "LIST #chan1,#chan2 >0") + self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"}) + + self.sendLine(3, "LIST #chan1,#chan2 <1") + self.assertEqual(self._parseChanList(3), set()) + + @cases.mark_isupport("ELIST") + @cases.mark_specifications("Modern") + def testListTwoParamsTwoChannels(self): + """ + "Parameters: [{,}] [{,}]" + -- https://modern.ircdocs.horse/#list-message + """ + self.connectClient("foo") + + if "U" not in self.server_support.get("ELIST", ""): + raise runner.OptionalExtensionNotSupported("ELIST=U") + + if "TARGMAX" in self.server_support: + for item in (self.server_support["TARGMAX"]).split(","): + (command, max_) = item.split(":", 1) + if command == "LIST" and int(max_ or "1000") < 2: + raise runner.OptionalExtensionNotSupported("TARGMAX=LIST >= 2") + + self.sendLine(1, "JOIN #chan1") + self.getMessages(1) + self.sendLine(1, "JOIN #chan2") + self.getMessages(1) + + self.connectClient("bar") + self.sendLine(2, "JOIN #chan2") + self.getMessages(2) + + self.connectClient("baz") + + self.sendLine(3, "LIST #chan1,#chan2 >0") + self.assertEqual(self._parseChanList(3), {"#chan1", "#chan2"}) + + self.sendLine(3, "LIST #chan1,#chan2 <1") + self.assertEqual(self._parseChanList(3), set()) + class FaketimeListTestCase(_BasedListTestCase): faketime = "+1y x30" # for every wall clock second, 1 minute passed for the server diff --git a/irctest/specifications.py b/irctest/specifications.py index 9c4617b..cb68a36 100644 --- a/irctest/specifications.py +++ b/irctest/specifications.py @@ -52,6 +52,7 @@ class Capabilities(enum.Enum): @enum.unique class IsupportTokens(enum.Enum): + ACCOUNTEXTBAN = "ACCOUNTEXTBAN" BOT = "BOT" ELIST = "ELIST" INVEX = "INVEX" diff --git a/pytest.ini b/pytest.ini index 375f2bb..fe766b5 100644 --- a/pytest.ini +++ b/pytest.ini @@ -34,6 +34,7 @@ markers = sts # isupport tokens + ACCOUNTEXTBAN BOT ELIST INVEX