mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-19 21:07:28 +08:00
78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
"""Tests for immediate execution of persisted scheduler tasks."""
|
|
|
|
import threading
|
|
import time
|
|
from datetime import datetime, timedelta
|
|
|
|
import pytest
|
|
|
|
from agent.tools.scheduler.scheduler_service import SchedulerService
|
|
from agent.tools.scheduler.scheduler_tool import SchedulerTool
|
|
from agent.tools.scheduler.task_store import TaskStore
|
|
|
|
|
|
def _task(task_id="task-1", enabled=False):
|
|
return {
|
|
"id": task_id,
|
|
"name": "refresh index",
|
|
"enabled": enabled,
|
|
"created_at": datetime.now().isoformat(),
|
|
"updated_at": datetime.now().isoformat(),
|
|
"next_run_at": (datetime.now() + timedelta(hours=2)).isoformat(),
|
|
"schedule": {"type": "interval", "seconds": 7200},
|
|
"action": {"type": "send_message", "content": "done"},
|
|
}
|
|
|
|
|
|
def test_manual_run_executes_disabled_task_without_moving_schedule(tmp_path):
|
|
store = TaskStore(str(tmp_path / "tasks.json"))
|
|
task = _task()
|
|
store.add_task(task)
|
|
completed = threading.Event()
|
|
|
|
def execute(received):
|
|
assert received["id"] == "task-1"
|
|
completed.set()
|
|
return True
|
|
|
|
service = SchedulerService(store, execute)
|
|
service.run_task_now("task-1")
|
|
|
|
assert completed.wait(timeout=2)
|
|
deadline = time.time() + 2
|
|
while time.time() < deadline:
|
|
updated = store.get_task("task-1")
|
|
if updated.get("last_manual_run_at"):
|
|
break
|
|
time.sleep(0.01)
|
|
|
|
updated = store.get_task("task-1")
|
|
assert updated["next_run_at"] == task["next_run_at"]
|
|
assert updated["enabled"] is False
|
|
assert updated["last_run_at"] == updated["last_manual_run_at"]
|
|
|
|
|
|
def test_manual_run_rejects_duplicate_execution(tmp_path):
|
|
store = TaskStore(str(tmp_path / "tasks.json"))
|
|
store.add_task(_task())
|
|
release = threading.Event()
|
|
started = threading.Event()
|
|
|
|
def execute(_task_data):
|
|
started.set()
|
|
release.wait(timeout=2)
|
|
return True
|
|
|
|
service = SchedulerService(store, execute)
|
|
service.run_task_now("task-1")
|
|
assert started.wait(timeout=2)
|
|
with pytest.raises(RuntimeError, match="already running"):
|
|
service.run_task_now("task-1")
|
|
release.set()
|
|
|
|
|
|
def test_scheduler_tool_does_not_expose_manual_execution():
|
|
actions = SchedulerTool.params["properties"]["action"]["enum"]
|
|
|
|
assert "run" not in actions
|