Files
social-app/backend/tests/unit/v1/automation_jobs/test_schemas.py
T

108 lines
3.2 KiB
Python

from datetime import datetime
from unittest.mock import MagicMock
from uuid import uuid4
import pytest
from pydantic import ValidationError
from schemas.automation import AgentTool, AutomationJobConfig
from v1.automation_jobs.schemas import (
AutomationJobCreateRequest,
AutomationJobResponse,
AutomationJobUpdateRequest,
)
def _mock_orm_job() -> MagicMock:
mock_orm_job = MagicMock()
mock_orm_job.id = uuid4()
mock_orm_job.owner_id = uuid4()
mock_orm_job.bootstrap_key = "memory_extraction"
mock_orm_job.title = "Test Job"
mock_orm_job.config = {
"input_template": "Hello",
"enabled_tools": ["memory.write", "memory.forget"],
"context": {
"source": "latest_chat",
"window_mode": "day",
"window_count": 2,
},
"schedule": {
"type": "daily",
"run_at": {"hour": 8, "minute": 0},
},
}
mock_orm_job.status = "active"
mock_orm_job.timezone = "Asia/Shanghai"
mock_orm_job.next_run_at = datetime.now()
mock_orm_job.last_run_at = None
mock_orm_job.created_at = datetime.now()
mock_orm_job.updated_at = datetime.now()
return mock_orm_job
def test_response_is_system_true_when_bootstrap_key_present() -> None:
resp = AutomationJobResponse.from_orm(_mock_orm_job())
assert resp.is_system is True
def test_response_parses_schedule_from_config() -> None:
resp = AutomationJobResponse.from_orm(_mock_orm_job())
assert resp.config.schedule is not None
assert resp.config.schedule.type.value == "daily"
assert resp.config.schedule.run_at.hour == 8
def test_create_request_requires_config_schedule() -> None:
with pytest.raises(ValidationError):
AutomationJobCreateRequest.model_validate(
{
"title": "Test Job",
"timezone": "Asia/Shanghai",
"config": {
"input_template": "Hello",
},
}
)
def test_create_request_valid_timezone() -> None:
request = AutomationJobCreateRequest.model_validate(
{
"title": "Test Job",
"timezone": "Asia/Shanghai",
"config": {
"input_template": "Hello",
"enabled_tools": ["memory.write"],
"context": {
"source": "latest_chat",
"window_mode": "day",
"window_count": 2,
},
"schedule": {
"type": "daily",
"run_at": {"hour": 9, "minute": 0},
},
},
}
)
assert request.timezone == "Asia/Shanghai"
def test_update_timezone_validation() -> None:
request = AutomationJobUpdateRequest.model_validate(
{"timezone": "America/New_York"}
)
assert request.timezone == "America/New_York"
with pytest.raises(ValidationError):
AutomationJobUpdateRequest.model_validate({"timezone": "Invalid/Timezone"})
def test_config_patch_still_allows_partial_payload() -> None:
patch = AutomationJobConfig.model_validate(
{"enabled_tools": [AgentTool.MEMORY_WRITE]}
)
assert patch.input_template is None
assert patch.enabled_tools == [AgentTool.MEMORY_WRITE]