139 lines
5.6 KiB
Python
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
|