112 lines
4.4 KiB
Python
112 lines
4.4 KiB
Python
|
|
"""
|
|||
|
|
基础单元测试 —— 测试 TodoService 的核心功能。
|
|||
|
|
|
|||
|
|
运行方式:
|
|||
|
|
cd codegen-runs/codegen_a2cef5070965479b93c5b3c07d4c8216
|
|||
|
|
pytest tests/ -v
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import pytest
|
|||
|
|
from app.services import TodoService, TodoCreate, TodoUpdate
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture
|
|||
|
|
def service() -> TodoService:
|
|||
|
|
"""每个测试用例使用独立的 TodoService 实例。"""
|
|||
|
|
return TodoService()
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TestTodoService:
|
|||
|
|
"""TodoService 核心功能测试。"""
|
|||
|
|
|
|||
|
|
def test_list_todos_should_return_mock_data(self, service: TodoService):
|
|||
|
|
"""测试初始化时自动生成假数据。"""
|
|||
|
|
todos = service.list_todos()
|
|||
|
|
assert len(todos) == 5 # 初始化了 5 条假数据
|
|||
|
|
|
|||
|
|
def test_create_todo_should_return_created_todo(self, service: TodoService):
|
|||
|
|
"""测试创建待办事项。"""
|
|||
|
|
todo_in = TodoCreate(title="新任务", completed=True)
|
|||
|
|
todo = service.create_todo(todo_in)
|
|||
|
|
assert todo.title == "新任务"
|
|||
|
|
assert todo.completed is True
|
|||
|
|
assert todo.id > 0
|
|||
|
|
|
|||
|
|
def test_get_todo_should_return_correct_todo(self, service: TodoService):
|
|||
|
|
"""测试根据 ID 获取待办事项。"""
|
|||
|
|
# 先创建
|
|||
|
|
created = service.create_todo(TodoCreate(title="测试任务"))
|
|||
|
|
# 再获取
|
|||
|
|
fetched = service.get_todo(created.id)
|
|||
|
|
assert fetched is not None
|
|||
|
|
assert fetched.id == created.id
|
|||
|
|
assert fetched.title == "测试任务"
|
|||
|
|
|
|||
|
|
def test_get_todo_should_return_none_when_not_found(self, service: TodoService):
|
|||
|
|
"""测试获取不存在的待办事项返回 None。"""
|
|||
|
|
todo = service.get_todo(99999)
|
|||
|
|
assert todo is None
|
|||
|
|
|
|||
|
|
def test_update_todo_should_update_title(self, service: TodoService):
|
|||
|
|
"""测试部分更新待办事项的标题。"""
|
|||
|
|
created = service.create_todo(TodoCreate(title="旧标题"))
|
|||
|
|
updated = service.update_todo(created.id, TodoUpdate(title="新标题"))
|
|||
|
|
assert updated is not None
|
|||
|
|
assert updated.title == "新标题"
|
|||
|
|
assert updated.completed is False # 未更新的字段保持不变
|
|||
|
|
|
|||
|
|
def test_update_todo_should_update_completed(self, service: TodoService):
|
|||
|
|
"""测试部分更新待办事项的完成状态。"""
|
|||
|
|
created = service.create_todo(TodoCreate(title="任务", completed=False))
|
|||
|
|
updated = service.update_todo(created.id, TodoUpdate(completed=True))
|
|||
|
|
assert updated is not None
|
|||
|
|
assert updated.completed is True
|
|||
|
|
assert updated.title == "任务" # 未更新的字段保持不变
|
|||
|
|
|
|||
|
|
def test_update_todo_should_return_none_when_not_found(self, service: TodoService):
|
|||
|
|
"""测试更新不存在的待办事项返回 None。"""
|
|||
|
|
result = service.update_todo(99999, TodoUpdate(title="无"))
|
|||
|
|
assert result is None
|
|||
|
|
|
|||
|
|
def test_delete_todo_should_return_true(self, service: TodoService):
|
|||
|
|
"""测试删除存在的待办事项返回 True。"""
|
|||
|
|
created = service.create_todo(TodoCreate(title="待删除"))
|
|||
|
|
result = service.delete_todo(created.id)
|
|||
|
|
assert result is True
|
|||
|
|
# 确认已删除
|
|||
|
|
assert service.get_todo(created.id) is None
|
|||
|
|
|
|||
|
|
def test_delete_todo_should_return_false_when_not_found(self, service: TodoService):
|
|||
|
|
"""测试删除不存在的待办事项返回 False。"""
|
|||
|
|
result = service.delete_todo(99999)
|
|||
|
|
assert result is False
|
|||
|
|
|
|||
|
|
def test_list_todos_after_create_and_delete(self, service: TodoService):
|
|||
|
|
"""测试增删操作后列表长度的变化。"""
|
|||
|
|
initial_count = len(service.list_todos())
|
|||
|
|
# 创建 2 个
|
|||
|
|
t1 = service.create_todo(TodoCreate(title="A"))
|
|||
|
|
t2 = service.create_todo(TodoCreate(title="B"))
|
|||
|
|
assert len(service.list_todos()) == initial_count + 2
|
|||
|
|
# 删除 1 个
|
|||
|
|
service.delete_todo(t1.id)
|
|||
|
|
assert len(service.list_todos()) == initial_count + 1
|
|||
|
|
# 删除另一个
|
|||
|
|
service.delete_todo(t2.id)
|
|||
|
|
assert len(service.list_todos()) == initial_count
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.mark.asyncio
|
|||
|
|
async def test_fastapi_health_check():
|
|||
|
|
"""简单的 FastAPI 健康检查测试(使用 TestClient)。"""
|
|||
|
|
from httpx import AsyncClient, ASGITransport
|
|||
|
|
from app.main import app
|
|||
|
|
|
|||
|
|
transport = ASGITransport(app=app)
|
|||
|
|
async with AsyncClient(transport=transport, base_url="http://test") as client:
|
|||
|
|
response = await client.get("/")
|
|||
|
|
assert response.status_code == 200
|
|||
|
|
data = response.json()
|
|||
|
|
assert "service" in data
|
|||
|
|
assert data["service"] == "Todo 管理服务"
|