hy-app-monitor/tests/test_chatapp_cron_deploy.py
2026-04-27 18:42:56 +08:00

85 lines
3.5 KiB
Python

from __future__ import annotations
from pathlib import Path
import tempfile
import unittest
from unittest.mock import patch
from monitors.yumi import chatapp_cron_deploy as cron
class ChatappCronDeployTests(unittest.TestCase):
def test_overview_does_not_read_remote_metadata_when_disabled(self) -> None:
with (
patch.object(cron, "CHATAPP_CRON_ENABLED", False),
patch.object(cron, "read_chatapp_cron_metadata") as read_metadata_mock,
):
payload = cron.build_chatapp_cron_overview_payload()
self.assertTrue(payload["ok"])
self.assertFalse(payload["enabled"])
self.assertEqual(payload["metadata"], {})
read_metadata_mock.assert_not_called()
def test_activate_uploads_binary_and_recreates_compose_service(self) -> None:
host = {
"host": "cron",
"ip": "10.3.1.14",
"instanceId": "ins-nt6bsay0",
"sshHost": "10.3.1.14",
"sshUser": "root",
"sshUseSudo": False,
"sshPort": 22,
}
with tempfile.TemporaryDirectory() as tmp_dir:
binary_path = Path(tmp_dir) / "week-star-job"
binary_path.write_text("binary", encoding="utf-8")
binary_path.chmod(0o755)
with (
patch.object(cron, "CHATAPP_CRON_SERVICE_NAME", "chatapp-cron"),
patch.object(cron, "CHATAPP_CRON_HOST", "cron"),
patch.object(cron, "CHATAPP_CRON_REMOTE_DIR", "/opt/deploy/runtime/current"),
patch.object(cron, "CHATAPP_CRON_COMPOSE_FILE", "/opt/deploy/runtime/current/docker-compose.yml"),
patch.object(cron, "CHATAPP_CRON_COMPOSE_SERVICE", "week-star-job"),
patch.object(cron, "CHATAPP_CRON_BINARY_PATH", "/opt/deploy/runtime/current/week-star-job/service"),
patch.object(
cron,
"CHATAPP_CRON_RELEASE_META_PATH",
"/opt/deploy/runtime/current/.hy-app-monitor-chatapp-cron-release.json",
),
patch.object(cron, "chatapp_cron_host_record", return_value=host),
patch.object(cron, "copy_local_path_to_host") as copy_mock,
patch.object(
cron,
"run_host_script_checked",
return_value={"target": "cron", "status": "ok", "output": "week-star-job running"},
) as run_remote_mock,
):
result = cron.activate_chatapp_cron_binary(
{
"binaryPath": str(binary_path),
"gitRef": "main",
"commit": "f0f6205abc1234567890",
}
)
copy_mock.assert_called_once()
self.assertEqual(copy_mock.call_args.args[0], host)
self.assertEqual(copy_mock.call_args.args[1], binary_path)
run_remote_mock.assert_called_once()
remote_script = run_remote_mock.call_args.args[1]
self.assertIn("COMPOSE_SERVICE=week-star-job", remote_script)
self.assertIn("BINARY_PATH=/opt/deploy/runtime/current/week-star-job/service", remote_script)
self.assertIn('up -d --no-deps --force-recreate "$COMPOSE_SERVICE"', remote_script)
self.assertIn("META_BLOB=", remote_script)
self.assertEqual(result["metadata"]["commit"], "f0f6205abc1234567890")
self.assertEqual(result["metadata"]["component"], "week-star-job")
if __name__ == "__main__":
unittest.main()