77 lines
2.5 KiB
Python
77 lines
2.5 KiB
Python
"""Skill 能力包 API 测试。"""
|
|
|
|
from collections.abc import AsyncGenerator
|
|
|
|
import pytest
|
|
from httpx import ASGITransport, AsyncClient
|
|
|
|
from app.main import app
|
|
|
|
|
|
@pytest.fixture
|
|
async def client() -> AsyncGenerator[AsyncClient, None]:
|
|
transport = ASGITransport(app=app)
|
|
async with AsyncClient(transport=transport, base_url="http://test") as http_client:
|
|
yield http_client
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_and_list_skills(client: AsyncClient) -> None:
|
|
resp = await client.post(
|
|
"/api/v1/tools/skills",
|
|
json={
|
|
"name": "coding",
|
|
"trigger": "代码,编程",
|
|
"prompt_fragment": "你是代码助手",
|
|
"tool_bindings": ["read_file"],
|
|
},
|
|
)
|
|
assert resp.status_code == 201
|
|
assert resp.json()["name"] == "coding"
|
|
assert resp.json()["tool_bindings"] == ["read_file"]
|
|
|
|
listed = await client.get("/api/v1/tools/skills")
|
|
assert listed.status_code == 200
|
|
assert listed.json()[0]["name"] == "coding"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_update_skill(client: AsyncClient) -> None:
|
|
create = await client.post("/api/v1/tools/skills", json={"name": "s", "trigger": "代码"})
|
|
sid = create.json()["id"]
|
|
|
|
resp = await client.patch(f"/api/v1/tools/skills/{sid}", json={"status": "disabled"})
|
|
assert resp.status_code == 200
|
|
assert resp.json()["status"] == "disabled"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_delete_skill(client: AsyncClient) -> None:
|
|
create = await client.post("/api/v1/tools/skills", json={"name": "s", "trigger": "代码"})
|
|
sid = create.json()["id"]
|
|
|
|
resp = await client.delete(f"/api/v1/tools/skills/{sid}")
|
|
assert resp.status_code == 204
|
|
|
|
listed = await client.get("/api/v1/tools/skills")
|
|
assert listed.json() == []
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_duplicate_conflict(client: AsyncClient) -> None:
|
|
await client.post("/api/v1/tools/skills", json={"name": "dup"})
|
|
resp = await client.post("/api/v1/tools/skills", json={"name": "dup"})
|
|
assert resp.status_code == 409
|
|
assert resp.json()["error"]["code"] == "conflict"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_list_skills_status_filter(client: AsyncClient) -> None:
|
|
await client.post("/api/v1/tools/skills", json={"name": "a", "status": "enabled"})
|
|
await client.post("/api/v1/tools/skills", json={"name": "b", "status": "disabled"})
|
|
|
|
resp = await client.get("/api/v1/tools/skills", params={"status": "enabled"})
|
|
assert resp.status_code == 200
|
|
assert len(resp.json()) == 1
|
|
assert resp.json()[0]["name"] == "a"
|