Files
glances/tests/test_glances_stats.py
2026-05-21 03:06:41 +00:00

113 lines
3.5 KiB
Python

import tempfile
from pathlib import Path
from unittest.mock import MagicMock, patch
import pytest
from glances.stats import GlancesStats
@pytest.fixture
def plugin_manager():
"""Create plugin manager instance."""
return GlancesStats()
class Testload_additional_plugins: # noqa: D203
"""Tests for helper methods and main method of load_additional_plugins."""
def test_contains_plugin_model_returns_true(self, plugin_manager):
"""Should return True when PluginModel class exists."""
with tempfile.TemporaryDirectory() as tmpdir:
plugin_file = Path(tmpdir) / "model.py"
plugin_file.write_text(
"class PluginModel:\n pass\n",
encoding="utf-8",
)
result = plugin_manager._contains_plugin_model(plugin_file)
assert result is True # nosec B101
def test_contains_plugin_model_returns_false(self, plugin_manager):
"""Should return False when PluginModel class does not exist."""
with tempfile.TemporaryDirectory() as tmpdir:
plugin_file = Path(tmpdir) / "model.py"
plugin_file.write_text(
"class OtherClass:\n pass\n",
encoding="utf-8",
)
result = plugin_manager._contains_plugin_model(plugin_file)
assert result is False # nosec B101
def test_contains_plugin_model_handles_syntax_error(self, plugin_manager):
"""Should return False for invalid Python syntax."""
with tempfile.TemporaryDirectory() as tmpdir:
plugin_file = Path(tmpdir) / "model.py"
plugin_file.write_text(
"class PluginModel(\n",
encoding="utf-8",
)
result = plugin_manager._contains_plugin_model(plugin_file)
assert result is False # nosec B101
def test_get_addl_plugins_returns_valid_plugins(self, plugin_manager):
"""Should return only valid plugin directories."""
with tempfile.TemporaryDirectory() as tmpdir:
plugin_dir = Path(tmpdir)
valid_plugin = plugin_dir / "valid_plugin"
valid_plugin.mkdir()
(valid_plugin / "model.py").write_text(
"class PluginModel:\n pass\n",
encoding="utf-8",
)
invalid_plugin = plugin_dir / "invalid_plugin"
invalid_plugin.mkdir()
(invalid_plugin / "model.py").write_text(
"class OtherClass:\n pass\n",
encoding="utf-8",
)
result = plugin_manager._get_addl_plugins(plugin_dir)
assert result == ["valid_plugin"] # nosec B101
@patch("glances.stats.import_module")
@patch("glances.stats.Counter")
def test_load_additional_plugins_loads_plugin(
self,
mock_counter,
mock_import_module,
plugin_manager,
):
"""Should load and register additional plugins."""
mock_args = MagicMock()
mock_args.plugin_dir = "/fake/plugins"
mock_args.__contains__.return_value = True
mock_plugin_model = MagicMock()
mock_module = MagicMock()
mock_module.PluginModel.return_value = mock_plugin_model
mock_import_module.return_value = mock_module
with patch.object(
plugin_manager,
"_get_addl_plugins",
return_value=["test_plugin"],
):
plugin_manager.load_additional_plugins(args=mock_args)
assert "test_plugin" in plugin_manager._plugins # nosec B101