You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ansible/test/units/module_utils/basic/test_deprecate_warn.py

92 lines
3.8 KiB
Python

# -*- coding: utf-8 -*-
#
# Copyright (c) 2017 Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import annotations
import json
import typing as t
import pytest
from ansible.module_utils._internal._ansiballz import _ModulePluginWrapper
from ansible.module_utils._internal._plugin_exec_context import PluginExecContext
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.json import Direction, get_module_decoder
from ansible.module_utils.common import warnings
from ansible.module_utils.common.messages import Detail, DeprecationSummary, WarningSummary, PluginInfo
from units.mock.messages import make_summary
pytestmark = pytest.mark.usefixtures("module_env_mocker")
@pytest.mark.parametrize('stdin', [{}], indirect=['stdin'])
def test_warn(am, capfd):
am.warn('warning1')
with pytest.raises(SystemExit):
am.exit_json(warnings=['warning2'])
out, err = capfd.readouterr()
actual = json.loads(out, cls=get_module_decoder('legacy', Direction.MODULE_TO_CONTROLLER))['warnings']
expected = [make_summary(WarningSummary, Detail(msg=msg)) for msg in ['warning1', 'warning2']]
assert actual == expected
@pytest.mark.parametrize('kwargs,plugin_name,stdin', (
(dict(msg='deprecation1'), None, {}),
(dict(msg='deprecation3', version='2.4'), None, {}),
(dict(msg='deprecation4', date='2020-03-10'), None, {}),
(dict(msg='deprecation5'), 'ansible.builtin.ping', {}),
(dict(msg='deprecation7', version='2.4'), 'ansible.builtin.ping', {}),
(dict(msg='deprecation8', date='2020-03-10'), 'ansible.builtin.ping', {}),
), indirect=['stdin'])
def test_deprecate(am: AnsibleModule, capfd, kwargs: dict[str, t.Any], plugin_name: str | None) -> None:
plugin_info = PluginInfo(requested_name=plugin_name, resolved_name=plugin_name, type='module') if plugin_name else None
executing_plugin = _ModulePluginWrapper(plugin_info) if plugin_info else None
collection_name = plugin_name.rpartition('.')[0] if plugin_name else None
with PluginExecContext.when(bool(executing_plugin), executing_plugin=executing_plugin):
am.deprecate(**kwargs)
assert warnings.get_deprecation_messages() == (dict(collection_name=collection_name, **kwargs),)
with pytest.raises(SystemExit):
am.exit_json(deprecations=['deprecation9', ('deprecation10', '2.4')])
out, err = capfd.readouterr()
output = json.loads(out, cls=get_module_decoder('legacy', Direction.MODULE_TO_CONTROLLER))
assert ('warnings' not in output or output['warnings'] == [])
msg = kwargs.pop('msg')
assert output['deprecations'] == [
make_summary(DeprecationSummary, Detail(msg=msg), **kwargs, plugin=plugin_info),
make_summary(DeprecationSummary, Detail(msg='deprecation9'), plugin=plugin_info),
make_summary(DeprecationSummary, Detail(msg='deprecation10'), version='2.4', plugin=plugin_info),
]
@pytest.mark.parametrize('stdin', [{}], indirect=['stdin'])
def test_deprecate_without_list(am, capfd):
with pytest.raises(SystemExit):
am.exit_json(deprecations='Simple deprecation warning')
out, err = capfd.readouterr()
output = json.loads(out, cls=get_module_decoder('legacy', Direction.MODULE_TO_CONTROLLER))
assert ('warnings' not in output or output['warnings'] == [])
assert output['deprecations'] == [
make_summary(DeprecationSummary, Detail(msg='Simple deprecation warning')),
]
@pytest.mark.parametrize('stdin', [{}], indirect=['stdin'])
def test_deprecate_without_list_version_date_not_set(am, capfd):
with pytest.raises(AssertionError) as ctx:
am.deprecate('Simple deprecation warning', date='', version='') # pylint: disable=ansible-deprecated-no-version
assert ctx.value.args[0] == "implementation error -- version and date must not both be set"