{
  "test_files": [
    {
      "path": "tests/conftest.py",
      "content": "\"\"\"Shared test fixtures.\"\"\"\nimport pytest\nimport pytest_asyncio\nfrom httpx import ASGITransport, AsyncClient\nfrom sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker\nfrom src.database import Base, get_db\nfrom src.main import app\n\nTEST_DB_URL = \"sqlite+aiosqlite:///./test.db\"\nengine = create_async_engine(TEST_DB_URL, echo=False)\nTestSession = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)\n\n@pytest_asyncio.fixture\nasync def db_session():\n    async with engine.begin() as conn:\n        await conn.run_sync(Base.metadata.create_all)\n    async with TestSession() as session:\n        yield session\n    async with engine.begin() as conn:\n        await conn.run_sync(Base.metadata.drop_all)\n\n@pytest_asyncio.fixture\nasync def client(db_session):\n    async def _get_test_db():\n        yield db_session\n    app.dependency_overrides[get_db] = _get_test_db\n    transport = ASGITransport(app=app)\n    async with AsyncClient(transport=transport, base_url=\"http://test\") as ac:\n        yield ac\n    app.dependency_overrides.clear()\n",
      "tests_count": 0,
      "coverage_areas": ["fixtures"]
    },
    {
      "path": "tests/test_items.py",
      "content": "\"\"\"Tests for items CRUD endpoints.\"\"\"\nimport pytest\nfrom httpx import AsyncClient\n\n@pytest.mark.asyncio\nasync def test_create_item_returns_201(client: AsyncClient):\n    resp = await client.post(\"/api/v1/items\", json={\"name\": \"Widget\", \"description\": \"A widget\"})\n    assert resp.status_code == 201\n    data = resp.json()\n    assert data[\"name\"] == \"Widget\"\n    assert \"id\" in data\n\n@pytest.mark.asyncio\nasync def test_list_items_empty(client: AsyncClient):\n    resp = await client.get(\"/api/v1/items\")\n    assert resp.status_code == 200\n    assert resp.json() == []\n\n@pytest.mark.asyncio\nasync def test_get_item_not_found(client: AsyncClient):\n    resp = await client.get(\"/api/v1/items/999\")\n    assert resp.status_code == 404\n\n@pytest.mark.asyncio\nasync def test_update_item(client: AsyncClient):\n    create = await client.post(\"/api/v1/items\", json={\"name\": \"Old\"})\n    item_id = create.json()[\"id\"]\n    resp = await client.patch(f\"/api/v1/items/{item_id}\", json={\"name\": \"New\"})\n    assert resp.status_code == 200\n    assert resp.json()[\"name\"] == \"New\"\n\n@pytest.mark.asyncio\nasync def test_delete_item(client: AsyncClient):\n    create = await client.post(\"/api/v1/items\", json={\"name\": \"ToDelete\"})\n    item_id = create.json()[\"id\"]\n    resp = await client.delete(f\"/api/v1/items/{item_id}\")\n    assert resp.status_code == 204\n    get_resp = await client.get(f\"/api/v1/items/{item_id}\")\n    assert get_resp.status_code == 404\n",
      "tests_count": 5,
      "coverage_areas": ["create", "list", "get", "update", "delete"]
    }
  ],
  "total_tests": 5,
  "coverage_estimate_pct": 90
}
