136 lines
5.4 KiB
Python
136 lines
5.4 KiB
Python
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from app.services.sync_record_service import (
|
|
_build_runtime_projection_payload,
|
|
_collect_recent_domain_events,
|
|
)
|
|
|
|
|
|
class SyncRecordServiceTests(unittest.TestCase):
|
|
def test_collect_recent_domain_events_filters_and_keeps_latest_slice(self) -> None:
|
|
active_job = {
|
|
"current_cycle_events": [
|
|
{
|
|
"node_code": "mainland-worker-01",
|
|
"event_type": "job_dispatch_sent",
|
|
"level": "info",
|
|
"message": "dispatch",
|
|
"created_at": "2026-04-19 01:00:05",
|
|
"payload": {"cycle_token": "cycle-1"},
|
|
},
|
|
{
|
|
"node_code": "mainland-worker-01",
|
|
"event_type": "domain_completed",
|
|
"level": "info",
|
|
"message": "完成 a.com",
|
|
"created_at": "2026-04-19 01:00:04",
|
|
"payload": {"domain": "a.com", "cycle_token": "cycle-1"},
|
|
},
|
|
{
|
|
"node_code": "mainland-worker-01",
|
|
"event_type": "domain_started",
|
|
"level": "info",
|
|
"message": "开始 b.com",
|
|
"created_at": "2026-04-19 01:00:03",
|
|
"payload": {"domain": "b.com", "cycle_token": "cycle-1"},
|
|
},
|
|
{
|
|
"node_code": "mainland-worker-01",
|
|
"event_type": "domain_failed",
|
|
"level": "warning",
|
|
"message": "失败 c.com",
|
|
"created_at": "2026-04-19 01:00:02",
|
|
"payload": {"domain": "c.com", "cycle_token": "cycle-1"},
|
|
},
|
|
]
|
|
}
|
|
|
|
events = _collect_recent_domain_events(active_job, limit=2)
|
|
|
|
self.assertEqual(2, len(events))
|
|
self.assertEqual("domain_started", events[0]["event_type"])
|
|
self.assertEqual("b.com", events[0]["payload"]["domain"])
|
|
self.assertEqual("domain_completed", events[1]["event_type"])
|
|
self.assertEqual("a.com", events[1]["payload"]["domain"])
|
|
|
|
@patch("app.services.sync_record_service._resolve_local_ip", return_value="152.53.37.118")
|
|
@patch("app.services.sync_record_service.socket.gethostname", return_value="overseas-control-01")
|
|
@patch("app.services.sync_record_service.settings")
|
|
def test_build_runtime_projection_payload_zeros_execution_for_overseas_control(
|
|
self,
|
|
mock_settings,
|
|
_mock_hostname,
|
|
_mock_resolve_ip,
|
|
) -> None:
|
|
mock_settings.node_code = "overseas-control-01"
|
|
mock_settings.node_region = "overseas"
|
|
mock_settings.node_role = "control"
|
|
mock_settings.sync_source_region = "overseas"
|
|
mock_settings.sync_target_region = "mainland"
|
|
|
|
payload = _build_runtime_projection_payload(
|
|
detect={
|
|
"worker_online": False,
|
|
"worker_mode": "linux-systemd",
|
|
"active_thread_count": 0,
|
|
"max_thread_count": 0,
|
|
"phase_label": "当前节点不承载",
|
|
"phase_detail": "当前节点为海外控制面,仅承载 API 控制与同步接收,不执行本机检测任务。",
|
|
"proxy_runtime_label": "不适用",
|
|
"proxy_runtime_reason": "not_applicable",
|
|
"progress": {
|
|
"pending": 125,
|
|
"running": 293,
|
|
"completed": 71,
|
|
"blacklisted": 0,
|
|
"failed": 1,
|
|
},
|
|
"active_job": {
|
|
"job_id": 2027,
|
|
"job_code": "sync-overseas-33501",
|
|
"status": "running",
|
|
"progress_percent": 7.2,
|
|
"items_total": 1000,
|
|
"items_terminal": 72,
|
|
"items_pending": 125,
|
|
"items_running": 293,
|
|
"items_failed": 1,
|
|
"node_stats": [{"node_code": "mainland-controller-01", "items_running": 293}],
|
|
},
|
|
},
|
|
cluster={
|
|
"nodes_total": 3,
|
|
"nodes": [
|
|
{
|
|
"node_code": "overseas-control-01",
|
|
"current_load": 293,
|
|
"detect_participating": True,
|
|
}
|
|
],
|
|
"summary": {
|
|
"online_worker_nodes": 3,
|
|
"dedicated_online_worker_nodes": 1,
|
|
"online_control_nodes": 2,
|
|
"busy_nodes": ["overseas-control-01"],
|
|
"stale_nodes": [],
|
|
"offline_nodes": [],
|
|
},
|
|
},
|
|
source_region="overseas",
|
|
target_region="mainland",
|
|
)
|
|
|
|
projection = payload["projection"]
|
|
self.assertFalse(projection["worker_online"])
|
|
self.assertFalse(projection["detect_participating"])
|
|
self.assertEqual(0, projection["active_thread_count"])
|
|
self.assertEqual(0, projection["max_thread_count"])
|
|
self.assertEqual(0, projection["progress"]["running"])
|
|
self.assertEqual("", projection["active_job"]["job_code"])
|
|
self.assertEqual([], projection["active_job"]["node_stats"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|