feat: execute workflow bridge nodes in graph runtime
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import select
|
||||
@@ -8,7 +9,7 @@ from sqlalchemy.orm import selectinload
|
||||
|
||||
from app.config import settings
|
||||
from app.domains.orders.models import Order, OrderLine
|
||||
from app.domains.products.models import Product
|
||||
from app.domains.products.models import CadFile, Product
|
||||
from app.domains.rendering.dispatch_service import dispatch_render_with_workflow
|
||||
from app.domains.rendering.models import OutputType, WorkflowDefinition, WorkflowRun
|
||||
from app.domains.rendering.workflow_config_utils import build_preset_workflow_config
|
||||
@@ -70,6 +71,47 @@ async def _seed_order_line(
|
||||
}
|
||||
|
||||
|
||||
async def _seed_renderable_order_line(
|
||||
db,
|
||||
admin_user,
|
||||
tmp_path: Path,
|
||||
) -> OrderLine:
|
||||
step_path = tmp_path / "dispatch" / "product.step"
|
||||
step_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
step_path.write_text("STEP", encoding="utf-8")
|
||||
|
||||
cad_file = CadFile(
|
||||
original_name="product.step",
|
||||
stored_path=str(step_path),
|
||||
file_hash=f"hash-{uuid.uuid4().hex}",
|
||||
parsed_objects={"objects": ["Body"]},
|
||||
)
|
||||
product = Product(
|
||||
pim_id=f"PIM-{uuid.uuid4().hex[:8]}",
|
||||
name="Dispatch Product",
|
||||
category_key="dispatch",
|
||||
cad_file=cad_file,
|
||||
cad_part_materials=[{"part_name": "Body", "material": "Steel"}],
|
||||
)
|
||||
output_type = OutputType(
|
||||
name=f"Workflow Output {uuid.uuid4().hex[:8]}",
|
||||
render_backend="auto",
|
||||
)
|
||||
order = Order(
|
||||
order_number=f"WF-{uuid.uuid4().hex[:10]}",
|
||||
created_by=admin_user.id,
|
||||
)
|
||||
order_line = OrderLine(
|
||||
order=order,
|
||||
product=product,
|
||||
output_type=output_type,
|
||||
)
|
||||
db.add_all([cad_file, product, output_type, order, order_line])
|
||||
await db.commit()
|
||||
await db.refresh(order_line)
|
||||
return order_line
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_dispatch_render_with_workflow_falls_back_to_legacy_without_workflow_definition(
|
||||
db,
|
||||
@@ -182,9 +224,13 @@ async def test_dispatch_render_with_workflow_falls_back_when_workflow_runtime_pr
|
||||
async def test_workflow_dispatch_endpoint_returns_workflow_run_with_node_results(
|
||||
client,
|
||||
db,
|
||||
admin_user,
|
||||
auth_headers,
|
||||
tmp_path,
|
||||
monkeypatch,
|
||||
):
|
||||
monkeypatch.setattr(settings, "upload_dir", str(tmp_path / "uploads"))
|
||||
order_line = await _seed_renderable_order_line(db, admin_user, tmp_path)
|
||||
workflow_definition = WorkflowDefinition(
|
||||
name=f"Dispatch Workflow {uuid.uuid4().hex[:8]}",
|
||||
config=build_preset_workflow_config("still_with_exports", {"width": 640, "height": 640}),
|
||||
@@ -200,7 +246,7 @@ async def test_workflow_dispatch_endpoint_returns_workflow_run_with_node_results
|
||||
calls.append((task_name, args, kwargs))
|
||||
return type("Result", (), {"id": f"task-{len(calls)}"})()
|
||||
|
||||
context_id = str(uuid.uuid4())
|
||||
context_id = str(order_line.id)
|
||||
monkeypatch.setattr("app.tasks.celery_app.celery_app.send_task", _fake_send_task)
|
||||
response = await client.post(
|
||||
f"/api/workflows/{workflow_definition.id}/dispatch",
|
||||
@@ -235,6 +281,8 @@ async def test_workflow_dispatch_endpoint_returns_workflow_run_with_node_results
|
||||
assert node_results["render"]["output"]["task_id"] == "task-1"
|
||||
assert node_results["blend"]["status"] == "queued"
|
||||
assert node_results["blend"]["output"]["task_id"] == "task-2"
|
||||
assert node_results["setup"]["status"] == "skipped"
|
||||
assert node_results["template"]["status"] == "skipped"
|
||||
assert node_results["setup"]["status"] == "completed"
|
||||
assert node_results["setup"]["output"]["order_line_id"] == str(order_line.id)
|
||||
assert node_results["template"]["status"] == "completed"
|
||||
assert node_results["template"]["output"]["use_materials"] is False
|
||||
assert node_results["output"]["status"] == "skipped"
|
||||
|
||||
Reference in New Issue
Block a user