Skip to content

Commit b0a254b

Browse files
committed
tests: Add adapter-level tests for merels via game_handler.
Mirror the style used by connect_four to exercise the GameAdapter flow for Merels. Use stable fragments to avoid brittleness. Included: - help shows Merels help - start game posts an invite with “wants to play”, “Merels”, “join” - join triggers start message (containment) - light checks for MerelsMessageHandler helpers No production changes; tests only. Fixes #433.
1 parent 1ca4eff commit b0a254b

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
from typing import Dict
2+
3+
from typing_extensions import override
4+
5+
from zulip_bots.test_lib import BotTestCase, DefaultTests
6+
7+
8+
class TestMerelsAdapter(BotTestCase, DefaultTests):
9+
bot_name = "merels"
10+
11+
@override
12+
def make_request_message(
13+
self, content: str, user: str = "[email protected]", user_name: str = "foo"
14+
) -> Dict[str, str]:
15+
# Include stream context; the adapter checks message["type"] and topic.
16+
return {
17+
"sender_email": user,
18+
"sender_full_name": user_name,
19+
"content": content,
20+
"type": "stream",
21+
"display_recipient": "general",
22+
"subject": "merels-test-topic",
23+
}
24+
25+
def test_help_is_merels_help(self) -> None:
26+
bot, bot_handler = self._get_handlers()
27+
28+
bot_handler.reset_transcript()
29+
bot.handle_message(self.make_request_message("help"), bot_handler)
30+
31+
responses = [m for (_method, m) in bot_handler.transcript]
32+
self.assertTrue(responses, "No bot response to 'help'")
33+
help_text = responses[0]["content"]
34+
35+
# Assert on stable fragments; avoid brittle exact-match checks.
36+
self.assertIn("Merels Bot Help", help_text)
37+
self.assertIn("start game", help_text)
38+
self.assertIn("play game", help_text)
39+
self.assertIn("quit", help_text)
40+
self.assertIn("rules", help_text)
41+
# Present today; OK to drop later if wording changes.
42+
self.assertIn("leaderboard", help_text)
43+
self.assertIn("cancel game", help_text)
44+
45+
def test_start_game_emits_invite(self) -> None:
46+
bot, bot_handler = self._get_handlers()
47+
bot_handler.reset_transcript()
48+
49+
bot.handle_message(
50+
self.make_request_message("start game", user="[email protected]", user_name="foo"),
51+
bot_handler,
52+
)
53+
54+
responses = [m["content"] for (_method, m) in bot_handler.transcript]
55+
self.assertTrue(responses, "No bot reply recorded for 'start game'")
56+
first = responses[0]
57+
self.assertIn("wants to play", first)
58+
self.assertIn("Merels", first)
59+
self.assertIn("join", first)
60+
61+
def test_join_starts_game_emits_start_message(self) -> None:
62+
bot, bot_handler = self._get_handlers()
63+
expected_fragment = bot.game_message_handler.game_start_message()
64+
65+
bot_handler.reset_transcript()
66+
bot.handle_message(
67+
self.make_request_message("start game", user="[email protected]", user_name="foo"),
68+
bot_handler,
69+
)
70+
bot.handle_message(
71+
self.make_request_message("join", user="[email protected]", user_name="bar"),
72+
bot_handler,
73+
)
74+
75+
contents = [m["content"] for (_method, m) in bot_handler.transcript]
76+
self.assertTrue(
77+
any(expected_fragment in c for c in contents),
78+
"Merels start message not found after 'join'",
79+
)
80+
81+
def test_message_handler_helpers(self) -> None:
82+
bot, _ = self._get_handlers()
83+
84+
# parse_board is identity for Merels.
85+
self.assertEqual(
86+
bot.game_message_handler.parse_board("sample_board_repr"), "sample_board_repr"
87+
)
88+
89+
# Token color is one of the known emoji.
90+
self.assertIn(
91+
bot.game_message_handler.get_player_color(0),
92+
(":o_button:", ":cross_mark_button:"),
93+
)
94+
self.assertIn(
95+
bot.game_message_handler.get_player_color(1),
96+
(":o_button:", ":cross_mark_button:"),
97+
)
98+
99+
# Basic move alert format.
100+
self.assertEqual(
101+
bot.game_message_handler.alert_move_message("foo", "move 1,1"),
102+
"foo :move 1,1",
103+
)

0 commit comments

Comments
 (0)