from __future__ import annotations from unittest.mock import patch from app.executors.process_executor import ProcessCheckExecutor class DummyCompletedProcess: def __init__(self, stdout: str) -> None: self.stdout = stdout def test_process_check_executor_windows_match() -> None: with ( patch("app.executors.process_executor.platform.system", return_value="Windows"), patch( "app.executors.process_executor.subprocess.run", return_value=DummyCompletedProcess('"python.exe","1234","Console","1","10,000 K"\n'), ), ): success, message, data, evidence = ProcessCheckExecutor().execute({"process_name": "python"}) assert success is True assert message == "process found" assert data["matched_count"] == 1 assert data["memory_rss_kb_total"] == 10000 assert evidence["matches"][0]["pid"] == 1234 def test_process_check_executor_unix_pid_miss() -> None: with ( patch("app.executors.process_executor.platform.system", return_value="Linux"), patch( "app.executors.process_executor.subprocess.run", return_value=DummyCompletedProcess("1234 python 1.5 2.0 20480 python app.py\n"), ), ): success, message, data, evidence = ProcessCheckExecutor().execute({"pid": 9999}) assert success is False assert message == "process not found" assert data["matched_count"] == 0 assert evidence["matches"] == [] def test_process_check_executor_unix_collects_metrics() -> None: with ( patch("app.executors.process_executor.platform.system", return_value="Linux"), patch( "app.executors.process_executor.subprocess.run", return_value=DummyCompletedProcess("1234 python 1.5 2.0 20480 python app.py\n"), ), ): success, message, data, evidence = ProcessCheckExecutor().execute({"process_name": "python"}) assert success is True assert message == "process found" assert data["matched_count"] == 1 assert data["cpu_percent_total"] == 1.5 assert data["memory_rss_kb_total"] == 20480 assert evidence["matches"][0]["memory_percent"] == 2.0 def test_process_check_executor_command_contains_match() -> None: with ( patch("app.executors.process_executor.platform.system", return_value="Linux"), patch( "app.executors.process_executor.subprocess.run", return_value=DummyCompletedProcess("1234 java 1.5 2.0 20480 java -jar order-service.jar\n"), ), ): success, message, data, evidence = ProcessCheckExecutor().execute({"command_contains": "order-service"}) assert success is True assert message == "process found" assert data["matched_count"] == 1 assert data["command_contains"] == "order-service" assert "order-service" in evidence["matches"][0]["command"]