import pytest
from docker_pyo3 import Docker
from docker_pyo3.plugin import Plugins, Plugin
@pytest.fixture
def docker():
return Docker()
@pytest.fixture
def plugins(docker):
return docker.plugins()
def test_plugins_init(docker):
x = docker.plugins()
assert isinstance(x, Plugins)
def test_plugins_from_constructor(docker):
plugins = Plugins(docker)
assert isinstance(plugins, Plugins)
def test_plugins_list(plugins):
result = plugins.list()
assert isinstance(result, list)
for plugin in result:
assert isinstance(plugin, dict)
def test_plugins_list_enabled(plugins):
try:
result = plugins.list_enabled()
assert isinstance(result, list)
for plugin in result:
assert isinstance(plugin, dict)
if plugin:
assert plugin.get("Enabled", False) is True
except SystemError as e:
assert "invalid filter" in str(e).lower()
def test_plugins_list_disabled(plugins):
try:
result = plugins.list_disabled()
assert isinstance(result, list)
for plugin in result:
assert isinstance(plugin, dict)
if plugin:
assert plugin.get("Enabled", True) is False
except SystemError as e:
assert "invalid filter" in str(e).lower()
def test_plugins_list_by_capability(plugins):
for capability in ["volumedriver", "networkdriver", "authz"]:
result = plugins.list_by_capability(capability)
assert isinstance(result, list)
def test_plugins_get(plugins):
plugin = plugins.get("nonexistent:latest")
assert isinstance(plugin, Plugin)
def test_plugin_from_constructor(docker):
plugin = Plugin(docker, "test:latest")
assert isinstance(plugin, Plugin)
def test_plugin_name(docker):
plugin = Plugin(docker, "test:latest")
assert plugin.name() == "test:latest"
def test_plugin_inspect_nonexistent(plugins):
plugin = plugins.get("nonexistent_plugin_that_does_not_exist:latest")
with pytest.raises(SystemError):
plugin.inspect()
def test_plugin_enable_nonexistent(plugins):
plugin = plugins.get("nonexistent_plugin_that_does_not_exist:latest")
with pytest.raises(SystemError):
plugin.enable()
def test_plugin_disable_nonexistent(plugins):
plugin = plugins.get("nonexistent_plugin_that_does_not_exist:latest")
with pytest.raises(SystemError):
plugin.disable()
def test_plugin_remove_nonexistent(plugins):
plugin = plugins.get("nonexistent_plugin_that_does_not_exist:latest")
with pytest.raises(SystemError):
plugin.remove()
def test_plugin_force_remove_nonexistent(plugins):
plugin = plugins.get("nonexistent_plugin_that_does_not_exist:latest")
with pytest.raises(SystemError):
plugin.force_remove()
@pytest.fixture
def installed_plugin(plugins):
plugin_list = plugins.list()
if not plugin_list:
pytest.skip("No plugins installed - skipping plugin operation tests")
return plugins.get(plugin_list[0].get("Name"))
def test_plugin_inspect_existing(installed_plugin):
info = installed_plugin.inspect()
assert isinstance(info, dict)
assert "Id" in info or "Name" in info
def test_plugin_operations_on_existing(installed_plugin):
info = installed_plugin.inspect()
expected_fields = ["Config", "Enabled", "Name"]
for field in expected_fields:
pass assert isinstance(info, dict)
class TestPluginLifecycle:
@pytest.fixture
def plugin_for_lifecycle(self, plugins):
all_plugins = plugins.list()
if not all_plugins:
pytest.skip("No plugins installed")
disabled = plugins.list_disabled()
if disabled:
return plugins.get(disabled[0].get("Name")), False
enabled = plugins.list_enabled()
if enabled:
return plugins.get(enabled[0].get("Name")), True
pytest.skip("No plugins available for lifecycle testing")
def test_enable_disable_cycle(self, plugin_for_lifecycle):
plugin, was_enabled = plugin_for_lifecycle
try:
if was_enabled:
plugin.disable()
info = plugin.inspect()
assert info.get("Enabled") is False
plugin.enable()
info = plugin.inspect()
assert info.get("Enabled") is True
else:
plugin.enable()
info = plugin.inspect()
assert info.get("Enabled") is True
plugin.disable()
info = plugin.inspect()
assert info.get("Enabled") is False
finally:
try:
if was_enabled:
plugin.enable()
else:
plugin.disable()
except Exception:
pass