add: 持久化所有任务记录

This commit is contained in:
2026-06-20 12:20:39 +08:00
parent cd051900b5
commit ba9d0977e3
11 changed files with 465 additions and 189 deletions
+60
View File
@@ -1,7 +1,10 @@
import unittest
import tempfile
import os
from io import BytesIO
from datetime import datetime, timezone
import server
from server import ApiError, Handler, MAX_BODY_BYTES, compute_next_run_at
@@ -112,5 +115,62 @@ class HandlerSecurityTest(unittest.TestCase):
self.assertEqual(Handler.read_json(handler), {"ok": True})
class OneTimeJobTest(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory()
self.old_db_path = server.DB_PATH
self.old_rc_post = server.rc_post
server.DB_PATH = os.path.join(self.tmp.name, "jobs.sqlite")
self.next_jobid = 100
def fake_rc_post(path, payload, timeout=30, allow_error_body=False):
if path.startswith("sync/"):
self.next_jobid += 1
return {"jobid": self.next_jobid}
if path == "job/status":
return {"finished": False, "jobid": payload["jobid"], "progress": {"bytes": 1, "totalBytes": 2}}
if path == "job/stop":
return {}
raise AssertionError(path)
server.rc_post = fake_rc_post
server.init_db()
def tearDown(self):
server.rc_post = self.old_rc_post
server.DB_PATH = self.old_db_path
self.tmp.cleanup()
def test_create_and_list_one_time_job(self):
job = server.create_one_time_job({"action": "copy", "src": "/tmp/a", "dst": "/tmp/b"})
self.assertEqual(job["id"], 1)
self.assertEqual(job["jobid"], 101)
self.assertEqual(job["status"], "running")
self.assertEqual(job["src"], "/tmp/a")
jobs = server.list_one_time_jobs()
self.assertEqual(len(jobs), 1)
self.assertEqual(jobs[0]["id"], 1)
self.assertEqual(jobs[0]["status"], "running")
def test_stop_one_time_job_persists_stopped_status(self):
job = server.create_one_time_job({"action": "copy", "src": "/tmp/a", "dst": "/tmp/b"})
stopped = server.stop_one_time_job(job["id"])
self.assertEqual(stopped["status"], "stopped")
self.assertFalse(stopped["running"])
self.assertIsNotNone(stopped["statusSnapshot"])
def test_run_one_time_job_again_reuses_record_with_new_jobid(self):
job = server.create_one_time_job({"action": "copy", "src": "/tmp/a", "dst": "/tmp/b"})
server.stop_one_time_job(job["id"])
restarted = server.manual_run_one_time_job(job["id"])
self.assertEqual(restarted["id"], job["id"])
self.assertEqual(restarted["jobid"], 102)
self.assertEqual(restarted["status"], "running")
if __name__ == "__main__":
unittest.main()