"""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"