summaryrefslogtreecommitdiffstats
path: root/qa/test_config.py
blob: d05168620f500583eb3617817242d159f7020e2c (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
import os
import re

from qa.base import BaseTestCase
from qa.shell import gitlint


class ConfigTests(BaseTestCase):
    """Integration tests for gitlint configuration and configuration precedence."""

    def test_ignore_by_id(self):
        self.create_simple_commit("WIP: Thïs is a title.\nContënt on the second line")
        output = gitlint("--ignore", "T5,B4", _tty_in=True, _cwd=self.tmp_git_repo, _ok_code=[1])
        expected = '1: T3 Title has trailing punctuation (.): "WIP: Thïs is a title."\n'
        self.assertEqualStdout(output, expected)

    def test_ignore_by_name(self):
        self.create_simple_commit("WIP: Thïs is a title.\nContënt on the second line")
        output = gitlint(
            "--ignore",
            "title-must-not-contain-word,body-first-line-empty",
            _cwd=self.tmp_git_repo,
            _tty_in=True,
            _ok_code=[1],
        )
        expected = '1: T3 Title has trailing punctuation (.): "WIP: Thïs is a title."\n'
        self.assertEqualStdout(output, expected)

    def test_verbosity(self):
        self.create_simple_commit("WIP: Thïs is a title.\nContënt on the second line")
        output = gitlint("-v", _cwd=self.tmp_git_repo, _tty_in=True, _ok_code=[3])

        expected = "1: T3\n1: T5\n2: B4\n"
        self.assertEqualStdout(output, expected)

        output = gitlint("-vv", _cwd=self.tmp_git_repo, _tty_in=True, _ok_code=[3])
        self.assertEqualStdout(output, self.get_expected("test_config/test_verbosity_1"))

        output = gitlint("-vvv", _cwd=self.tmp_git_repo, _tty_in=True, _ok_code=[3])
        self.assertEqualStdout(output, self.get_expected("test_config/test_verbosity_2"))

        # test silent mode
        output = gitlint("--silent", _cwd=self.tmp_git_repo, _tty_in=True, _ok_code=[3])
        self.assertEqualStdout(output, "")

    def test_set_rule_option(self):
        self.create_simple_commit("This ïs a title.")
        output = gitlint("-c", "title-max-length.line-length=5", _tty_in=True, _cwd=self.tmp_git_repo, _ok_code=[3])
        self.assertEqualStdout(output, self.get_expected("test_config/test_set_rule_option_1"))

    def test_config_from_file(self):
        commit_msg = (
            "WIP: Thïs is a title thåt is a bit longer.\nContent on the second line\n"
            "This line of the body is here because we need it"
        )
        self.create_simple_commit(commit_msg)
        config_path = self.get_sample_path("config/gitlintconfig")
        output = gitlint("--config", config_path, _cwd=self.tmp_git_repo, _tty_in=True, _ok_code=[5])
        self.assertEqualStdout(output, self.get_expected("test_config/test_config_from_file_1"))

    def test_config_from_file_debug(self):
        # Test both on existing and new repo (we've had a bug in the past that was unique to empty repos)
        repos = [self.tmp_git_repo, self.create_tmp_git_repo()]
        for target_repo in repos:
            commit_msg = (
                "WIP: Thïs is a title thåt is a bit longer.\nContent on the second line\n"
                "This line of the body is here because we need it"
            )
            filename = self.create_simple_commit(commit_msg, git_repo=target_repo)
            config_path = self.get_sample_path(os.path.join("config", "gitlintconfig"))
            output = gitlint("--config", config_path, "--debug", _cwd=target_repo, _tty_in=True, _ok_code=[5])

            expected_kwargs = self.get_debug_vars_last_commit(git_repo=target_repo)
            expected_kwargs.update(
                {
                    "config_path": config_path,
                    "changed_files": [filename],
                    "changed_files_stats": f"{filename}: 0 additions, 0 deletions",
                }
            )
            self.assertEqualStdout(
                output, self.get_expected("test_config/test_config_from_file_debug_1", expected_kwargs)
            )

    def test_config_from_env(self):
        """Test for configuring gitlint from environment variables"""

        # We invoke gitlint, configuring it via env variables, we can check whether gitlint picks these up correctly
        # by comparing the debug output with what we'd expect
        target_repo = self.create_tmp_git_repo()
        commit_msg = (
            "WIP: Thïs is a title thåt is a bit longer.\nContent on the second line\n"
            "This line of the body is here because we need it"
        )
        filename = self.create_simple_commit(commit_msg, git_repo=target_repo)
        env = self.create_environment(
            {
                "GITLINT_DEBUG": "1",
                "GITLINT_VERBOSITY": "2",
                "GITLINT_IGNORE": "T1,T2",
                "GITLINT_CONTRIB": "CC1,CT1",
                "GITLINT_FAIL_WITHOUT_COMMITS": "1",
                "GITLINT_IGNORE_STDIN": "1",
                "GITLINT_TARGET": target_repo,
                "GITLINT_COMMITS": self.get_last_commit_hash(git_repo=target_repo),
            }
        )
        output = gitlint(_env=env, _cwd=self.tmp_git_repo, _tty_in=True, _ok_code=[5])
        expected_kwargs = self.get_debug_vars_last_commit(git_repo=target_repo)
        expected_kwargs.update(
            {"changed_files": [filename], "changed_files_stats": f"{filename}: 0 additions, 0 deletions"}
        )

        self.assertEqualStdout(output, self.get_expected("test_config/test_config_from_env_1", expected_kwargs))

        # For some env variables, we need a separate test ast they are mutually exclusive with the ones tested above
        tmp_commit_msg_file = self.create_tmpfile("WIP: msg-fïlename test.")
        env = self.create_environment(
            {"GITLINT_DEBUG": "1", "GITLINT_TARGET": target_repo, "GITLINT_SILENT": "1", "GITLINT_STAGED": "1"}
        )

        output = gitlint(
            "--msg-filename", tmp_commit_msg_file, _env=env, _cwd=self.tmp_git_repo, _tty_in=True, _ok_code=[3]
        )

        # Extract date from actual output to insert it into the expected output
        # We have to do this since there's no way for us to deterministically know that date otherwise
        p = re.compile("Date: (.*)\n", re.UNICODE | re.MULTILINE)
        result = p.search(str(output))
        date = result.group(1).strip()
        expected_kwargs.update({"date": date})

        self.assertEqualStdout(output, self.get_expected("test_config/test_config_from_env_2", expected_kwargs))