feat(v2): 完善配置中心与可替换轨迹质检并联动预审依据
This commit is contained in:
@@ -33,7 +33,8 @@ PROJECT = "DEMO-B"
|
||||
BASE = "/api/xingbang/risk-agent/project-assistant"
|
||||
PRESCREEN = BASE + "/prescreen"
|
||||
MANAGER = {"X-Xingbang-Demo-Role": "manager"}
|
||||
REVIEWER = {"X-Xingbang-Demo-Role": "reviewer"}
|
||||
ADMIN = {"X-Xingbang-Demo-Role": "admin"}
|
||||
PUBLISHER = {"Authorization": "Bearer fixture-publisher"}
|
||||
|
||||
CARD_ID = "skill.history.repayment"
|
||||
CARD_VERSION = "1.0.0"
|
||||
@@ -57,7 +58,7 @@ class CardToRunTests(unittest.TestCase):
|
||||
patch.object(api, "service", lambda: self.service),
|
||||
patch.object(prescreen_api, "_service", lambda: self.service),
|
||||
patch.object(catalog, "DB_PATH", self.path / "catalog.sqlite3"),
|
||||
patch.dict(os.environ, {"XINGBANG_AUTH_USERS": "", "XINGBANG_REQUIRE_AUTH": "0",
|
||||
patch.dict(os.environ, {"XINGBANG_AUTH_USERS": '[{"id":"config-admin-b","role":"admin","projects":["DEMO-B"],"token":"fixture-publisher"}]', "XINGBANG_REQUIRE_AUTH": "0",
|
||||
"XINGBANG_LOCAL_MODEL_URL": "", "XINGBANG_DEMO_ROLE_LOGIN": "1"}),
|
||||
]
|
||||
for item in self.patches:
|
||||
@@ -88,7 +89,7 @@ class CardToRunTests(unittest.TestCase):
|
||||
"test_cases": TEST_CASES,
|
||||
}, "demo-manager", PROJECT, origin="history_derived", source_event_ids=["event-1"])
|
||||
|
||||
def publish(self, path, headers=REVIEWER):
|
||||
def publish(self, path, headers=PUBLISHER):
|
||||
evaluated = self.call("POST", path, {"action": "evaluate"}, headers)
|
||||
self.assertEqual(evaluated.status_code, 200, evaluated.text)
|
||||
return self.call("POST", path, {"action": "publish"}, headers)
|
||||
@@ -99,7 +100,7 @@ class CardToRunTests(unittest.TestCase):
|
||||
"template": "template.ai-pre-review",
|
||||
"budget": {"timeout_seconds": 180, "max_tool_calls": 18},
|
||||
"audience": ["manager"], "run_kind": "pre_review",
|
||||
})
|
||||
}, headers=ADMIN)
|
||||
|
||||
def run_with(self, plan_id):
|
||||
queued = self.call("POST", f"/projects/{PROJECT}/runs",
|
||||
@@ -163,10 +164,10 @@ class CardToRunTests(unittest.TestCase):
|
||||
|
||||
# 发布时依赖解析拒绝未发布组件
|
||||
evaluated = self.call("POST", f"/review-plans/{plan.json()['component_id']}/transitions",
|
||||
{"action": "evaluate"}, REVIEWER)
|
||||
{"action": "evaluate"}, PUBLISHER)
|
||||
self.assertEqual(evaluated.status_code, 200, evaluated.text)
|
||||
published = self.call("POST", f"/review-plans/{plan.json()['component_id']}/transitions",
|
||||
{"action": "publish"}, REVIEWER)
|
||||
{"action": "publish"}, PUBLISHER)
|
||||
self.assertEqual(published.status_code, 409, published.text)
|
||||
|
||||
def test_missing_dependency_fails_evaluation_instead_of_being_dropped(self):
|
||||
@@ -177,12 +178,12 @@ class CardToRunTests(unittest.TestCase):
|
||||
plan_ref = plan.json()["component_id"]
|
||||
|
||||
evaluated = self.call("POST", f"/review-plans/{plan_ref}/transitions",
|
||||
{"action": "evaluate"}, REVIEWER)
|
||||
{"action": "evaluate"}, PUBLISHER)
|
||||
self.assertEqual(evaluated.status_code, 200, evaluated.text)
|
||||
self.assertFalse(evaluated.json()["passed"], "依赖缺失必须让评测不通过")
|
||||
|
||||
published = self.call("POST", f"/review-plans/{plan_ref}/transitions",
|
||||
{"action": "publish"}, REVIEWER)
|
||||
{"action": "publish"}, PUBLISHER)
|
||||
self.assertEqual(published.status_code, 409, published.text)
|
||||
|
||||
def test_plan_rejects_tool_configuration_surface(self):
|
||||
@@ -197,7 +198,7 @@ class CardToRunTests(unittest.TestCase):
|
||||
def test_transitioning_an_unknown_plan_is_404(self):
|
||||
"""不存在的方案必须是 404,不是 500(归属查询在 run() 内完成)。"""
|
||||
response = self.call("POST", "/review-plans/plan.not.exists/transitions",
|
||||
{"action": "evaluate"}, REVIEWER)
|
||||
{"action": "evaluate"}, PUBLISHER)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
self.assertEqual(response.json()["error"]["code"], "NOT_FOUND")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user