"""Swagger / ReDoc / OpenAPI 文档路由安全开关测试。 生产环境(APP_ENV=prod)默认关闭 /docs、/redoc、/openapi.json, 避免未授权访问泄露 API 结构;本地开发环境默认开放,可用 ENABLE_DOCS 覆盖。 """ from __future__ import annotations import pytest from app.core.config import docs_kwargs, get_settings @pytest.fixture(autouse=True) def _reset_settings_cache(): """每次测试前后清空 get_settings 的 lru_cache,避免环境变量互相污染。""" get_settings.cache_clear() yield get_settings.cache_clear() def test_docs_kwargs_enabled() -> None: assert docs_kwargs(True) == {} def test_docs_kwargs_disabled() -> None: assert docs_kwargs(False) == {"docs_url": None, "redoc_url": None, "openapi_url": None} def test_docs_disabled_by_default_in_prod(monkeypatch) -> None: monkeypatch.delenv("ENABLE_DOCS", raising=False) monkeypatch.setenv("APP_ENV", "prod") assert get_settings().enable_docs is False def test_docs_enabled_by_default_outside_prod(monkeypatch) -> None: monkeypatch.delenv("ENABLE_DOCS", raising=False) monkeypatch.setenv("APP_ENV", "local") assert get_settings().enable_docs is True def test_docs_env_override_enables_in_prod(monkeypatch) -> None: monkeypatch.setenv("ENABLE_DOCS", "true") monkeypatch.setenv("APP_ENV", "prod") assert get_settings().enable_docs is True def test_docs_env_override_disables_outside_prod(monkeypatch) -> None: monkeypatch.setenv("ENABLE_DOCS", "false") monkeypatch.setenv("APP_ENV", "local") assert get_settings().enable_docs is False def test_create_app_disables_docs_in_prod(monkeypatch, tmp_path) -> None: pytest.importorskip("fastapi") from app.main import create_app monkeypatch.delenv("ENABLE_DOCS", raising=False) monkeypatch.setenv("APP_ENV", "prod") monkeypatch.setenv("LOG_DIR", str(tmp_path)) app = create_app() assert app.docs_url is None assert app.redoc_url is None assert app.openapi_url is None def test_create_app_enables_docs_outside_prod(monkeypatch, tmp_path) -> None: pytest.importorskip("fastapi") from app.main import create_app monkeypatch.delenv("ENABLE_DOCS", raising=False) monkeypatch.setenv("APP_ENV", "local") monkeypatch.setenv("LOG_DIR", str(tmp_path)) app = create_app() assert app.docs_url == "/docs" assert app.redoc_url == "/redoc" assert app.openapi_url == "/openapi.json"