import subprocess
import unittest
from types import SimpleNamespace
from unittest.mock import patch

from tools.diagnose_control_stall import collect


class ControlStallHelperTest(unittest.TestCase):
    def test_independent_observations_and_no_raw_error(self):
        with patch("tools.diagnose_control_stall.subprocess.run", side_effect=[
            subprocess.TimeoutExpired(["private"], 3),
            SimpleNamespace(returncode=0, stdout="COMMAND\npython3\n")
        ]), patch("tools.diagnose_control_stall.urllib.request.build_opener") as opener:
            opener.return_value.open.side_effect = OSError("private detail")
            result = collect("test-container", "http://localhost")
        self.assertEqual("TIMEOUT", result["process"]["status"])
        self.assertEqual(1, result["tasks"]["process_count"])
        self.assertEqual("REQUEST_FAILED", result["live"]["status"])
        self.assertNotIn("private", str(result))

    def test_url_credentials_rejected_before_requests(self):
        with patch("tools.diagnose_control_stall.subprocess.run") as run:
            result = collect("test", "http://user:secret" + chr(64) + "localhost")
        run.assert_not_called()
        self.assertEqual("INVALID_BASE_URL", result["observation_error"])
