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()