- src/ 按域组织骨架,示例域 items 双后端实现(SQLAlchemy2.0 async / Beanie 2.x) - DB_BACKEND 环境变量切换,router 只依赖 Repo Protocol - alembic 迁移(含初始 items 迁移)、uv 依赖管理、ruff、pytest 异步测试 - Dockerfile + docker-compose(app/mysql/mongo) - AGENTS.md 重写为本模板开发规范;原最佳实践文档归档 docs/ - 验证:mongodb/mysql 双后端 pytest 全绿 + uvicorn 真实冒烟通过
34 lines
1005 B
Python
34 lines
1005 B
Python
async def test_health(client):
|
|
resp = await client.get("/health")
|
|
assert resp.status_code == 200
|
|
assert resp.json()["status"] == "ok"
|
|
|
|
|
|
async def test_items_crud(client):
|
|
# create
|
|
resp = await client.post("/api/v1/items", json={"name": "demo", "description": "d"})
|
|
assert resp.status_code == 201
|
|
item = resp.json()
|
|
assert item["name"] == "demo"
|
|
item_id = item["id"]
|
|
|
|
# get
|
|
resp = await client.get(f"/api/v1/items/{item_id}")
|
|
assert resp.status_code == 200
|
|
|
|
# list
|
|
resp = await client.get("/api/v1/items")
|
|
assert resp.status_code == 200
|
|
assert resp.json()["total"] >= 1
|
|
|
|
# update
|
|
resp = await client.patch(f"/api/v1/items/{item_id}", json={"name": "demo2"})
|
|
assert resp.status_code == 200
|
|
assert resp.json()["name"] == "demo2"
|
|
|
|
# delete
|
|
resp = await client.delete(f"/api/v1/items/{item_id}")
|
|
assert resp.status_code == 204
|
|
resp = await client.get(f"/api/v1/items/{item_id}")
|
|
assert resp.status_code == 404
|