test_write_gates.py
Language Python3.2 KB79 lines
"""Every write tool refuses, without touching Bitrix, when BITRIX_WRITES is off;record ids are validated before anything is read or written."""import asyncioimport pytestimport serverrun = asyncio.runWRITE_CALLS = [lambda: server.add_lead_comment("1", "note"),lambda: server.rename_lead("1", "New name"),lambda: server.set_lead_fields("1", {"Rush Job": "yes"}),lambda: server.add_deal_comment("1", "note"),lambda: server.set_deal_title("1", "Booth"),lambda: server.set_deal_stage("1", "New"),lambda: server.set_deal_fields("1", {"Rush Job": "yes"}),lambda: server.assign_deal("1", "me"),lambda: server.link_deal_contact("1", "Ana"),lambda: server.link_deal_company("1", "Harbor"),lambda: server.create_deal("Winback", "Booth"),lambda: server.create_contact("Ana"),lambda: server.update_contact("1", name="Ana"),lambda: server.create_company("Harbor"),lambda: server.update_company("1", title="Harbor"),]@pytest.mark.parametrize("call", WRITE_CALLS)def test_writes_off_refuses_every_write(call, fake_bitrix, logged, monkeypatch):bx = fake_bitrix({})monkeypatch.setattr(server, "WRITES_ENABLED", False)assert run(call()) == "Writes are disabled on this server (BITRIX_WRITES=off). No change was made."assert bx.calls == []assert logged == []@pytest.mark.parametrize("call", [lambda: server.add_lead_comment("7x", "note"),lambda: server.rename_lead("7x", "New name"),lambda: server.set_lead_fields("7x", {"Rush Job": "yes"}),lambda: server.add_deal_comment("7x", "note"),lambda: server.set_deal_fields("7x", {"Rush Job": "yes"}),lambda: server.get_record("lead", "7x"),lambda: server.get_timeline("lead", "7x"),lambda: server.get_chat_transcript("lead", "7x"),lambda: server.get_products("7x"),lambda: server.get_stage_history("7x"),])def test_invalid_record_id_is_refused_first(call, fake_bitrix, logged):bx = fake_bitrix({})assert run(call()) == "Invalid record_id '7x': a CRM record ID is a positive integer."assert bx.calls == []def test_add_lead_comment_payload(fake_bitrix, logged):bx = fake_bitrix({"crm.timeline.comment.add": 555})assert run(server.add_lead_comment(" 250 ", " Called back \x07")) == "Posted comment 555 to lead 250 (11 chars)."assert bx.calls == [("crm.timeline.comment.add",{"fields": {"ENTITY_ID": "250", "ENTITY_TYPE": "LEAD", "COMMENT": "Called back"}})]assert logged == [("add_lead_comment", {"record_id": "250", "len": 11}, "posted comment 555")]def test_user_lookups_share_one_cache(fake_bitrix):bx = fake_bitrix({"user.get": [{"ID": "7", "NAME": "Sam", "LAST_NAME": "Lee"}]})assert run(server._user_display(7)) == "Sam Lee"assert run(server._resolve_user("7")) == ("7", "Sam Lee")assert run(server._user_display("7")) == "Sam Lee"assert bx.methods == ["user.get"]assert run(server._user_display(0)) == ""def test_user_display_falls_back_without_caching_the_error(fake_bitrix):fake_bitrix({"user.get": server.BitrixError("ACCESS_DENIED: no")})assert run(server._user_display("8")) == "user 8"with pytest.raises(server.BitrixError):run(server._resolve_user("8"))