test_merchant_integration.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from uuid import UUID
  2. import pytest
  3. from test_after_sales import scenario, takeover_customer_conversation # noqa: F401
  4. from test_knowledge_memory import document
  5. from zhifu.modules.knowledge.models import KnowledgeDocument
  6. pytestmark = pytest.mark.integration
  7. async def test_staff_proposal_requires_current_control(scenario): # noqa: F811
  8. call = scenario["call"]
  9. path = "/openapi/v1/after-sales/proposals"
  10. response = await call("POST", path, "agent", scenario["proposal"])
  11. assert response.status_code == 403
  12. control = await takeover_customer_conversation(scenario)
  13. stale = {**scenario["proposal"], **control, "expected_control_version": 1}
  14. response = await call("POST", path, "agent", stale)
  15. assert response.status_code == 409
  16. assert response.json()["code"] == "CONTROL_CONFLICT"
  17. response = await call("POST", path, "agent", {**scenario["proposal"], **control})
  18. assert response.status_code == 201, response.text
  19. ticket = response.json()
  20. conversation_path = f"/openapi/v1/conversations/{control['conversation_id']}"
  21. response = await call(
  22. "POST", conversation_path + "/release", "agent",
  23. {"expected_control_version": control["expected_control_version"]},
  24. )
  25. assert response.status_code == 200, response.text
  26. response = await call(
  27. "POST", f"{path}/{ticket['proposal_id']}/revisions", "agent",
  28. {"expected_version": ticket["version"], "quantity": 1, "reason": "释放后编辑", **control},
  29. )
  30. assert response.status_code == 403
  31. response = await call("GET", f"/openapi/v1/tickets/{ticket['ticket_id']}")
  32. assert response.json()["version"] == ticket["version"]
  33. async def test_knowledge_original_text_round_trip(scenario): # noqa: F811
  34. path = await document(scenario)
  35. # 长正文包含重复词句与换行,验证编辑读取完整原文且不会引入检索重叠内容。
  36. original = ("键盘资料正文,保留编辑时的换行和标点。\n" * 60) + "末尾说明。"
  37. payload = {"expected_version": 1, "title": "完整正文验收", "text": original}
  38. response = await scenario["call"]("PUT", path, "agent", payload)
  39. assert response.status_code == 200, response.text
  40. assert len(response.json()["chunks"]) > 1
  41. assert response.json()["text"] == original
  42. response = await scenario["call"]("GET", path, "agent")
  43. assert response.json()["text"] == original
  44. response = await scenario["call"]("PUT", path, "agent", payload)
  45. assert response.json()["version"] == 2
  46. assert response.json()["text"] == original
  47. async with scenario["app"].state.sessions.begin() as session:
  48. row = await session.get(
  49. KnowledgeDocument, (scenario["tenant"].bytes, UUID(path.rsplit("/", 1)[1]).bytes)
  50. )
  51. row.source_text = None
  52. response = await scenario["call"]("GET", path, "agent")
  53. assert response.json()["text"] is None
  54. assert response.json()["chunks"]