deer-flow/backend/tests/blocking_io/test_knowledge_platform_extension.py
王一帆 bd62f96732
feat(knowledge): add optional platform connections and hierarchical spaces (phase 3) (#7417)
* feat(knowledge): add optional platform connections and hierarchical spaces

* fix(knowledge): return actionable errors for unavailable policy storage

* perf(knowledge): resolve space policy once per snapshot
2026-10-25 19:52:31 +08:00

38 lines
2.2 KiB
Python

"""Real SQLite and policy serialization stay outside async HTTP execution."""
import asyncio
from pathlib import Path
import httpx
import pytest
from deerflow_extension_api.auth import ExtensionPrincipal
from fastapi import FastAPI
@pytest.mark.asyncio
async def test_platform_policy_and_effective_http_do_not_block(tmp_path, monkeypatch):
root = Path(__file__).resolve().parents[3]
for package in ("knowledge-platform", "knowledge-management"):
monkeypatch.syspath_prepend(str(root / "examples" / f"deerflow-extension-{package}"))
from deerflow_extension_knowledge_platform.models import Settings, resource_key
from deerflow_extension_knowledge_platform.router import build_router
from deerflow_extension_knowledge_platform.service import Platform
from deerflow_extension_knowledge_platform.store import Store
settings = Settings.model_validate({"enabled": True, "storage_path": str(tmp_path / "platform.db"), "connections": [{"id": "test", "provider": "weknora", "resources": [{"base_id": "kb", "dataset_id": "wk1_synthetic"}]}]})
store = await asyncio.to_thread(Store, settings)
app = FastAPI()
app.include_router(build_router(Platform(settings, store, {})))
app.state.deerflow_extension_principal_resolver = lambda request: ExtensionPrincipal("admin", is_admin=True)
async def authorize(request, namespace, scope):
return True
app.state.deerflow_extension_plugin_authz_resolver_async = authorize
policy = {"spaces": {"root": {"title": "Synthetic", "resources": [resource_key("weknora", "test", "kb")], "members": {"admin": "manager"}}}}
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client:
assert (await client.put("/api/extensions/knowledge-platform/policy", json={"revision": 0, "policy": policy})).status_code == 200
assert (await client.get("/api/extensions/knowledge-platform/policy")).json()["revision"] == 1
assert len((await client.get("/api/extensions/knowledge-platform/spaces")).json()["items"]) == 1
assert (await client.get("/api/extensions/knowledge-platform/spaces/root")).json()["resources"][0]["dataset_id"] == "wk1_synthetic"