Files
Octop/tests/unit/knowledge/test_knowledge_default_open.py
jubaoliang 5b6c91302c feat: expert composer defaults (KB + MCP) and per-user policies
Allow experts and skill packages to carry composer defaults so that
installed/created agents start with the author's chosen knowledge bases
and MCP servers. Defaults are persisted as agent profile columns and
validated against the installing user. Adds the per-user policy resource
table (migration 014) and wires the dashboard composer fields plus
locale strings.

- Add knowledge_base_ids and mcp_servers to the agent profile schema
- Validate KB/MCP ids on expert/skill-package install and create paths
- Persist defaults via migrate.py helper and 014_user_policy migration
- Surface composer default fields in the dashboard expert/skill UI
2026-09-11 02:00:01 +08:00

89 lines
2.9 KiB
Python

"""Unit tests for knowledge-base turn selection defaults."""
from __future__ import annotations
from types import SimpleNamespace
from octop.infra.knowledge.default_open import (
merge_knowledge_base_ids,
stamp_turn_knowledge_config,
)
def test_merge_knowledge_base_ids_applies_only_visible_defaults_when_omitted() -> None:
visible = [
SimpleNamespace(id="default", owner_user_id=1, default_open=True, shared=False),
SimpleNamespace(id="optional", owner_user_id=1, default_open=False, shared=False),
]
assert merge_knowledge_base_ids(visible, None, owner_user_id=1) == ["default"]
assert merge_knowledge_base_ids(visible, [], owner_user_id=1) == []
assert merge_knowledge_base_ids(visible, ["optional", "unknown"], owner_user_id=1) == [
"optional",
"unknown",
]
def test_merge_knowledge_base_ids_default_open_only_for_owner() -> None:
visible = [
SimpleNamespace(id="mine", owner_user_id=1, default_open=True, shared=False),
SimpleNamespace(id="shared-default", owner_user_id=2, default_open=True, shared=True),
SimpleNamespace(id="shared-opt", owner_user_id=2, default_open=False, shared=True),
]
assert merge_knowledge_base_ids(visible, None, owner_user_id=1) == ["mine"]
assert merge_knowledge_base_ids(visible, None, owner_user_id=2) == ["shared-default"]
def test_merge_knowledge_base_ids_unions_visible_extra_ids() -> None:
visible = [
SimpleNamespace(id="default", owner_user_id=1, default_open=True, shared=False),
SimpleNamespace(id="expert-pick", owner_user_id=1, default_open=False, shared=False),
]
assert merge_knowledge_base_ids(
visible,
None,
owner_user_id=1,
extra_ids=["expert-pick", "gone", ""],
) == ["default", "expert-pick"]
assert (
merge_knowledge_base_ids(
visible,
[],
owner_user_id=1,
extra_ids=["expert-pick"],
)
== []
)
def test_stamp_turn_knowledge_config_writes_catalog() -> None:
visible = [
SimpleNamespace(
id="expert-pick",
owner_user_id=1,
default_open=False,
name="Policies",
description="Refund rules",
),
]
request: dict = {}
selected = stamp_turn_knowledge_config(
request,
visible_bases=visible,
explicit_ids=None,
owner_user_id=1,
extra_ids=["expert-pick", "gone"],
is_admin=False,
locale="zh",
)
assert selected == ["expert-pick"]
configurable = request["configurable"]
assert configurable["knowledge_base_ids"] == ["expert-pick"]
assert configurable["knowledge_base_catalog"] == [
{"id": "expert-pick", "name": "Policies", "description": "Refund rules"}
]
assert configurable["user_is_admin"] is False
assert configurable["locale"] == "zh"