Support direct CF and CFE inputs in AI structure flow
This commit is contained in:
@@ -1862,6 +1862,7 @@ def test_html5_ai_structure_routes_binary_cf_through_windows_agent(tmp_path: Pat
|
||||
assert claimed.status_code == 200
|
||||
assert claimed.json()["job_id"] == job_id
|
||||
assert claimed.json()["source"] == "CF_FILE"
|
||||
assert claimed.json()["local_path"] == str(cf_input)
|
||||
|
||||
completed = client.post(
|
||||
f"/agent/jobs/{job_id}/result",
|
||||
@@ -1887,6 +1888,79 @@ def test_html5_ai_structure_routes_binary_cf_through_windows_agent(tmp_path: Pat
|
||||
assert (output / f"codex-1c-context-{project_id}" / "AGENTS.md").exists()
|
||||
|
||||
|
||||
def test_html5_ai_structure_routes_binary_cfe_through_windows_agent(tmp_path: Path):
|
||||
metadata_root = tmp_path / "extension"
|
||||
metadata_root.mkdir()
|
||||
(metadata_root / "metadata.xml").write_text(
|
||||
"""
|
||||
<Configuration>
|
||||
<Catalog name="Контрагенты" qualifiedName="Справочник.Контрагенты" />
|
||||
</Configuration>
|
||||
""",
|
||||
encoding="utf-8",
|
||||
)
|
||||
cfe_input = tmp_path / "MyExtension.cfe"
|
||||
cfe_input.write_bytes(b"binary-cfe")
|
||||
output = tmp_path / "ai-out-cfe"
|
||||
client = TestClient(app)
|
||||
project_id = f"ai-agent-cfe-{uuid4()}"
|
||||
agent_id = f"win-agent-{uuid4()}"
|
||||
|
||||
indexed = client.post("/projects/index", json={"path": str(metadata_root), "project_id": project_id})
|
||||
assert indexed.status_code == 200
|
||||
settings = client.post(
|
||||
f"/projects/{project_id}/settings",
|
||||
json={
|
||||
"name": "AI Agent Extension Demo",
|
||||
"structure_source": "CFE_FILE",
|
||||
"agent": {
|
||||
"cf_agent_id": agent_id,
|
||||
},
|
||||
},
|
||||
)
|
||||
assert settings.status_code == 200
|
||||
heartbeat = client.post("/agent/heartbeat", json={"agent_id": agent_id, "host": "test-host"})
|
||||
assert heartbeat.status_code == 200
|
||||
|
||||
queued = client.post(
|
||||
f"/html5/projects/{project_id}/ai-structure/run",
|
||||
data={"project_id": project_id, "input_path": str(cfe_input), "output_path": str(output)},
|
||||
)
|
||||
assert queued.status_code == 200
|
||||
match = re.search(r"/html5/projects/[^/]+/ai-structure/jobs/([A-Za-z0-9-]+)", queued.text)
|
||||
assert match is not None
|
||||
job_id = match.group(1)
|
||||
|
||||
claimed = client.get("/agent/jobs/next", params={"agent_id": agent_id})
|
||||
assert claimed.status_code == 200
|
||||
assert claimed.json()["job_id"] == job_id
|
||||
assert claimed.json()["source"] == "CFE_FILE"
|
||||
assert claimed.json()["local_path"] == str(cfe_input)
|
||||
assert claimed.json()["metadata"]["one_c_extension"] == "MyExtension"
|
||||
|
||||
completed = client.post(
|
||||
f"/agent/jobs/{job_id}/result",
|
||||
json={
|
||||
"status": "SUCCEEDED",
|
||||
"server_path": str(metadata_root),
|
||||
"logs": ["Выгрузка расширения завершена."],
|
||||
},
|
||||
)
|
||||
assert completed.status_code == 200
|
||||
|
||||
deadline = time.monotonic() + 10
|
||||
fragment = ""
|
||||
while time.monotonic() < deadline:
|
||||
polled = client.get(f"/html5/projects/{project_id}/ai-structure/jobs/{job_id}")
|
||||
assert polled.status_code == 200
|
||||
fragment = polled.text
|
||||
if "готово" in fragment:
|
||||
break
|
||||
time.sleep(0.05)
|
||||
assert "готово" in fragment
|
||||
assert (output / f"codex-1c-context-{project_id}" / "AGENTS.md").exists()
|
||||
|
||||
|
||||
def test_import_full_replace_replaces_current_normalized_project(tmp_path: Path):
|
||||
first = tmp_path / "first"
|
||||
second = tmp_path / "second"
|
||||
|
||||
Reference in New Issue
Block a user