51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
|
|
"""Auto-generate per-server agent_api_key when missing (batch/single install)."""
|
||
|
|
|
||
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from server.application.server_batch_common import ensure_agent_api_key, generate_agent_api_key_value
|
||
|
|
from server.domain.models import Server
|
||
|
|
|
||
|
|
|
||
|
|
def test_generate_agent_api_key_format():
|
||
|
|
key = generate_agent_api_key_value()
|
||
|
|
assert key.startswith("nxs-")
|
||
|
|
assert len(key) > 20
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_ensure_agent_api_key_returns_existing():
|
||
|
|
server = Server(id=1, name="s1", agent_api_key="nxs-existing")
|
||
|
|
assert await ensure_agent_api_key(server) == "nxs-existing"
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_ensure_agent_api_key_generates_and_persists():
|
||
|
|
server = Server(id=42, name="机器人", agent_api_key=None)
|
||
|
|
row = Server(id=42, name="机器人", agent_api_key=None)
|
||
|
|
|
||
|
|
mock_repo = MagicMock()
|
||
|
|
mock_repo.get_by_id = AsyncMock(return_value=row)
|
||
|
|
|
||
|
|
mock_session = MagicMock()
|
||
|
|
mock_session.commit = AsyncMock()
|
||
|
|
|
||
|
|
mock_ctx = MagicMock()
|
||
|
|
mock_ctx.__aenter__ = AsyncMock(return_value=mock_session)
|
||
|
|
mock_ctx.__aexit__ = AsyncMock(return_value=None)
|
||
|
|
|
||
|
|
with patch(
|
||
|
|
"server.infrastructure.database.session.AsyncSessionLocal",
|
||
|
|
return_value=mock_ctx,
|
||
|
|
), patch(
|
||
|
|
"server.infrastructure.database.server_repo.ServerRepositoryImpl",
|
||
|
|
return_value=mock_repo,
|
||
|
|
):
|
||
|
|
key = await ensure_agent_api_key(server)
|
||
|
|
|
||
|
|
assert key.startswith("nxs-")
|
||
|
|
assert row.agent_api_key == key
|
||
|
|
assert server.agent_api_key == key
|
||
|
|
mock_session.commit.assert_awaited_once()
|