diff --git a/changelogs/fragments/9179-deps-tests.yml b/changelogs/fragments/9179-deps-tests.yml new file mode 100644 index 0000000000..1ddf109033 --- /dev/null +++ b/changelogs/fragments/9179-deps-tests.yml @@ -0,0 +1,2 @@ +minor_changes: + - deps module utils - add ``deps.clear()`` to clear out previously declared dependencies (https://github.com/ansible-collections/community.general/pull/9179). diff --git a/plugins/module_utils/deps.py b/plugins/module_utils/deps.py index a2413d1952..66847ccd25 100644 --- a/plugins/module_utils/deps.py +++ b/plugins/module_utils/deps.py @@ -96,3 +96,7 @@ def validate(module, spec=None): def failed(spec=None): return any(_deps[d].failed for d in _select_names(spec)) + + +def clear(): + _deps.clear() diff --git a/tests/unit/plugins/module_utils/test_deps.py b/tests/unit/plugins/module_utils/test_deps.py new file mode 100644 index 0000000000..70f0eac0fd --- /dev/null +++ b/tests/unit/plugins/module_utils/test_deps.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# (c) 2024, Alexei Znamensky +# Copyright (c) 2024 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible_collections.community.general.tests.unit.compat.mock import MagicMock + +import pytest + +from ansible_collections.community.general.plugins.module_utils import deps + + +@pytest.fixture +def module(): + m = MagicMock() + m.fail_json.side_effect = RuntimeError + return m + + +def test_wrong_name(module): + with deps.declare("sys") as sys_dep: + import sys # noqa: F401, pylint: disable=unused-import + + with pytest.raises(KeyError): + deps.validate(module, "wrong_name") + + +def test_fail_potatoes(module): + with deps.declare("potatoes", reason="Must have potatoes") as potatoes_dep: + import potatoes_that_will_never_be_there # noqa: F401, pylint: disable=unused-import + + with pytest.raises(RuntimeError): + deps.validate(module) + + assert potatoes_dep.failed is True + assert potatoes_dep.message.startswith("Failed to import the required Python library") + + +def test_sys(module): + with deps.declare("sys") as sys_dep: + import sys # noqa: F401, pylint: disable=unused-import + + deps.validate(module) + + assert sys_dep.failed is False + + +def test_multiple(module): + with deps.declare("mpotatoes", reason="Must have mpotatoes"): + import potatoes_that_will_never_be_there # noqa: F401, pylint: disable=unused-import + + with deps.declare("msys", reason="Must have msys"): + import sys # noqa: F401, pylint: disable=unused-import + + deps.validate(module, "msys") + deps.validate(module, "-mpotatoes") + + with pytest.raises(RuntimeError): + deps.validate(module) + + with pytest.raises(RuntimeError): + deps.validate(module, "-msys") + + with pytest.raises(RuntimeError): + deps.validate(module, "mpotatoes") diff --git a/tests/unit/plugins/module_utils/test_module_helper.py b/tests/unit/plugins/module_utils/test_module_helper.py index b1e2eafc7f..cbcdaae788 100644 --- a/tests/unit/plugins/module_utils/test_module_helper.py +++ b/tests/unit/plugins/module_utils/test_module_helper.py @@ -14,6 +14,7 @@ from ansible_collections.community.general.plugins.module_utils.module_helper im ) +# remove in 11.0.0 def test_dependency_ctxmgr(): ctx = DependencyCtxMgr("POTATOES", "Potatoes must be installed") with ctx: @@ -36,6 +37,7 @@ def test_dependency_ctxmgr(): assert ctx.has_it +# remove in 11.0.0 def test_variable_meta(): meta = VarMeta() assert meta.output is True @@ -51,6 +53,7 @@ def test_variable_meta(): assert meta.diff_result is None +# remove in 11.0.0 def test_variable_meta_diff(): meta = VarMeta(diff=True) assert meta.output is True @@ -70,6 +73,7 @@ def test_variable_meta_diff(): assert meta.diff_result == {"before": "abc", "after": "ghi"} +# remove in 11.0.0 def test_vardict(): vd = VarDict() vd.set('a', 123) @@ -99,6 +103,7 @@ def test_vardict(): assert vd.diff() == {'before': {'a': 123}, 'after': {'a': 'new_a'}}, "diff={0}".format(vd.diff()) +# remove in 11.0.0 def test_variable_meta_change(): vd = VarDict() vd.set('a', 123, change=True) diff --git a/tests/unit/plugins/modules/conftest.py b/tests/unit/plugins/modules/conftest.py index 6e96c58316..d357137651 100644 --- a/tests/unit/plugins/modules/conftest.py +++ b/tests/unit/plugins/modules/conftest.py @@ -48,4 +48,4 @@ def patch_ansible_module(request, mocker): @pytest.fixture(autouse=True) def deps_cleanup(): - deps._deps.clear() + deps.clear()