"""钉钉通知测试。""" from unittest.mock import MagicMock, patch import pytest from backend.services.notification import NotificationError, build_dingtalk_payload, send_dingtalk_notification def _build_config(): return { "SERVER": "测试环境", "VERSION": "2.195.0", "APPID_NAME": "阅门户测试App", "BUNDLE_ID": "cn.touchv.a4YX061", "APPID": "647372741900537856", } def test_dingtalk_payload_matches_autopacking_content(): payload = build_dingtalk_payload( _build_config(), "https://download.example.com/app.html", "https://download.example.com/app.png", ) text = payload["markdown"]["text"] assert payload["markdown"]["title"] == "iOS应用下载" assert "## 【iOS】打包信息" in text assert "**环境:** 测试环境" in text assert "**版本:** 2.195.0" in text assert "**APP名称:** 阅门户测试App" in text assert "**包名:** cn.touchv.a4YX061" in text assert "**App Guid:** 647372741900537856" in text assert "**iOS 下载链接:** https://download.example.com/app.html" in text assert "![image](https://download.example.com/app.png)" in text def test_dingtalk_notification_skips_when_disabled(): with patch("backend.services.notification.httpx.post") as post: assert send_dingtalk_notification({}, _build_config(), "https://download.example.com/app") is False post.assert_not_called() def test_dingtalk_notification_sends_markdown(): response = MagicMock(status_code=200) response.json.return_value = {"errcode": 0} with patch("backend.services.notification.httpx.post", return_value=response) as post: assert send_dingtalk_notification( {"enabled": True, "webhook_url": "https://example.com/robot"}, _build_config(), "https://download.example.com/app.html", "https://download.example.com/app.png", ) is True assert post.call_args.kwargs["json"]["markdown"]["title"] == "iOS应用下载" def test_dingtalk_notification_requires_webhook_when_enabled(): with pytest.raises(NotificationError, match="Webhook"): send_dingtalk_notification({"enabled": True}, _build_config(), "https://download.example.com/app")