mattrguerra/meridian-crm-mcpmainPrivate on GitHub, published here in full

test_write_gates.py

Language Python3.2 KB79 lines

tests/test_write_gates.py

  1. """Every write tool refuses, without touching Bitrix, when BITRIX_WRITES is off;
  2. record ids are validated before anything is read or written."""
  3. import asyncio
  4. import pytest
  5. import server
  6. run = asyncio.run
  7. WRITE_CALLS = [
  8. lambda: server.add_lead_comment("1", "note"),
  9. lambda: server.rename_lead("1", "New name"),
  10. lambda: server.set_lead_fields("1", {"Rush Job": "yes"}),
  11. lambda: server.add_deal_comment("1", "note"),
  12. lambda: server.set_deal_title("1", "Booth"),
  13. lambda: server.set_deal_stage("1", "New"),
  14. lambda: server.set_deal_fields("1", {"Rush Job": "yes"}),
  15. lambda: server.assign_deal("1", "me"),
  16. lambda: server.link_deal_contact("1", "Ana"),
  17. lambda: server.link_deal_company("1", "Harbor"),
  18. lambda: server.create_deal("Winback", "Booth"),
  19. lambda: server.create_contact("Ana"),
  20. lambda: server.update_contact("1", name="Ana"),
  21. lambda: server.create_company("Harbor"),
  22. lambda: server.update_company("1", title="Harbor"),
  23. ]
  24. @pytest.mark.parametrize("call", WRITE_CALLS)
  25. def test_writes_off_refuses_every_write(call, fake_bitrix, logged, monkeypatch):
  26. bx = fake_bitrix({})
  27. monkeypatch.setattr(server, "WRITES_ENABLED", False)
  28. assert run(call()) == "Writes are disabled on this server (BITRIX_WRITES=off). No change was made."
  29. assert bx.calls == []
  30. assert logged == []
  31. @pytest.mark.parametrize("call", [
  32. lambda: server.add_lead_comment("7x", "note"),
  33. lambda: server.rename_lead("7x", "New name"),
  34. lambda: server.set_lead_fields("7x", {"Rush Job": "yes"}),
  35. lambda: server.add_deal_comment("7x", "note"),
  36. lambda: server.set_deal_fields("7x", {"Rush Job": "yes"}),
  37. lambda: server.get_record("lead", "7x"),
  38. lambda: server.get_timeline("lead", "7x"),
  39. lambda: server.get_chat_transcript("lead", "7x"),
  40. lambda: server.get_products("7x"),
  41. lambda: server.get_stage_history("7x"),
  42. ])
  43. def test_invalid_record_id_is_refused_first(call, fake_bitrix, logged):
  44. bx = fake_bitrix({})
  45. assert run(call()) == "Invalid record_id '7x': a CRM record ID is a positive integer."
  46. assert bx.calls == []
  47. def test_add_lead_comment_payload(fake_bitrix, logged):
  48. bx = fake_bitrix({"crm.timeline.comment.add": 555})
  49. assert run(server.add_lead_comment(" 250 ", " Called back \x07")) == "Posted comment 555 to lead 250 (11 chars)."
  50. assert bx.calls == [("crm.timeline.comment.add",
  51. {"fields": {"ENTITY_ID": "250", "ENTITY_TYPE": "LEAD", "COMMENT": "Called back"}})]
  52. assert logged == [("add_lead_comment", {"record_id": "250", "len": 11}, "posted comment 555")]
  53. def test_user_lookups_share_one_cache(fake_bitrix):
  54. bx = fake_bitrix({"user.get": [{"ID": "7", "NAME": "Sam", "LAST_NAME": "Lee"}]})
  55. assert run(server._user_display(7)) == "Sam Lee"
  56. assert run(server._resolve_user("7")) == ("7", "Sam Lee")
  57. assert run(server._user_display("7")) == "Sam Lee"
  58. assert bx.methods == ["user.get"]
  59. assert run(server._user_display(0)) == ""
  60. def test_user_display_falls_back_without_caching_the_error(fake_bitrix):
  61. fake_bitrix({"user.get": server.BitrixError("ACCESS_DENIED: no")})
  62. assert run(server._user_display("8")) == "user 8"
  63. with pytest.raises(server.BitrixError):
  64. run(server._resolve_user("8"))