feat(v2): 完善配置中心与可替换轨迹质检并联动预审依据
This commit is contained in:
@@ -35,7 +35,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"
|
||||
V1 = "1.0.0"
|
||||
@@ -80,7 +81,7 @@ class ImprovementReleaseTests(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:
|
||||
@@ -117,10 +118,10 @@ class ImprovementReleaseTests(unittest.TestCase):
|
||||
"""发布 v1.0.0、装配方案并真实跑一次,返回(已发布方案 id, 第一次运行)。"""
|
||||
self.draft_card(V1)
|
||||
published = self.call("POST", f"/knowledge-candidates/{CARD_ID}/transitions",
|
||||
{"action": "evaluate"}, REVIEWER)
|
||||
{"action": "evaluate"}, PUBLISHER)
|
||||
self.assertEqual(published.status_code, 200, published.text)
|
||||
published = self.call("POST", f"/knowledge-candidates/{CARD_ID}/transitions",
|
||||
{"action": "publish"}, headers=REVIEWER)
|
||||
{"action": "publish"}, headers=PUBLISHER)
|
||||
self.assertEqual(published.status_code, 200, published.text)
|
||||
self.assertEqual(published.json()["version"], V1)
|
||||
|
||||
@@ -130,13 +131,13 @@ class ImprovementReleaseTests(unittest.TestCase):
|
||||
"corporate.coverage", CARD_ID],
|
||||
"rules": ["demo.coverage"], "template": "template.ai-pre-review",
|
||||
"budget": {"timeout_seconds": 180, "max_tool_calls": 18},
|
||||
"audience": ["manager"], "run_kind": "pre_review"})
|
||||
"audience": ["manager"], "run_kind": "pre_review"}, headers=ADMIN)
|
||||
self.assertEqual(plan.status_code, 201, plan.text)
|
||||
plan_id = plan.json()["component_id"]
|
||||
self.assertEqual(self.call("POST", f"/review-plans/{plan_id}/transitions",
|
||||
{"action": "evaluate"}, REVIEWER).status_code, 200)
|
||||
{"action": "evaluate"}, PUBLISHER).status_code, 200)
|
||||
self.assertEqual(self.call("POST", f"/review-plans/{plan_id}/transitions",
|
||||
{"action": "publish"}, REVIEWER).status_code, 200)
|
||||
{"action": "publish"}, PUBLISHER).status_code, 200)
|
||||
return plan_id, self.run_with(plan_id)
|
||||
|
||||
def run_with(self, plan_id):
|
||||
@@ -168,7 +169,7 @@ class ImprovementReleaseTests(unittest.TestCase):
|
||||
self.assertEqual(created.status_code, 201, created.text)
|
||||
return created.json()
|
||||
|
||||
def approve(self, candidate, actor=REVIEWER):
|
||||
def approve(self, candidate, actor=PUBLISHER):
|
||||
"""对照评测 → 提交 → 由**另一位**身份通过审核。"""
|
||||
evaluated = self.call("POST", f"/improvements/{candidate['id']}/transitions",
|
||||
{"action": "evaluate", "evaluation": improvement_evaluation()})
|
||||
@@ -192,14 +193,14 @@ class ImprovementReleaseTests(unittest.TestCase):
|
||||
# 1) 新版本草稿 + 隔离评测(发布门禁,与候选的旧/新对照是两道不同的门)
|
||||
self.draft_card(V2)
|
||||
evaluated = self.call("POST", f"/knowledge-candidates/{CARD_ID}/transitions",
|
||||
{"action": "evaluate"}, REVIEWER)
|
||||
{"action": "evaluate"}, PUBLISHER)
|
||||
self.assertEqual(evaluated.status_code, 200, evaluated.text)
|
||||
|
||||
# 2) 改进候选:对照 → 提交 → 他人审核 → 发布(**请求体不含任何版本号**)
|
||||
candidate = self.propose_improvement(source_run_id=run_old["id"])
|
||||
self.approve(candidate)
|
||||
released = self.call("POST", f"/improvements/{candidate['id']}/transitions",
|
||||
{"action": "release"}, REVIEWER)
|
||||
{"action": "release"}, PUBLISHER)
|
||||
self.assertEqual(released.status_code, 200, released.text)
|
||||
body = released.json()
|
||||
self.assertEqual(body["status"], "released")
|
||||
@@ -239,7 +240,7 @@ class ImprovementReleaseTests(unittest.TestCase):
|
||||
|
||||
forged = self.call("POST", f"/improvements/{candidate['id']}/transitions",
|
||||
{"action": "release",
|
||||
"released_ref": {"id": CARD_ID, "version": "9.9.9"}}, REVIEWER)
|
||||
"released_ref": {"id": CARD_ID, "version": "9.9.9"}}, PUBLISHER)
|
||||
self.assertEqual(forged.status_code, 422, forged.text)
|
||||
self.assertEqual(forged.json()["error"]["code"], "INVALID_REQUEST")
|
||||
|
||||
@@ -259,7 +260,7 @@ class ImprovementReleaseTests(unittest.TestCase):
|
||||
candidate = self.propose_improvement(source_run_id=run_old["id"])
|
||||
self.approve(candidate)
|
||||
refused = self.call("POST", f"/improvements/{candidate['id']}/transitions",
|
||||
{"action": "release"}, REVIEWER)
|
||||
{"action": "release"}, PUBLISHER)
|
||||
self.assertEqual(refused.status_code, 409, refused.text)
|
||||
self.assertEqual(refused.json()["error"]["code"], "IMPROVEMENT_NOT_VALIDATED")
|
||||
|
||||
@@ -275,7 +276,7 @@ class ImprovementReleaseTests(unittest.TestCase):
|
||||
candidate = self.propose_improvement(target="question_profile")
|
||||
self.approve(candidate)
|
||||
refused = self.call("POST", f"/improvements/{candidate['id']}/transitions",
|
||||
{"action": "release"}, REVIEWER)
|
||||
{"action": "release"}, PUBLISHER)
|
||||
self.assertEqual(refused.status_code, 409, refused.text)
|
||||
self.assertIn("尚无真实发布入口", refused.json()["error"]["message"])
|
||||
with self.service.connect() as db:
|
||||
|
||||
Reference in New Issue
Block a user