mirror of https://github.com/ansible/ansible.git
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.
82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
|
|
def test_failed_non_interactive_captured_command() -> None:
|
|
"""Verify failed non-interactive captured commands raise a `SubprocessError` with `stdout` and `stderr` set."""
|
|
from ansible_test._internal.util import raw_command, SubprocessError
|
|
|
|
with pytest.raises(SubprocessError, match='Command "ls /dev/null /does/not/exist" returned exit status [0-9]+.\n>>> Standard Error\n') as error:
|
|
raw_command(['ls', '/dev/null', '/does/not/exist'], True)
|
|
|
|
assert '/dev/null' in error.value.stdout
|
|
assert '/does/not/exist' in error.value.stderr
|
|
|
|
|
|
def test_failed_non_interactive_command() -> None:
|
|
"""Verify failed non-interactive non-captured commands raise a `SubprocessError` with `stdout` and `stderr` set to an empty string."""
|
|
from ansible_test._internal.util import raw_command, SubprocessError
|
|
|
|
with pytest.raises(SubprocessError, match='Command "ls /dev/null /does/not/exist" returned exit status [0-9]+.') as error:
|
|
raw_command(['ls', '/dev/null', '/does/not/exist'], False)
|
|
|
|
assert error.value.stdout == ''
|
|
assert error.value.stderr == ''
|
|
|
|
|
|
def test_failed_interactive_command() -> None:
|
|
"""Verify failed interactive commands raise a `SubprocessError` with `stdout` and `stderr` set to `None`."""
|
|
from ansible_test._internal.util import raw_command, SubprocessError
|
|
|
|
with pytest.raises(SubprocessError, match='Command "ls /dev/null /does/not/exist" returned exit status [0-9]+.') as error:
|
|
raw_command(['ls', '/dev/null', '/does/not/exist'], False, interactive=True)
|
|
|
|
assert error.value.stdout is None
|
|
assert error.value.stderr is None
|
|
|
|
|
|
@pytest.mark.parametrize("args,filters,expected", (
|
|
(
|
|
# args after a known option must be separated from existing args
|
|
['--color', '--docker', 'default', 'ping', 'split'],
|
|
{'--docker': 1},
|
|
['--color', '--', 'ping', 'split'],
|
|
),
|
|
(
|
|
# args after '--' are not options
|
|
['--', '--color'],
|
|
{'--color': 1},
|
|
['--', '--color'],
|
|
),
|
|
(
|
|
# args after a known option must be separated from existing args without conflicting with an explicit '--'
|
|
['--color', '--docker', 'default', 'ping', '--', 'split'],
|
|
{'--docker': 1},
|
|
['--color', '--', 'ping', 'split'],
|
|
),
|
|
(
|
|
# args before options are properly handled
|
|
['ping', '--docker', 'default', '-v'],
|
|
{'--docker': 1},
|
|
['ping', '-v'],
|
|
),
|
|
(
|
|
# no options
|
|
['ping', 'split'],
|
|
{'--docker': 1},
|
|
['ping', 'split'],
|
|
),
|
|
(
|
|
# only options
|
|
['--color', '--docker', 'default', '-v'],
|
|
{'--docker': 1},
|
|
['--color', '-v'],
|
|
)
|
|
))
|
|
def test_filter_args(args: list[str], filters: dict[str, int], expected: list[str]) -> None:
|
|
"""Verify arg filtering properly handles various scenarios."""
|
|
from ansible_test._internal.util import filter_args
|
|
|
|
assert filter_args(args, filters) == expected
|