From ecc560adebc55a4606f39ba9f7c5744e7a1f7c89 Mon Sep 17 00:00:00 2001
From: Val Lorentz <progval+git@progval.net>
Date: Sat, 16 Sep 2023 13:10:56 +0200
Subject: [PATCH] Make AWAY and away-notify tests stricter (#222)

* Make AWAY and away-notify tests stricter

* Check AWAY is not echoed on JOIN
---
 irctest/server_tests/away.py        | 16 +++++++++-----
 irctest/server_tests/away_notify.py | 33 +++++++++++++++++++++++------
 2 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/irctest/server_tests/away.py b/irctest/server_tests/away.py
index d8cd059..36841d6 100644
--- a/irctest/server_tests/away.py
+++ b/irctest/server_tests/away.py
@@ -11,13 +11,14 @@ from irctest.numerics import (
     RPL_USERHOST,
     RPL_WHOISUSER,
 )
-from irctest.patma import StrRe
+from irctest.patma import ANYSTR, StrRe
 
 
 class AwayTestCase(cases.BaseServerTestCase):
     @cases.mark_specifications("RFC2812", "Modern")
     def testAway(self):
         self.connectClient("bar")
+        self.getMessages(1)
         self.sendLine(1, "AWAY :I'm not here right now")
         replies = self.getMessages(1)
         self.assertIn(RPL_NOWAWAY, [msg.command for msg in replies])
@@ -29,6 +30,7 @@ class AwayTestCase(cases.BaseServerTestCase):
             command=RPL_AWAY,
             params=["qux", "bar", "I'm not here right now"],
         )
+        self.getMessages(1)
 
         self.sendLine(1, "AWAY")
         replies = self.getMessages(1)
@@ -47,12 +49,16 @@ class AwayTestCase(cases.BaseServerTestCase):
         """
         self.connectClient("bar")
         self.sendLine(1, "AWAY :I'm not here right now")
-        replies = self.getMessages(1)
-        self.assertIn(RPL_NOWAWAY, [msg.command for msg in replies])
+        self.assertMessageMatch(
+            self.getMessage(1), command=RPL_NOWAWAY, params=["bar", ANYSTR]
+        )
+        self.assertEqual(self.getMessages(1), [])
 
         self.sendLine(1, "AWAY")
-        replies = self.getMessages(1)
-        self.assertIn(RPL_UNAWAY, [msg.command for msg in replies])
+        self.assertMessageMatch(
+            self.getMessage(1), command=RPL_UNAWAY, params=["bar", ANYSTR]
+        )
+        self.assertEqual(self.getMessages(1), [])
 
     @cases.mark_specifications("Modern")
     def testAwayPrivmsg(self):
diff --git a/irctest/server_tests/away_notify.py b/irctest/server_tests/away_notify.py
index 3e9034e..0efd021 100644
--- a/irctest/server_tests/away_notify.py
+++ b/irctest/server_tests/away_notify.py
@@ -3,6 +3,8 @@
 """
 
 from irctest import cases
+from irctest.numerics import RPL_NOWAWAY, RPL_UNAWAY
+from irctest.patma import ANYSTR, StrRe
 
 
 class AwayNotifyTestCase(cases.BaseServerTestCase):
@@ -20,13 +22,28 @@ class AwayNotifyTestCase(cases.BaseServerTestCase):
         self.getMessages(1)
 
         self.sendLine(2, "AWAY :i'm going away")
-        self.getMessages(2)
+        self.assertMessageMatch(
+            self.getMessage(2), command=RPL_NOWAWAY, params=["bar", ANYSTR]
+        )
+        self.assertEqual(self.getMessages(2), [])
 
         awayNotify = self.getMessage(1)
-        self.assertMessageMatch(awayNotify, command="AWAY", params=["i'm going away"])
-        self.assertTrue(
-            awayNotify.prefix.startswith("bar!"),
-            "Unexpected away-notify source: %s" % (awayNotify.prefix,),
+        self.assertMessageMatch(
+            awayNotify,
+            prefix=StrRe("bar!.*"),
+            command="AWAY",
+            params=["i'm going away"],
+        )
+
+        self.sendLine(2, "AWAY")
+        self.assertMessageMatch(
+            self.getMessage(2), command=RPL_UNAWAY, params=["bar", ANYSTR]
+        )
+        self.assertEqual(self.getMessages(2), [])
+
+        awayNotify = self.getMessage(1)
+        self.assertMessageMatch(
+            awayNotify, prefix=StrRe("bar!.*"), command="AWAY", params=[]
         )
 
     @cases.mark_capabilities("away-notify")
@@ -45,7 +62,11 @@ class AwayNotifyTestCase(cases.BaseServerTestCase):
         self.getMessages(2)
 
         self.joinChannel(2, "#chan")
-        self.getMessages(2)
+        self.assertNotIn(
+            "AWAY",
+            [m.command for m in self.getMessages(2)],
+            "joining user got their own away status when they joined",
+        )
 
         messages = [msg for msg in self.getMessages(1) if msg.command == "AWAY"]
         self.assertEqual(