"""hub_host_status_lib 单元测试."""
from __future__ import annotations

import sys
import unittest
from unittest.mock import MagicMock, patch

from lib.hub.hub_host_status_lib import _disk_path, _state, get_host_status


class HubHostStatusLibTest(unittest.TestCase):
    def setUp(self):
        _state["primed"] = False
        _state["net_ts"] = 0.0
        _state["net_sent"] = 0
        _state["net_recv"] = 0

    def test_disk_path_env_override(self):
        with patch.dict("os.environ", {"HUB_HOST_DISK_PATH": "/data"}, clear=False):
            self.assertEqual(_disk_path(), "/data")

    def test_get_host_status_without_psutil(self):
        import builtins

        real_import = builtins.__import__

        def fake_import(name, globals=None, locals=None, fromlist=(), level=0):
            if name == "psutil":
                raise ImportError("no psutil")
            return real_import(name, globals, locals, fromlist, level)

        with patch("builtins.__import__", side_effect=fake_import):
            out = get_host_status()
        self.assertFalse(out.get("ok"))
        self.assertIn("psutil", out.get("msg", ""))

    def test_get_host_status_payload(self):
        fake_vm = MagicMock(total=8_000_000_000, used=3_200_000_000, percent=40.0)
        fake_du = MagicMock(total=100_000_000_000, used=50_000_000_000)
        fake_net = MagicMock(bytes_sent=1_000_000, bytes_recv=2_000_000)
        fake_psutil = MagicMock()
        fake_psutil.cpu_percent.return_value = 12.5
        fake_psutil.cpu_count.return_value = 4
        fake_psutil.virtual_memory.return_value = fake_vm
        fake_psutil.disk_usage.return_value = fake_du
        fake_psutil.net_io_counters.return_value = fake_net
        fake_psutil.boot_time.return_value = 1_700_000_000.0
        with patch.dict(sys.modules, {"psutil": fake_psutil}):
            out = get_host_status()
        self.assertTrue(out.get("ok"))
        self.assertEqual(out["cpu"]["percent"], 12.5)
        self.assertEqual(out["memory"]["percent"], 40.0)
        self.assertEqual(out["disk"]["percent"], 50.0)
        self.assertIn("network", out)


if __name__ == "__main__":
    unittest.main()
