mirror of
https://github.com/nicolargo/glances.git
synced 2026-06-02 19:05:00 -04:00
113 lines
3.5 KiB
Python
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
|