from __future__ import annotations import unittest from unittest.mock import patch from backend.alerting import AlertManager class AlertManagerRobotTests(unittest.TestCase): def test_channel_status_does_not_expose_webhook(self) -> None: manager = AlertManager( wechat_webhook_url="https://example.test/wechat-secret", feishu_webhook_url="https://example.test/feishu-secret", feishu_secret="signing-secret", ) statuses = {item["id"]: item for item in manager.channel_status} self.assertTrue(statuses["wechat"]["configured"]) self.assertTrue(statuses["feishu"]["configured"]) self.assertTrue(statuses["feishu"]["signed"]) self.assertNotIn("webhook", repr(statuses).lower()) self.assertNotIn("example.test", repr(statuses)) @patch("backend.alerting.post_json", return_value={}) def test_wechat_connection_test_updates_delivery_stats( self, mocked_post_json, ) -> None: manager = AlertManager( wechat_webhook_url="https://example.test/hook" ) result = manager.test_channel("wechat") self.assertEqual(result["last_status"], "success") self.assertEqual(result["delivered"], 1) self.assertEqual(result["tests"], 1) self.assertIsNotNone(result["last_test_at"]) mocked_post_json.assert_called_once() def test_unconfigured_channel_cannot_send_test(self) -> None: manager = AlertManager() with self.assertRaisesRegex(ValueError, "尚未配置"): manager.test_channel("wechat") def test_unknown_channel_is_rejected(self) -> None: manager = AlertManager() with self.assertRaisesRegex(ValueError, "Unsupported"): manager.test_channel("unknown") if __name__ == "__main__": unittest.main()