Files
llm/tests/1c/test_additional_attributes.py
T
2026-08-14 09:40:51 +03:00

139 lines
5.6 KiB
Python

from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
CONNECTOR = ROOT / "plugins" / "1c" / "connector"
if str(CONNECTOR) not in sys.path:
sys.path.insert(0, str(CONNECTOR))
import adapter_1c_server as adapter # noqa: E402
def test_additional_attributes_find_reports_empty_source_not_silent_empty(monkeypatch) -> None:
monkeypatch.setattr(adapter, "require_base_id", lambda _payload, _method: "upo_test")
monkeypatch.setattr(
adapter,
"data_read",
lambda _payload, method: {
"status": "ok",
"object": {"ref": "ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения"},
"rows": [],
"counts": {"rows": 0},
"route_diagnostics": {"status": "empty_source", "source_count": 0},
},
)
result = adapter.additional_attributes_find({"base_id": "upo_test", "query": "Ответственное направление"})
assert result["status"] == "empty_source"
assert result["properties"] == []
assert result["diagnostics"]["route"]["source_count"] == 0
def test_additional_attributes_storage_refuses_to_guess_storage_route() -> None:
result = adapter.additional_attributes_storage_resolve(
{
"base_id": "upo_test",
"property_ref": "0123456789ABCDEF0123456789ABCDEF",
"owner_ref": "Catalog.СтруктурныеЕдиницы",
}
)
assert result["status"] == "unresolved"
assert result["storage"] is None
assert "will not infer" in result["diagnostics"]["message"]
def test_additional_attributes_storage_confirms_metadata_evidenced_route(monkeypatch) -> None:
monkeypatch.setattr(adapter, "list_objects", lambda *_args, **_kwargs: {"objects": [{"ref": "InformationRegister.ДополнительныеСведения"}]})
monkeypatch.setattr(
adapter,
"metadata_object_attributes",
lambda _payload: {
"status": "ok",
"dimensions": [
{"name": "Объект", "type": {"kind": "reference"}},
{"name": "Свойство", "type": {"resolved": {"kind": "ChartOfCharacteristicTypes", "name": "ДополнительныеРеквизитыИСведения"}}},
],
"resources": [{"name": "Значение", "type": {"kind": "composite"}}],
},
)
result = adapter.additional_attributes_storage_resolve(
{
"base_id": "upo_test",
"property_ref": "0123456789ABCDEF0123456789ABCDEF",
"owner_ref": "Catalog.СтруктурныеЕдиницы",
}
)
assert result["status"] == "confirmed"
assert result["storage"]["source_ref"] == "InformationRegister.ДополнительныеСведения"
assert result["storage"]["fields"] == {"object": "Объект", "property": "Свойство", "value": "Значение"}
assert result["scd_join"]["parameters"]["Свойство"] == "0123456789ABCDEF0123456789ABCDEF"
def test_additional_attributes_storage_requires_public_inputs() -> None:
result = adapter.additional_attributes_storage_resolve({"base_id": "upo_test", "owner_ref": "Catalog.СтруктурныеЕдиницы"})
assert result["status"] == "invalid_argument"
assert result["argument"] == "property_ref"
def test_chart_semantics_exposes_only_evidenced_chart_level_value_types(monkeypatch) -> None:
monkeypatch.setattr(adapter, "config_tree_item_at_path", lambda _tree, path: {"path": path})
monkeypatch.setattr(adapter, "public_pattern_value_type", lambda *_args, **_kwargs: {"kind": "union", "count": 2})
result = adapter.chart_of_characteristic_types_sql_details("upo_test", {"type": "list"}, table="Config", timeout_seconds=30)
assert result["allowed_value_types"] == {"kind": "union", "count": 2}
assert result["evidence"]["config_path"] == "1.18"
def test_chart_data_list_accepts_description_contains_filter(monkeypatch) -> None:
monkeypatch.setattr(
adapter,
"data_object_schema",
lambda _payload: {
"status": "ok",
"base_id": "upo_test",
"table": {"name": "_Chrc1"},
"object": {"kind": "ChartOfCharacteristicTypes"},
"fields": [
{"name": "ref", "physical_name": "_IDRRef", "type": {}},
{"name": "description", "physical_name": "_Description", "type": {}},
{"name": "marked_for_deletion", "physical_name": "_Marked", "type": {}},
],
},
)
captured: dict[str, object] = {}
def fake_sql(_base_id, sql, params, **_kwargs):
captured["sql"] = sql
captured["params"] = params
return [], None
monkeypatch.setattr(adapter, "data_sql_rows", fake_sql)
result = adapter.data_read(
{
"base_id": "upo_test",
"ref": "ChartOfCharacteristicTypes.Тест",
"fields": ["ref", "description"],
"filters": {"description": {"operator": "contains", "value": "Ответственное направление"}},
}
)
assert result["status"] == "ok"
assert "[_Description] LIKE %s" in str(captured["sql"])
assert "%Ответственное направление%" in captured["params"]
def test_password_test_mode_accepts_explicit_global_unauthenticated_profile(monkeypatch) -> None:
monkeypatch.delenv("ONEC_INFOBASE_USER_ADMIN_ALLOW_UNAUTHENTICATED", raising=False)
monkeypatch.setenv("ONEC_ADAPTER_ALLOW_UNAUTHENTICATED_ADMIN", "true")
assert adapter.infobase_user_password_unauthenticated_test_mode() is True