mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-21 06:07:13 +08:00
feat(scheduler): run existing tasks immediately
This commit is contained in:
89
tests/test_scheduler_run_now.py
Normal file
89
tests/test_scheduler_run_now.py
Normal file
@@ -0,0 +1,89 @@
|
||||
"""Tests for immediate execution of persisted scheduler tasks."""
|
||||
|
||||
import threading
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
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_queues_existing_task():
|
||||
store = Mock()
|
||||
store.get_task.return_value = {"id": "task-1", "name": "refresh index"}
|
||||
service = Mock()
|
||||
tool = SchedulerTool()
|
||||
tool.task_store = store
|
||||
|
||||
with patch(
|
||||
"agent.tools.scheduler.integration.get_scheduler_service",
|
||||
return_value=service,
|
||||
):
|
||||
result = tool.execute({"action": "run", "task_id": "task-1"})
|
||||
|
||||
assert result.status == "success"
|
||||
service.run_task_now.assert_called_once_with("task-1")
|
||||
Reference in New Issue
Block a user