"""§2 企微 API 代理 — webhook / room-docs / 校验""" import json from pathlib import Path import pytest pytestmark = pytest.mark.integration FIXTURE = Path(__file__).parent / "fixtures" / "qiwei_webhook_sample.json" DOCID = "DOC_TEST_abc123xyz" def _webhook_payload(uid: str) -> dict: """每次使用唯一 roomId + timestamp,避免内存去重导致重复跑失败""" import time payload = json.loads(FIXTURE.read_text(encoding="utf-8")) room_id = f"ROOM_TEST_{uid}" ts = int(time.time()) for i, item in enumerate(payload.get("data", [])): item["fromRoomId"] = room_id item["timestamp"] = ts + i return payload, room_id def test_webhook_registers_room_doc(api, uid): payload, room_id = _webhook_payload(uid) data = api.assert_success(api.post("/qiwei/webhook", json=payload)) assert data["processedCount"] >= 1 assert data["docLinksFound"] >= 1 doc = api.assert_success(api.get("/qiwei/room-docs", params={"roomId": room_id})) assert doc["docId"] == DOCID assert doc["roomId"] == room_id def test_messages_after_webhook(api, uid): payload, room_id = _webhook_payload(f"msg-{uid}") api.assert_success(api.post("/qiwei/webhook", json=payload)) msgs = api.assert_success(api.get("/qiwei/messages", params={"roomId": room_id, "limit": 10})) assert isinstance(msgs, list) assert len(msgs) >= 1 def test_room_doc_anomalies_list(api): anomalies = api.assert_success(api.get("/qiwei/room-doc-anomalies")) assert isinstance(anomalies, list) def test_proxy_missing_method(api): api.assert_error(api.post("/qiwei/proxy", json={"params": {}}), 400, "VALIDATION_ERROR") def test_sync_missing_guid(api): api.assert_error(api.post("/qiwei/sync", json={"msgSeq": 0}), 400, "VALIDATION_ERROR") def test_batch_status_missing_guids(api): api.assert_error(api.post("/qiwei/staff/batch-status", json={}), 400, "VALIDATION_ERROR") def test_room_docs_not_found(api): api.assert_error(api.get("/qiwei/room-docs", params={"roomId": "nonexistent-room-xyz"}), 404, "NOT_FOUND")