All checks were successful
CI / test (push) Successful in 3m9s
架构深化两则(架构审查候选①②): ① scheduler 抽取:web/app.py 约 400 行触发式执行编排(60s 扫描循环、 docker exec 触发、失败落账)沉入 intelligent_eval/scheduler.py,runtime 单例 start()/stop()/scan_once() 与 campaign_runtime 惯例一致;worker/planner 两处重复触发代码合并为一个触发原语;_supplement_decision_logs 归入 decision_logs.py。测试改为直接驱动 scan_once(interface 即测试面)。 ② 决策日志去重内化:create_decision_log 的去重只服务 agent 上报路径; 新增 append_decision_log(平台落账纯追加)与 count_decisions(计数原语), lifecycle/task_queue 全部平台落账切换,调用方不再需要塞 attempt 骗去重。 零行为变化:提示词、60s 节拍、编排顺序、闸门语义原样保留,866 tests passed。
40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
"""Lifespan scheduler wiring test (v1.1.0 defect fix).
|
||
|
||
`scan_and_enqueue_tasks` previously had no scheduler — the OpenClaw Worker
|
||
wakes every minute but could never pull a task. The lifespan now starts the
|
||
intelligent-eval scheduler runtime that scans executing evals every 60s.
|
||
This test verifies that on application startup the scan is actually invoked.
|
||
|
||
编排逻辑本身(watchdog/入队/触发)的测试在
|
||
``tests/unit/test_intelligent_eval_scheduler.py``,直接驱动 ``scan_once``。
|
||
"""
|
||
|
||
from unittest.mock import MagicMock
|
||
|
||
from fastapi.testclient import TestClient
|
||
|
||
|
||
def test_lifespan_starts_scan_loop(monkeypatch):
|
||
"""Lifespan startup must invoke the intelligent-eval scan loop once."""
|
||
import agenteval.intelligent_eval.scheduler as scheduler_mod
|
||
import agenteval.intelligent_eval.task_queue as tq
|
||
import agenteval.web.app as app_mod
|
||
|
||
calls: list[int] = []
|
||
real_scan = tq.scan_and_enqueue_tasks
|
||
|
||
def fake_scan(session):
|
||
calls.append(1)
|
||
return real_scan(session)
|
||
|
||
# The scan loop calls get_session() to open a DB session; replace it with a
|
||
# no-op mock so the test does not touch the real SQLite file.
|
||
monkeypatch.setattr(scheduler_mod, "get_session", lambda: MagicMock())
|
||
monkeypatch.setattr(tq, "scan_and_enqueue_tasks", fake_scan)
|
||
|
||
with TestClient(app_mod.app) as client:
|
||
assert client.get("/api/health").status_code == 200
|
||
|
||
# The background task runs immediately (before its first 60s sleep).
|
||
assert calls, "scan_and_enqueue_tasks should have been invoked on startup"
|