""" 基础单元测试 —— 测试 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 管理服务"