File: testing.py

package info (click to toggle)
ansible-core 2.19.0~beta6-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 32,628 kB
  • sloc: python: 180,313; cs: 4,929; sh: 4,601; xml: 34; makefile: 21
file content (31 lines) | stat: -rw-r--r-- 1,144 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"""
Utilities to support unit testing of Ansible Python modules.
Not supported for use cases other than testing.
"""

from __future__ import annotations as _annotations

import contextlib as _contextlib
import json as _json
import typing as _t

from unittest import mock as _mock

from ansible.module_utils.common import json as _common_json
from . import basic as _basic


@_contextlib.contextmanager
def patch_module_args(args: dict[str, _t.Any] | None = None) -> _t.Iterator[None]:
    """Expose the given module args to `AnsibleModule` instances created within this context."""
    if not isinstance(args, (dict, type(None))):
        raise TypeError("The `args` arg must be a dict or None.")

    args = dict(ANSIBLE_MODULE_ARGS=args or {})
    profile = 'legacy'  # this should be configurable in the future, once the profile feature is more fully baked

    encoder = _common_json.get_module_encoder(profile, _common_json.Direction.CONTROLLER_TO_MODULE)
    args = _json.dumps(args, cls=encoder).encode()

    with _mock.patch.object(_basic, '_ANSIBLE_ARGS', args), _mock.patch.object(_basic, '_ANSIBLE_PROFILE', profile):
        yield