This commit is contained in:
@@ -274,3 +274,58 @@ async def test_new_interfaces_require_login_and_same_origin(client):
|
||||
json=construction("none"),
|
||||
)
|
||||
).status_code == 403
|
||||
|
||||
|
||||
@pytest.mark.parametrize("decision", ["approve", "deny", "tamper", "archive"])
|
||||
async def test_template_collection_single_confirmation(app, logged_in, fixed_input, decision):
|
||||
from app.models import ResearchExperiment
|
||||
from tests.test_research_workspace import expansion
|
||||
|
||||
await setup(app)
|
||||
await configure(app, logged_in)
|
||||
body = expansion(fixed_input["id"])
|
||||
body["template"]["expression"] = "rank({field}) + {offset}"
|
||||
body["template"]["variables"]["offset"] = {"kind": "integer", "values": list(range(20))}
|
||||
response = await logged_in.post("/api/v1/research/experiments", json=body)
|
||||
assert response.status_code == 201, response.text
|
||||
experiment = response.json()
|
||||
assert len(experiment["candidates"]) == 40
|
||||
app.state.ai.model_factory = single_tool_factory("start_template_backtest", {
|
||||
"experiment_id": experiment["id"],
|
||||
"candidate_ids": [c["client_item_id"] for c in experiment["candidates"]],
|
||||
"idempotency_key": "template-confirm",
|
||||
})
|
||||
conversation = (await logged_in.post("/api/v1/ai/conversations")).json()["id"]
|
||||
run = await ask(logged_in, conversation, "回测这个模板集合")
|
||||
assert run["status"] == "waiting_approval", run
|
||||
assert len(run["tools"]) == 1
|
||||
approval = run["tools"][0]
|
||||
preview = approval["preview"]["backtest"]
|
||||
assert preview["total"] == 40 and len(preview["items"]) < 40
|
||||
async with app.state.sessions.begin() as db:
|
||||
assert await db.scalar(select(func.count()).select_from(BacktestRun)) == 0
|
||||
assert await db.scalar(select(func.count()).select_from(BacktestPreview)) == 1
|
||||
if decision == "tamper":
|
||||
saved = await db.get(BacktestPreview, preview["preview_id"])
|
||||
candidates = copy.deepcopy(saved.candidates)
|
||||
candidates[-1]["expression"] = "rank(close)"
|
||||
saved.candidates = candidates
|
||||
elif decision == "archive":
|
||||
saved = await db.get(ResearchExperiment, experiment["id"])
|
||||
saved.archived = True
|
||||
for _ in range(2):
|
||||
result = await logged_in.post(f"/api/v1/ai/approvals/{approval['id']}/decision",
|
||||
json={"approved": decision != "deny"})
|
||||
assert result.status_code == 200, result.text
|
||||
async with app.state.sessions() as db:
|
||||
runs = (await db.scalars(select(BacktestRun))).all()
|
||||
assert len(runs) == (1 if decision == "approve" else 0)
|
||||
assert await db.scalar(select(func.count()).select_from(BacktestPreview)) == 1
|
||||
if runs:
|
||||
assert runs[0].preview_id == preview["preview_id"]
|
||||
assert runs[0].source["kind"] == "template"
|
||||
assert runs[0].source["research_id"] == experiment["id"]
|
||||
assert runs[0].ai_context["conversation_id"] == conversation
|
||||
assert runs[0].ai_context["ai_run_id"] == run["id"]
|
||||
saved = await db.get(BacktestPreview, runs[0].preview_id)
|
||||
assert len(saved.candidates) == 40
|
||||
|
||||
Reference in New Issue
Block a user