summaryrefslogtreecommitdiffstats
path: root/tests/commands/init_templatedir_test.py
blob: 4e131dff727a58a0525d93b70adef7197d59f6c9 (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
138
139
140
import os.path
from unittest import mock

import pytest

import pre_commit.constants as C
from pre_commit.commands.init_templatedir import init_templatedir
from pre_commit.envcontext import envcontext
from pre_commit.util import cmd_output
from testing.fixtures import git_dir
from testing.fixtures import make_consuming_repo
from testing.util import cmd_output_mocked_pre_commit_home
from testing.util import cwd
from testing.util import git_commit


def test_init_templatedir(tmpdir, tempdir_factory, store, cap_out):
    target = str(tmpdir.join('tmpl'))
    init_templatedir(C.CONFIG_FILE, store, target, hook_types=['pre-commit'])
    lines = cap_out.get().splitlines()
    assert lines[0].startswith('pre-commit installed at ')
    assert lines[1] == (
        '[WARNING] `init.templateDir` not set to the target directory'
    )
    assert lines[2].startswith(
        '[WARNING] maybe `git config --global init.templateDir',
    )

    with envcontext((('GIT_TEMPLATE_DIR', target),)):
        path = make_consuming_repo(tempdir_factory, 'script_hooks_repo')

        with cwd(path):
            retcode, output = git_commit(
                fn=cmd_output_mocked_pre_commit_home,
                tempdir_factory=tempdir_factory,
            )
            assert retcode == 0
            assert 'Bash hook....' in output


def test_init_templatedir_already_set(tmpdir, tempdir_factory, store, cap_out):
    target = str(tmpdir.join('tmpl'))
    tmp_git_dir = git_dir(tempdir_factory)
    with cwd(tmp_git_dir):
        cmd_output('git', 'config', 'init.templateDir', target)
        init_templatedir(
            C.CONFIG_FILE, store, target, hook_types=['pre-commit'],
        )

    lines = cap_out.get().splitlines()
    assert len(lines) == 1
    assert lines[0].startswith('pre-commit installed at')


def test_init_templatedir_not_set(tmpdir, store, cap_out):
    # set HOME to ignore the current `.gitconfig`
    with envcontext((('HOME', str(tmpdir)),)):
        with tmpdir.join('tmpl').ensure_dir().as_cwd():
            # we have not set init.templateDir so this should produce a warning
            init_templatedir(
                C.CONFIG_FILE, store, '.', hook_types=['pre-commit'],
            )

    lines = cap_out.get().splitlines()
    assert len(lines) == 3
    assert lines[1] == (
        '[WARNING] `init.templateDir` not set to the target directory'
    )


def test_init_templatedir_expanduser(tmpdir, tempdir_factory, store, cap_out):
    target = str(tmpdir.join('tmpl'))
    tmp_git_dir = git_dir(tempdir_factory)
    with cwd(tmp_git_dir):
        cmd_output('git', 'config', 'init.templateDir', '~/templatedir')
        with mock.patch.object(os.path, 'expanduser', return_value=target):
            init_templatedir(
                C.CONFIG_FILE, store, target, hook_types=['pre-commit'],
            )

    lines = cap_out.get().splitlines()
    assert len(lines) == 1
    assert lines[0].startswith('pre-commit installed at')


def test_init_templatedir_hookspath_set(tmpdir, tempdir_factory, store):
    target = tmpdir.join('tmpl')
    tmp_git_dir = git_dir(tempdir_factory)
    with cwd(tmp_git_dir):
        cmd_output('git', 'config', '--local', 'core.hooksPath', 'hooks')
        init_templatedir(
            C.CONFIG_FILE, store, target, hook_types=['pre-commit'],
        )
    assert target.join('hooks/pre-commit').exists()


@pytest.mark.parametrize(
    ('skip', 'commit_retcode', 'commit_output_snippet'),
    (
        (True, 0, 'Skipping `pre-commit`.'),
        (False, 1, f'No {C.CONFIG_FILE} file was found'),
    ),
)
def test_init_templatedir_skip_on_missing_config(
    tmpdir,
    tempdir_factory,
    store,
    cap_out,
    skip,
    commit_retcode,
    commit_output_snippet,
):
    target = str(tmpdir.join('tmpl'))
    init_git_dir = git_dir(tempdir_factory)
    with cwd(init_git_dir):
        cmd_output('git', 'config', 'init.templateDir', target)
        init_templatedir(
            C.CONFIG_FILE,
            store,
            target,
            hook_types=['pre-commit'],
            skip_on_missing_config=skip,
        )

    lines = cap_out.get().splitlines()
    assert len(lines) == 1
    assert lines[0].startswith('pre-commit installed at')

    with envcontext((('GIT_TEMPLATE_DIR', target),)):
        verify_git_dir = git_dir(tempdir_factory)

    with cwd(verify_git_dir):
        retcode, output = git_commit(
            fn=cmd_output_mocked_pre_commit_home,
            tempdir_factory=tempdir_factory,
            retcode=None,
        )

        assert retcode == commit_retcode
        assert commit_output_snippet in output