from fastapi.testclient import TestClient
from runtime_adapter.main import app
def test_runtime_adapter_mock_import_returns_normalized_project(monkeypatch):
monkeypatch.setenv("RUNTIME_ADAPTER_MODE", "mock")
client = TestClient(app)
response = client.post("/runtime/import", json={"source_kind": "CF_FILE", "project_id": "demo"})
assert response.status_code == 200
payload = response.json()
assert payload["status"] == "mock_imported"
assert payload["mode"] == "mock"
assert payload["normalized_project"]["project_id"] == "demo"
def test_runtime_adapter_local_1c_requires_designer(monkeypatch):
monkeypatch.setenv("RUNTIME_ADAPTER_MODE", "local_1c")
monkeypatch.delenv("ONEC_DESIGNER_PATH", raising=False)
monkeypatch.setenv("ONEC_DISABLE_AUTO_DISCOVERY", "true")
client = TestClient(app)
response = client.post("/runtime/import", json={"source_kind": "CF_FILE", "path": "/tmp/demo.cf"})
assert response.status_code == 503
def test_runtime_adapter_local_1c_normalizes_edt_without_designer_execution(monkeypatch, tmp_path):
(tmp_path / "metadata.xml").write_text(
"""
""",
encoding="utf-8",
)
monkeypatch.setenv("RUNTIME_ADAPTER_MODE", "local_1c")
monkeypatch.delenv("ONEC_DESIGNER_PATH", raising=False)
monkeypatch.setenv("ONEC_DISABLE_AUTO_DISCOVERY", "true")
client = TestClient(app)
response = client.post(
"/runtime/import",
json={"source_kind": "EDT_PROJECT", "project_id": "edt", "path": str(tmp_path)},
)
assert response.status_code == 200
payload = response.json()
assert payload["status"] == "normalized"
assert payload["normalized_project"]["configuration"]["groups"][0]["name"] == "Справочники"
def test_runtime_adapter_local_1c_returns_cf_dump_plan_without_execution(monkeypatch, tmp_path):
designer = tmp_path / "1cv8.exe"
designer.write_text("", encoding="utf-8")
cf_file = tmp_path / "demo.cf"
cf_file.write_text("binary-placeholder", encoding="utf-8")
monkeypatch.setenv("RUNTIME_ADAPTER_MODE", "local_1c")
monkeypatch.setenv("ONEC_DESIGNER_PATH", str(designer))
monkeypatch.delenv("ONEC_ENABLE_DESIGNER_EXECUTION", raising=False)
client = TestClient(app)
response = client.post(
"/runtime/import",
json={"source_kind": "CF_FILE", "project_id": "cf", "path": str(cf_file)},
)
assert response.status_code == 200
payload = response.json()
assert payload["status"] == "designer_dump_planned"
assert payload["platform_found"] is True
assert any("DumpConfigToFiles" in item for item in payload["dump_plan"])
def test_runtime_adapter_live_infobase_dump_plan_redacts_password(monkeypatch, tmp_path):
designer = tmp_path / "1cv8.exe"
designer.write_text("", encoding="utf-8")
monkeypatch.setenv("RUNTIME_ADAPTER_MODE", "local_1c")
monkeypatch.setenv("ONEC_DESIGNER_PATH", str(designer))
client = TestClient(app)
response = client.post(
"/runtime/import",
json={
"source_kind": "LIVE_INFOBASE",
"project_id": "live",
"credentials_ref": "runtime://prompt/live",
"metadata": {"connection_string": 'Srvr="192.168.200.95";Ref="upo";Pwd="secret"'},
},
)
assert response.status_code == 200
payload = response.json()
plan = "\n".join(payload["dump_plan"])
assert "secret" not in plan
assert "Pwd=" in plan
def test_runtime_platform_reports_capabilities(monkeypatch, tmp_path):
designer = tmp_path / "1cv8.exe"
designer.write_text("", encoding="utf-8")
monkeypatch.setenv("RUNTIME_ADAPTER_MODE", "local_1c")
monkeypatch.setenv("ONEC_DESIGNER_PATH", str(designer))
client = TestClient(app)
response = client.get("/runtime/platform")
assert response.status_code == 200
payload = response.json()
assert payload["platform_found"] is True
assert "cf_dump_plan" in payload["capabilities"]
def test_runtime_adapter_local_1c_executes_cf_dump(monkeypatch, tmp_path):
designer = tmp_path / "fake_designer.py"
designer.write_text(
"""
import sys
from pathlib import Path
args = sys.argv[1:]
if args and args[0] == "CREATEINFOBASE":
target = next(item for item in args[1:] if item.startswith("File="))[5:].rstrip(";")
Path(target).mkdir(parents=True, exist_ok=True)
raise SystemExit(0)
if "/DumpConfigToFiles" in args:
target = Path(args[args.index("/DumpConfigToFiles") + 1])
target.mkdir(parents=True, exist_ok=True)
(target / "metadata.xml").write_text(
"",
encoding="utf-8",
)
raise SystemExit(0)
raise SystemExit(0)
""",
encoding="utf-8",
)
cf_file = tmp_path / "demo.cf"
cf_file.write_text("binary-placeholder", encoding="utf-8")
monkeypatch.setenv("RUNTIME_ADAPTER_MODE", "local_1c")
monkeypatch.setenv("ONEC_DESIGNER_PATH", str(designer))
monkeypatch.setenv("ONEC_ENABLE_DESIGNER_EXECUTION", "true")
client = TestClient(app)
response = client.post(
"/runtime/import",
json={"source_kind": "CF_FILE", "project_id": "cf-exec", "path": str(cf_file)},
)
assert response.status_code == 200
payload = response.json()
assert payload["status"] == "normalized"
assert payload["platform_found"] is True
assert payload["normalized_project"]["project_id"] == "cf-exec"
assert "Local .cf converted to metadata export" in "\n".join(payload["diagnostics"])