diff --git a/app/api/v1/knowledge.py b/app/api/v1/knowledge.py index fe49c8b..b9611d2 100644 --- a/app/api/v1/knowledge.py +++ b/app/api/v1/knowledge.py @@ -4,11 +4,10 @@ from functools import lru_cache from typing import Any import structlog -from fastapi import APIRouter, Depends +from fastapi import APIRouter from app.api.response import ApiError, ok from app.config import settings -from app.core.auth import AuthUser, get_current_user from app.models.knowledge import UNCATEGORIZED, TaxonomyCategory, load_taxonomy from app.services.qdrant import ALL_COLLECTIONS, COLLECTION_L1, QdrantService @@ -37,14 +36,14 @@ def _get_taxonomy() -> list[TaxonomyCategory]: @router.get("/knowledge/categories") -async def list_categories(user: AuthUser = Depends(get_current_user)) -> dict[str, Any]: +async def list_categories() -> dict[str, Any]: """返回完整知识分类类目集""" categories = _get_taxonomy() return ok({"categories": [c.model_dump() for c in categories], "count": len(categories)}) @router.get("/knowledge/stats") -async def knowledge_stats(user: AuthUser = Depends(get_current_user)) -> dict[str, Any]: +async def knowledge_stats() -> dict[str, Any]: """返回四层集合规模与 L1 类目分布统计""" service = _get_qdrant() try: diff --git a/app/api/v1/search.py b/app/api/v1/search.py index 7eb2ff1..4ff592d 100644 --- a/app/api/v1/search.py +++ b/app/api/v1/search.py @@ -4,10 +4,9 @@ from hashlib import sha256 from typing import Any import structlog -from fastapi import APIRouter, Depends +from fastapi import APIRouter from app.api.response import ApiError, ok -from app.core.auth import AuthUser, get_current_user from app.core.retriever import Retriever from app.models.search import SearchRequest from app.services.redis import get_cache @@ -34,7 +33,7 @@ def _cache_key(request: SearchRequest) -> str: @router.post("/search") -async def search(request: SearchRequest, user: AuthUser = Depends(get_current_user)) -> dict[str, Any]: +async def search(request: SearchRequest) -> dict[str, Any]: """分层检索入口,返回统一包装的 SearchResponse 先查 Redis 缓存:命中直接返回缓存的响应;未命中走检索流程并回写缓存。 diff --git a/tests/conftest.py b/tests/conftest.py index bb1339e..e3731d0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,39 +1,23 @@ -"""pytest 全局夹具:覆盖 JWT 认证依赖,让现有 API 测试默认以 admin 身份运行 +"""pytest 全局夹具 -业务接口(search/knowledge/settings)仍使用 app.core.auth 的 JWT 依赖, -这里通过 autouse 夹具把两个依赖统一替换为返回固定 admin AuthUser 的 lambda, -使现有 API 测试无需改动即可通过认证。单个测试需要走真实认证逻辑时, -可在测试函数内 pop 掉对应 override,autouse fixture yield 后会统一 clear。 +鉴权采用 app.api.deps 的会话体系(UserStore / SessionStore): +- 文档变更类端点(POST /documents、/documents/upload、DELETE /documents/{id})、 + /auth/* 与 Settings 变更端点需要登录; +- 查询类端点(POST /search、GET /knowledge/*、GET /documents*、 + GET /documents/{id}/file)免登录。 -文档变更类端点(POST /documents、/documents/upload、DELETE /documents/{id}) -使用 app.api.deps 的会话认证(UserStore/SessionStore),由 auth_stores / -admin_headers 夹具注入内存存储并签发真实 session token。 +auth_stores / admin_headers 夹具注入内存存储并签发真实 session token, +供需要登录的接口测试使用;查询类端点测试直接无 token 调用即可,无需覆盖依赖。 另外清理 LLM 客户端 / 解析插件 / 去重策略三处进程级缓存,避免跨测试串扰 (不同测试可能注入不同的 redis/ollama 实例,缓存按配置签名而非实例区分)。 """ import asyncio -from datetime import UTC, datetime from typing import Any import pytest -from app.core.auth import get_current_user, require_admin -from app.main import app -from app.models.auth import AuthUser - -TEST_USER = AuthUser(username="testuser", role="admin", created_at=datetime.now(UTC)) - - -@pytest.fixture(autouse=True) -def override_auth(): - """所有测试默认以 admin 身份运行(旧 JWT 依赖);测试结束清理 dependency_overrides""" - app.dependency_overrides[get_current_user] = lambda: TEST_USER - app.dependency_overrides[require_admin] = lambda: TEST_USER - yield - app.dependency_overrides.clear() - @pytest.fixture def auth_stores(monkeypatch: pytest.MonkeyPatch):