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 管理服务"
|