"""Behavioral coverage for AI team enrollment in CS autochess.""" from __future__ import annotations import json import tempfile import unittest from pathlib import Path from test_jwebot_edge import MODULE, config from jwebot_official_extensions import cs_autochess as AUTOCHESS class Release065AiEnrollmentTests(unittest.TestCase): def setUp(self): self.temp = tempfile.TemporaryDirectory() self.engine = MODULE.EdgeApplication(config(Path(self.temp.name))) self.counter = 0 def tearDown(self): self.engine.close() self.temp.cleanup() def command(self, question, *, sender="Alice", event_id=None): self.counter += 1 response = self.engine.accept( { "event_id": event_id or f"two-ai-{self.counter}", "group_fingerprint": "group-a", "sender": sender, "text": "@JWeBot " + question, "mention_bot": True, "confidence": 1.0, "sender_confidence": 1.0, "body_confidence": 1.0, } ) self.assertEqual(response["status"], "reply") return list(response.get("texts") or [response["text"]]) def state(self): row = self.engine.ledger.connection.execute( """ SELECT state_json FROM autochess_runs WHERE group_fingerprint = 'group-a' ORDER BY season_number DESC LIMIT 1 """ ).fetchone() self.assertIsNotNone(row) return json.loads(row[0]) def test_two_humans_add_two_ai_and_lock_registration(self): self.command("/自走棋开始") self.command("/自走棋报名", sender="Bob") added = "\n".join(self.command("/自走棋加AI战队")) self.assertIn("AI 战队 A、AI 战队 B", added) self.assertIn("2 人+2 AI", added) self.assertIn( "已经锁定", "\n".join(self.command("/自走棋报名", sender="Carol")), ) launch = "\n".join(self.command("/自走棋开赛")) state = self.state() self.assertIn("2 人+2 AI 测试赛", launch) self.assertEqual(state["ai_test_variant"], "two_plus_two") self.assertEqual( state["seed_order"][2:], [AUTOCHESS.AI_PERSON_KEY, AUTOCHESS.AI_SECOND_PERSON_KEY], ) def test_three_humans_add_one_ai(self): self.command("/自走棋开始") self.command("/自走棋报名", sender="Bob") self.command("/自走棋报名", sender="Carol") added = "\n".join(self.command("/自走棋加AI战队")) self.assertIn("3 人+1 AI", added) self.command("/自走棋开赛") state = self.state() self.assertEqual(state["ai_test_variant"], "three_plus_one") self.assertEqual(state["seed_order"][-1], AUTOCHESS.AI_PERSON_KEY) self.assertTrue(state["players"][AUTOCHESS.AI_PERSON_KEY]["is_ai"]) def test_add_ai_replay_is_idempotent(self): self.command("/自走棋开始") self.command("/自走棋报名", sender="Bob") first = self.command("/自走棋加AI战队", event_id="same-add-two-ai") replay = self.command("/自走棋加AI战队", event_id="same-add-two-ai") self.assertEqual(first, replay) self.assertIn("已经加入", "\n".join(self.command("/自走棋加AI战队"))) state = self.state() self.assertEqual( sum(bool(player.get("is_ai")) for player in state["players"].values()), 2, ) if __name__ == "__main__": unittest.main()