From 9a19416731ae71452bb59718df52ad596b019b64 Mon Sep 17 00:00:00 2001
From: Val Lorentz <progval+git@progval.net>
Date: Thu, 31 Mar 2022 15:53:51 +0200
Subject: [PATCH] INVITE: Fix misunderstanding of the RFCs (#148)

They make the first argument of numerics implicit, so there is actually
no difference with Modern
---
 Makefile                       |  12 ++--
 irctest/server_tests/invite.py | 125 +++++++++------------------------
 2 files changed, 41 insertions(+), 96 deletions(-)

diff --git a/Makefile b/Makefile
index eef477a..c0d9bc7 100644
--- a/Makefile
+++ b/Makefile
@@ -49,10 +49,10 @@ ERGO_SELECTORS := \
 	and not testInfoNosuchserver \
 	$(EXTRA_SELECTORS)
 
-# testInviteUnoppedModern is the only strict test that Hybrid fails
+# testInviteUnopped is the only strict test that Hybrid fails
 HYBRID_SELECTORS := \
 	not Ergo \
-	and not testInviteUnoppedModern \
+	and not testInviteUnopped \
 	and not deprecated \
 	$(EXTRA_SELECTORS)
 
@@ -138,12 +138,12 @@ NGIRCD_SELECTORS := \
 	and (not HelpTestCase or HELPOP) \
 	$(EXTRA_SELECTORS)
 
-# testInviteUnoppedModern is the only strict test that Plexus4 fails
-# testInviteInviteOnlyModern fails because Plexus4 allows non-op to invite if (and only if) the channel is not invite-only
+# testInviteUnopped is the only strict test that Plexus4 fails
+# testInviteInviteOnly fails because Plexus4 allows non-op to invite if (and only if) the channel is not invite-only
 PLEXUS4_SELECTORS := \
 	not Ergo \
-	and not testInviteUnoppedModern \
-	and not testInviteInviteOnlyModern \
+	and not testInviteUnopped \
+	and not testInviteInviteOnly \
 	and not deprecated \
 	$(EXTRA_SELECTORS)
 
diff --git a/irctest/server_tests/invite.py b/irctest/server_tests/invite.py
index 935780b..8c07371 100644
--- a/irctest/server_tests/invite.py
+++ b/irctest/server_tests/invite.py
@@ -110,7 +110,7 @@ class InviteTestCase(cases.BaseServerTestCase):
             "got this instead: {msg}",
         )
 
-    def _testInvite(self, opped, invite_only, modern):
+    def _testInvite(self, opped, invite_only):
         """
         "Only the user inviting and the user being invited will receive
         notification of the invitation."
@@ -163,23 +163,14 @@ class InviteTestCase(cases.BaseServerTestCase):
             )
 
         self.sendLine(1, "INVITE bar #chan")
-        if modern:
-            self.assertMessageMatch(
-                self.getMessage(1),
-                command=RPL_INVITING,
-                params=["foo", "bar", "#chan"],
-                fail_msg=f"After “foo” invited “bar” to a channel, “foo” should have "
-                f"received “{RPL_INVITING} foo #chan bar” but got this instead: "
-                f"{{msg}}",
-            )
-        else:
-            self.assertMessageMatch(
-                self.getMessage(1),
-                command=RPL_INVITING,
-                params=["#chan", "bar"],
-                fail_msg=f"After “foo” invited “bar” to a channel, “foo” should have "
-                f"received “{RPL_INVITING} #chan bar” but got this instead: {{msg}}",
-            )
+        self.assertMessageMatch(
+            self.getMessage(1),
+            command=RPL_INVITING,
+            params=["foo", "bar", "#chan"],
+            fail_msg=f"After “foo” invited “bar” to a channel, “foo” should have "
+            f"received “{RPL_INVITING} foo #chan bar” but got this instead: "
+            f"{{msg}}",
+        )
 
         messages = self.getMessages(2)
         self.assertNotEqual(
@@ -197,24 +188,14 @@ class InviteTestCase(cases.BaseServerTestCase):
         )
 
     @pytest.mark.parametrize("invite_only", [True, False])
-    @cases.mark_specifications("Modern")
-    def testInviteModern(self, invite_only):
-        self._testInvite(opped=True, invite_only=invite_only, modern=True)
+    @cases.mark_specifications("RFC1459", "RFC2812", "Modern")
+    def testInvite(self, invite_only):
+        self._testInvite(opped=True, invite_only=invite_only)
 
-    @pytest.mark.parametrize("invite_only", [True, False])
-    @cases.mark_specifications("RFC1459", "RFC2812", deprecated=True)
-    def testInviteRfc(self, invite_only):
-        self._testInvite(opped=True, invite_only=invite_only, modern=False)
-
-    @cases.mark_specifications("Modern", strict=True)
-    def testInviteUnoppedModern(self):
+    @cases.mark_specifications("RFC1459", "RFC2812", "Modern", strict=True)
+    def testInviteUnopped(self):
         """Tests invites from unopped users on not-invite-only chans."""
-        self._testInvite(opped=False, invite_only=False, modern=True)
-
-    @cases.mark_specifications("RFC1459", "RFC2812", deprecated=True, strict=True)
-    def testInviteUnoppedRfc(self, opped, invite_only):
-        """Tests invites from unopped users on not-invite-only chans."""
-        self._testInvite(opped=False, invite_only=False, modern=False)
+        self._testInvite(opped=False, invite_only=False)
 
     @cases.mark_specifications("RFC2812", "Modern")
     def testInviteNoNotificationForOtherMembers(self):
@@ -248,7 +229,8 @@ class InviteTestCase(cases.BaseServerTestCase):
             "were notified: {got}",
         )
 
-    def _testInviteInviteOnly(self, modern):
+    @cases.mark_specifications("RFC1459", "RFC2812", "Modern")
+    def testInviteInviteOnly(self):
         """
         "To invite a user to a channel which is invite only (MODE
         +i), the client sending the invite must be recognised as being a
