test: replace agent and upload ORM spec mocks with real models (#43141)

This commit is contained in:
Asuka Minato authored and GitHub committed 2026-09-29 07:08:41 +00:00
1 parent f24586323b
commit 38f42f357e
4 files changed
+87 -49

No files matched your search

@@ -52,7 +52,7 @@ def _get(
api,
args=args,
app_model=app_model,
end_user=Mock(spec=EndUser),
end_user=EndUser(id=str(uuid4()), app_id=app_model.id, tenant_id=app_model.tenant_id),
file_id=file_id,
)
@@ -15,18 +15,12 @@ from models.model import App, Conversation
from services.agent.runtime_config_service import AgentRuntimeConfigService
def _app() -> MagicMock:
app = MagicMock(spec=App)
app.id = "app-1"
app.tenant_id = "tenant-1"
return app
def _app() -> App:
return App(id="app-1", tenant_id="tenant-1")
def _conversation(*, binding_id: str | None = None) -> MagicMock:
conversation = MagicMock(spec=Conversation)
conversation.id = "conversation-1"
conversation.agent_workspace_binding_id = binding_id
return conversation
def _conversation(*, binding_id: str | None = None) -> Conversation:
return Conversation(id="conversation-1", agent_workspace_binding_id=binding_id)
def _soul(prompt: str) -> AgentSoulConfig:
@@ -45,13 +39,13 @@ def _patch_published_soul(monkeypatch: pytest.MonkeyPatch, soul: AgentSoulConfig
return roster_service
def test_debug_without_mapping_falls_back_to_published_soul(monkeypatch: pytest.MonkeyPatch) -> None:
session = MagicMock(spec=Session)
session.scalar.return_value = None
def test_debug_without_mapping_falls_back_to_published_soul(
monkeypatch: pytest.MonkeyPatch, sqlite_session: Session
) -> None:
published = _soul("published")
roster_service = _patch_published_soul(monkeypatch, published)
result = AgentRuntimeConfigService(session).resolve_conversation_soul(
result = AgentRuntimeConfigService(sqlite_session).resolve_conversation_soul(
app_model=_app(),
conversation=_conversation(),
account_id="account-1",
@@ -65,16 +59,23 @@ def test_debug_without_mapping_falls_back_to_published_soul(monkeypatch: pytest.
)
def test_debug_without_draft_falls_back_to_published_soul(monkeypatch: pytest.MonkeyPatch) -> None:
session = MagicMock(spec=Session)
debug_conversation = MagicMock(spec=AgentDebugConversation)
debug_conversation.agent_id = "agent-1"
debug_conversation.draft_type = AgentConfigDraftType.DRAFT
session.scalar.side_effect = [debug_conversation, None]
def test_debug_without_draft_falls_back_to_published_soul(
monkeypatch: pytest.MonkeyPatch, sqlite_session: Session
) -> None:
debug_conversation = AgentDebugConversation(
tenant_id="tenant-1",
app_id="app-1",
account_id="account-1",
conversation_id="conversation-1",
agent_id="agent-1",
draft_type=AgentConfigDraftType.DRAFT,
)
sqlite_session.add(debug_conversation)
sqlite_session.flush()
published = _soul("published")
_patch_published_soul(monkeypatch, published)
result = AgentRuntimeConfigService(session).resolve_conversation_soul(
result = AgentRuntimeConfigService(sqlite_session).resolve_conversation_soul(
app_model=_app(),
conversation=_conversation(),
account_id="account-1",
@@ -84,13 +85,11 @@ def test_debug_without_draft_falls_back_to_published_soul(monkeypatch: pytest.Mo
assert result == published
def test_missing_binding_falls_back_to_published_soul(monkeypatch: pytest.MonkeyPatch) -> None:
session = MagicMock(spec=Session)
session.scalar.return_value = None
def test_missing_binding_falls_back_to_published_soul(monkeypatch: pytest.MonkeyPatch, sqlite_session: Session) -> None:
published = _soul("published")
_patch_published_soul(monkeypatch, published)
result = AgentRuntimeConfigService(session).resolve_conversation_soul(
result = AgentRuntimeConfigService(sqlite_session).resolve_conversation_soul(
app_model=_app(),
conversation=_conversation(binding_id="binding-1"),
account_id=None,
@@ -104,17 +103,24 @@ def test_missing_binding_falls_back_to_published_soul(monkeypatch: pytest.Monkey
def test_missing_bound_version_falls_back_to_published_soul(
version_kind: AgentConfigVersionKind,
monkeypatch: pytest.MonkeyPatch,
sqlite_session: Session,
) -> None:
session = MagicMock(spec=Session)
binding = MagicMock(spec=AgentWorkspaceBinding)
binding.agent_id = "agent-1"
binding.agent_config_version_id = "version-1"
binding.agent_config_version_kind = version_kind
session.scalar.side_effect = [binding, None]
binding = AgentWorkspaceBinding(
id="binding-1",
tenant_id="tenant-1",
app_id="app-1",
workspace_id="workspace-1",
backend_binding_ref="binding-ref-1",
agent_id="agent-1",
agent_config_version_id="version-1",
agent_config_version_kind=version_kind,
)
sqlite_session.add(binding)
sqlite_session.flush()
published = _soul("published")
_patch_published_soul(monkeypatch, published)
result = AgentRuntimeConfigService(session).resolve_conversation_soul(
result = AgentRuntimeConfigService(sqlite_session).resolve_conversation_soul(
app_model=_app(),
conversation=_conversation(binding_id="binding-1"),
account_id=None,
@@ -124,19 +130,31 @@ def test_missing_bound_version_falls_back_to_published_soul(
assert result == published
def test_bound_draft_returns_its_soul(monkeypatch: pytest.MonkeyPatch) -> None:
session = MagicMock(spec=Session)
binding = MagicMock(spec=AgentWorkspaceBinding)
binding.agent_id = "agent-1"
binding.agent_config_version_id = "draft-1"
binding.agent_config_version_kind = AgentConfigVersionKind.DRAFT
draft = MagicMock(spec=AgentConfigDraft)
def test_bound_draft_returns_its_soul(monkeypatch: pytest.MonkeyPatch, sqlite_session: Session) -> None:
binding = AgentWorkspaceBinding(
id="binding-1",
tenant_id="tenant-1",
app_id="app-1",
workspace_id="workspace-1",
backend_binding_ref="binding-ref-1",
agent_id="agent-1",
agent_config_version_id="draft-1",
agent_config_version_kind=AgentConfigVersionKind.DRAFT,
)
bound = _soul("bound draft")
draft.config_snapshot_dict = bound.model_dump(mode="json")
session.scalar.side_effect = [binding, draft]
draft = AgentConfigDraft(
id="draft-1",
tenant_id="tenant-1",
agent_id="agent-1",
draft_type=AgentConfigDraftType.DRAFT,
config_snapshot=bound,
)
sqlite_session.add_all([binding, draft])
sqlite_session.flush()
sqlite_session.expire_all()
roster_service = _patch_published_soul(monkeypatch, _soul("published"))
result = AgentRuntimeConfigService(session).resolve_conversation_soul(
result = AgentRuntimeConfigService(sqlite_session).resolve_conversation_soul(
app_model=_app(),
conversation=_conversation(binding_id="binding-1"),
account_id=None,
@@ -16,6 +16,8 @@ from sqlalchemy.orm import Session, sessionmaker
from sqlalchemy.pool import QueuePool
from configs import dify_config
from extensions.storage.storage_type import StorageType
from libs.datetime_utils import naive_utc_now
from models.agent import (
Agent,
AgentConfigDraft,
@@ -29,7 +31,7 @@ from models.agent import (
AgentStatus,
)
from models.agent_config_entities import AgentSoulConfig
from models.enums import AppStatus, CustomizeTokenStrategy
from models.enums import AppStatus, CreatorUserRole, CustomizeTokenStrategy
from models.model import App, AppMode, IconType, Site
from models.skill import AgentSkillBindingSnapshot, Skill, SkillVersion, SkillVersionManifest
from models.tools import ToolFile
@@ -1396,7 +1398,12 @@ def test_export_download_closes_owned_archive(app: Flask) -> None:
],
)
def test_export_preserves_file_metadata_in_dsl(
monkeypatch: pytest.MonkeyPatch, file_kind: str, declared_mime: str | None, stored_mime: str, expected_mime: str
monkeypatch: pytest.MonkeyPatch,
sqlite_session: Session,
file_kind: str,
declared_mime: str | None,
stored_mime: str,
expected_mime: str,
) -> None:
from unittest.mock import Mock
@@ -1414,7 +1421,20 @@ def test_export_preserves_file_metadata_in_dsl(
original_url=None,
)
tool_file.id = "source-id"
upload_file = Mock(spec=UploadFile, id="source-id", key="payload", mime_type=stored_mime)
upload_file = UploadFile(
tenant_id="tenant-1",
storage_type=StorageType.LOCAL,
key="payload",
name="original.pdf",
size=1,
extension="pdf",
mime_type=stored_mime,
created_by_role=CreatorUserRole.ACCOUNT,
created_by="account-1",
created_at=naive_utc_now(),
used=False,
)
upload_file.id = "source-id"
monkeypatch.setattr(exporter, "_tool_files", Mock(return_value={"source-id": tool_file}))
monkeypatch.setattr(exporter, "_upload_files", Mock(return_value={"source-id": upload_file}))
soul = AgentSoulConfig.model_validate(
@@ -1425,7 +1445,7 @@ def test_export_preserves_file_metadata_in_dsl(
}
)
portable_soul, _, sources = exporter._collect_payloads(session=Mock(spec=Session), tenant_id="tenant-1", soul=soul)
portable_soul, _, sources = exporter._collect_payloads(session=sqlite_session, tenant_id="tenant-1", soul=soul)
ref = portable_soul.config_files[0]
assert (ref.name, ref.file_kind, ref.mime_type, ref.file_id) == (
@@ -51,7 +51,7 @@ def _upload_context() -> HumanInputUploadContext:
form_id="form-1",
recipient_id="recipient-1",
upload_token_id="token-1",
owner=MagicMock(spec=Account),
owner=Account(name="Upload owner", email="owner@example.com"),
)
@@ -136,7 +136,7 @@ def test_validate_upload_token_resolves_delivery_test_owner() -> None:
uploads = MagicMock(spec=HumanInputFileUploadRepository)
form = _active_form(workflow_run_id=None, form_kind=HumanInputFormKind.DELIVERY_TEST)
uploads.get_upload_grant.return_value = HumanInputUploadGrantRecord(upload_token_id="token-1", form=form)
owner = MagicMock(spec=Account)
owner = Account(name="Delivery test owner", email="owner@example.com")
uploads.get_delivery_test_upload_owner.return_value = owner
workflow_runs = MagicMock()