AgentEvalTool/tests/integration/test_targets_api.py
sinohqb 3705945a7d test: 完整测试覆盖补全(+163 用例)
架构重构(候选 1-6):
- storage/repository.py 按域拆分为包(target/scenario/run/campaign/result)
- storage/db.py 按域拆分为包(eval/campaign/file/model_config/intelligent_eval)
- intelligent_eval/lifecycle.py 按状态机阶段拆分为包
- services/runs.py 编排逻辑下沉
- Campaigns.tsx 拆分为 campaigns/ 子组件

测试补全(候选 7):
前端(+125 用例,107→232):
- utils/ 纯函数:date/campaignTime/ruleLabels/fileTree/fileFormat/colors
- stores/tabStore 状态管理
- 核心组件:FormDrawer/PageWrapper/ChatBubble/GeneratedMessages/SectionHeader/StatCard/TurnList
- 业务组件:CaseBlock/CaseDetail/RuleOverview/WindowTimeline/RunList/TabBar/CampaignRunTimeline
- 文件管理:FileCategoryTree/FileTable
- hooks:sessionReducer/useFiles/useRunSession

后端(+38 用例,916→954):
- targets API CRUD + 404 路径
- WebSocket 连接管理器
- proxy 头部重写(CSP/X-Frame-Options)
- target 仓储 update 方法
- app 健康检查 + SPA 404
- scenarios 模板端点 + 404
- files API 边缘分支(404 场景 + 500 兜底)
- files service update_category
- 智能评估状态机迁移测试

门禁状态:
- 前端:tsc 干净 + 232 passed
- 后端:954 passed + ruff 全绿
2026-08-24 15:56:09 +08:00

100 lines
2.9 KiB
Python

"""Integration tests for the targets API."""
from pathlib import Path
import pytest
from agenteval.web.app import app
from agenteval.web.deps import get_db
from fastapi.testclient import TestClient
from sqlmodel import Session, SQLModel, create_engine
@pytest.fixture()
def targets_client(tmp_path: Path):
from agenteval.storage.db import EvalTargetDB # noqa: F401
engine = create_engine(
f"sqlite:///{tmp_path / 'targets_api.db'}",
connect_args={"check_same_thread": False},
)
SQLModel.metadata.create_all(engine)
session = Session(engine)
def override_get_db():
yield session
app.dependency_overrides[get_db] = override_get_db
with TestClient(app) as client:
yield client, session
app.dependency_overrides.clear()
session.close()
engine.dispose()
def test_create_and_get_target(targets_client):
client, _ = targets_client
resp = client.post("/api/targets", json={
"name": "测试目标",
"description": "描述",
"platform": "ai_digital_employee",
"channel_type": "tutu-api",
"channel_config": {"base_url": "https://example.com"},
})
assert resp.status_code == 200
target_id = resp.json()["id"]
resp = client.get(f"/api/targets/{target_id}")
assert resp.status_code == 200
assert resp.json()["name"] == "测试目标"
def test_list_targets(targets_client):
client, _ = targets_client
client.post("/api/targets", json={"name": "目标1"})
client.post("/api/targets", json={"name": "目标2"})
resp = client.get("/api/targets")
assert resp.status_code == 200
assert len(resp.json()) == 2
def test_update_target(targets_client):
client, _ = targets_client
resp = client.post("/api/targets", json={"name": "原名"})
target_id = resp.json()["id"]
resp = client.put(f"/api/targets/{target_id}", json={"name": "新名"})
assert resp.status_code == 200
assert resp.json()["name"] == "新名"
def test_delete_target(targets_client):
client, _ = targets_client
resp = client.post("/api/targets", json={"name": "待删除"})
target_id = resp.json()["id"]
resp = client.delete(f"/api/targets/{target_id}")
assert resp.status_code == 200
resp = client.get(f"/api/targets/{target_id}")
assert resp.status_code == 404
def test_get_nonexistent_target_returns_404(targets_client):
client, _ = targets_client
resp = client.get("/api/targets/non-existent")
assert resp.status_code == 404
def test_update_nonexistent_target_returns_404(targets_client):
client, _ = targets_client
resp = client.put("/api/targets/non-existent", json={"name": "新名"})
assert resp.status_code == 404
def test_delete_nonexistent_target_returns_404(targets_client):
client, _ = targets_client
resp = client.delete("/api/targets/non-existent")
assert resp.status_code == 404