add: 持久化所有任务记录
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user