summaryrefslogtreecommitdiffstats
path: root/test/TestCommandLineInvocationSameAsConfig.py
blob: a5368fa01fec7bde4fe7760343b6b1a203034037 (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import os
import sys
from pathlib import Path

import pytest

from ansiblelint import cli


@pytest.fixture
def base_arguments():
    return ['../test/skiptasks.yml']


@pytest.mark.parametrize(('args', 'config'), (
                         (["-p"], "test/fixtures/parseable.yml"),
                         (["-q"], "test/fixtures/quiet.yml"),
                         (["-r", "test/fixtures/rules/"],
                          "test/fixtures/rulesdir.yml"),
                         (["-R", "-r", "test/fixtures/rules/"],
                          "test/fixtures/rulesdir-defaults.yml"),
                         (["-t", "skip_ansible_lint"],
                          "test/fixtures/tags.yml"),
                         (["-v"], "test/fixtures/verbosity.yml"),
                         (["-x", "bad_tag"],
                          "test/fixtures/skip-tags.yml"),
                         (["--exclude", "test/"],
                          "test/fixtures/exclude-paths.yml"),
                         (["--show-relpath"],
                          "test/fixtures/show-abspath.yml"),
                         ([],
                          "test/fixtures/show-relpath.yml"),
                         ))
def test_ensure_config_are_equal(base_arguments, args, config, monkeypatch):
    command = base_arguments + args
    cli_parser = cli.get_cli_parser()

    _real_pathlib_resolve = Path.resolve

    def _fake_pathlib_resolve(self):
        try:
            return _real_pathlib_resolve(self)
        except FileNotFoundError:
            if self != Path(args[-1]):
                raise
            return Path.cwd() / self

    with monkeypatch.context() as mp_ctx:
        if (
                sys.version_info[:2] < (3, 6) and
                args[-2:] == ["-r", "test/fixtures/rules/"]
        ):
            mp_ctx.setattr(Path, 'resolve', _fake_pathlib_resolve)
        options = cli_parser.parse_args(command)

    file_config = cli.load_config(config)

    for key, val in file_config.items():
        if key in {'exclude_paths', 'rulesdir'}:
            val = [Path(p) for p in val]
        assert val == getattr(options, key)


def test_config_can_be_overridden(base_arguments):
    no_override = cli.get_config(base_arguments + ["-t", "bad_tag"])

    overridden = cli.get_config(base_arguments +
                                ["-t", "bad_tag",
                                 "-c", "test/fixtures/tags.yml"])

    assert no_override.tags + ["skip_ansible_lint"] == overridden.tags


def test_different_config_file(base_arguments):
    """Ensures an alternate config_file can be used."""
    diff_config = cli.get_config(base_arguments +
                                 ["-c", "test/fixtures/ansible-config.yml"])
    no_config = cli.get_config(base_arguments + ["-v"])

    assert diff_config.verbosity == no_config.verbosity


def test_expand_path_user_and_vars_config_file(base_arguments):
    """Ensure user and vars are expanded when specified as exclude_paths."""
    config1 = cli.get_config(base_arguments +
                             ["-c", "test/fixtures/exclude-paths-with-expands.yml"])
    config2 = cli.get_config(base_arguments + [
        "--exclude", "~/.ansible/roles",
        "--exclude", "$HOME/.ansible/roles"
    ])

    assert str(config1.exclude_paths[0]) == os.path.expanduser("~/.ansible/roles")
    assert str(config2.exclude_paths[0]) == os.path.expanduser("~/.ansible/roles")
    assert str(config1.exclude_paths[1]) == os.path.expandvars("$HOME/.ansible/roles")
    assert str(config2.exclude_paths[1]) == os.path.expandvars("$HOME/.ansible/roles")


def test_path_from_config_do_not_depend_on_cwd(monkeypatch):  # Issue 572
    config1 = cli.load_config("test/fixtures/config-with-relative-path.yml")
    monkeypatch.chdir('test')
    config2 = cli.load_config("fixtures/config-with-relative-path.yml")

    assert config1['exclude_paths'].sort() == config2['exclude_paths'].sort()


def test_path_from_cli_depend_on_cwd(base_arguments, monkeypatch, tmp_path):
    # Issue 572
    arguments = base_arguments + ["--exclude",
                                  "test/fixtures/config-with-relative-path.yml"]

    options1 = cli.get_cli_parser().parse_args(arguments)
    assert 'test/test' not in str(options1.exclude_paths[0])

    test_dir = 'test'
    if sys.version_info[:2] < (3, 6):
        test_dir = tmp_path / 'test' / 'test' / 'fixtures'
        test_dir.mkdir(parents=True)
        (test_dir / 'config-with-relative-path.yml').write_text('')
        test_dir = test_dir / '..' / '..'
    monkeypatch.chdir(test_dir)
    options2 = cli.get_cli_parser().parse_args(arguments)

    assert 'test/test' in str(options2.exclude_paths[0])


@pytest.mark.parametrize(
    "config_file",
    (
        pytest.param("test/fixtures/ansible-config-invalid.yml", id="invalid"),
        pytest.param("/dev/null/ansible-config-missing.yml", id="missing")
    ),
)
def test_config_failure(base_arguments, config_file):
    """Ensures specific config files produce error code 2."""
    with pytest.raises(SystemExit, match="^2$"):
        cli.get_config(base_arguments +
                       ["-c", config_file])