@@ -288,35 +270,17 @@ class InviteTestCase(cases.BaseServerTestCase):
         )
 
         self.sendLine(1, "INVITE bar #chan")
-        if modern:
-            self.assertMessageMatch(
-                self.getMessage(1),
-                command=ERR_CHANOPRIVSNEEDED,
-                params=["foo", "#chan", ANYSTR],
-                fail_msg=f"After “foo” invited “bar” to a channel to an invite-only "
-                f"channel without being opped, “foo” should have received "
-                f"“{ERR_CHANOPRIVSNEEDED} foo #chan :*” but got this instead: {{msg}}",
-            )
-        else:
-            self.assertMessageMatch(
-                self.getMessage(1),
-                command=ERR_CHANOPRIVSNEEDED,
-                params=["#chan", ANYSTR],
-                fail_msg=f"After “foo” invited “bar” to a channel to an invite-only "
-                f"channel without being opped, “foo” should have received "
-                f"“{ERR_CHANOPRIVSNEEDED} #chan :*” but got this instead: {{msg}}",
-            )
-
-    @cases.mark_specifications("Modern")
-    def testInviteInviteOnlyModern(self):
-        self._testInviteInviteOnly(modern=True)
-
-    @cases.mark_specifications("RFC1459", "RFC2812", deprecated=True)
-    def testInviteInviteOnlyRfc(self):
-        self._testInviteInviteOnly(modern=False)
+        self.assertMessageMatch(
+            self.getMessage(1),
+            command=ERR_CHANOPRIVSNEEDED,
+            params=["foo", "#chan", ANYSTR],
+            fail_msg=f"After “foo” invited “bar” to a channel to an invite-only "
+            f"channel without being opped, “foo” should have received "
+            f"“{ERR_CHANOPRIVSNEEDED} foo #chan :*” but got this instead: {{msg}}",
+        )
 
     @cases.mark_specifications("RFC2812", "Modern")
-    def _testInviteOnlyFromUsersInChannel(self, modern):
+    def testInviteOnlyFromUsersInChannel(self):
         """
         "if the channel exists, only members of the channel are allowed
         to invite other users"
@@ -349,26 +313,15 @@ class InviteTestCase(cases.BaseServerTestCase):
         self.getMessages(3)
 
         self.sendLine(1, "INVITE bar #chan")
-        if modern:
-            self.assertMessageMatch(
-                self.getMessage(1),
-                command=ERR_NOTONCHANNEL,
-                params=["foo", "#chan", ANYSTR],
-                fail_msg=f"After “foo” invited “bar” to a channel it is not on "
-                f"#chan, “foo” should have received "
-                f"“ERR_NOTONCHANNEL ({ERR_NOTONCHANNEL}) foo #chan :*” but "
-                f"got this instead: {{msg}}",
-            )
-        else:
-            self.assertMessageMatch(
-                self.getMessage(1),
-                command=ERR_NOTONCHANNEL,
-                params=["#chan", ANYSTR],
-                fail_msg=f"After “foo” invited “bar” to a channel it is not on "
-                f"#chan, “foo” should have received "
-                f"“ERR_NOTONCHANNEL ({ERR_NOTONCHANNEL}) #chan :*” but "
-                f"got this instead: {{msg}}",
-            )
+        self.assertMessageMatch(
+            self.getMessage(1),
+            command=ERR_NOTONCHANNEL,
+            params=["foo", "#chan", ANYSTR],
+            fail_msg=f"After “foo” invited “bar” to a channel it is not on "
+            f"#chan, “foo” should have received "
+            f"“ERR_NOTONCHANNEL ({ERR_NOTONCHANNEL}) foo #chan :*” but "
+            f"got this instead: {{msg}}",
+        )
 
         messages = self.getMessages(2)
         self.assertEqual(
@@ -378,14 +331,6 @@ class InviteTestCase(cases.BaseServerTestCase):
             "not in #chan, “bar” received something.",
         )
 
-    @cases.mark_specifications("Modern")
-    def testInviteOnlyFromUsersInChannelModern(self):
-        self._testInviteOnlyFromUsersInChannel(modern=True)
-
-    @cases.mark_specifications("RFC2812", deprecated=True)
-    def testInviteOnlyFromUsersInChannelRfc(self):
-        self._testInviteOnlyFromUsersInChannel(modern=False)
-
     @cases.mark_specifications("Modern")
     def testInviteAlreadyInChannel(self):
         """