blob: 058a3294830993685481feeb48bed71a1700f9ba [file] [log] [blame]
Anthony Sottile8f615292022-01-15 19:24:05 -05001from __future__ import annotations
2
Mikhail Khvoinitsky10c5e4e2021-06-23 03:10:13 +03003import os
Anthony Sottile69f2da62018-10-12 19:37:46 -07004import subprocess
Mikhail Khvoinitsky10c5e4e2021-06-23 03:10:13 +03005from unittest import mock
Anthony Sottile69f2da62018-10-12 19:37:46 -07006
Anthony Sottile70e405e2016-11-30 09:56:42 -08007import pytest
Anthony Sottile70e405e2016-11-30 09:56:42 -08008
9from pre_commit_hooks.forbid_new_submodules import main
Mikhail Khvoinitsky10c5e4e2021-06-23 03:10:13 +030010from testing.util import git_commit
Anthony Sottile70e405e2016-11-30 09:56:42 -080011
12
Anthony Sottile4ab79142018-01-21 15:31:23 -080013@pytest.fixture
Anthony Sottile70e405e2016-11-30 09:56:42 -080014def git_dir_with_git_dir(tmpdir):
15 with tmpdir.as_cwd():
Anthony Sottile69f2da62018-10-12 19:37:46 -070016 subprocess.check_call(('git', 'init', '.'))
Mikhail Khvoinitsky10c5e4e2021-06-23 03:10:13 +030017 git_commit('--allow-empty', '-m', 'init')
Anthony Sottile69f2da62018-10-12 19:37:46 -070018 subprocess.check_call(('git', 'init', 'foo'))
Mikhail Khvoinitsky10c5e4e2021-06-23 03:10:13 +030019 git_commit('--allow-empty', '-m', 'init', cwd=str(tmpdir.join('foo')))
Anthony Sottile70e405e2016-11-30 09:56:42 -080020 yield
21
22
23@pytest.mark.parametrize(
24 'cmd',
25 (
26 # Actually add the submodule
27 ('git', 'submodule', 'add', './foo'),
28 # Sneaky submodule add (that doesn't show up in .gitmodules)
29 ('git', 'add', 'foo'),
30 ),
31)
32def test_main_new_submodule(git_dir_with_git_dir, capsys, cmd):
Anthony Sottile69f2da62018-10-12 19:37:46 -070033 subprocess.check_call(cmd)
Mikhail Khvoinitsky10c5e4e2021-06-23 03:10:13 +030034 assert main(('random_non-related_file',)) == 0
35 assert main(('foo',)) == 1
36 out, _ = capsys.readouterr()
37 assert out.startswith('foo: new submodule introduced\n')
38
39
40def test_main_new_submodule_committed(git_dir_with_git_dir, capsys):
41 rev_parse_cmd = ('git', 'rev-parse', 'HEAD')
42 from_ref = subprocess.check_output(rev_parse_cmd).decode().strip()
43 subprocess.check_call(('git', 'submodule', 'add', './foo'))
44 git_commit('-m', 'new submodule')
45 to_ref = subprocess.check_output(rev_parse_cmd).decode().strip()
46 with mock.patch.dict(
47 os.environ,
48 {'PRE_COMMIT_FROM_REF': from_ref, 'PRE_COMMIT_TO_REF': to_ref},
49 ):
50 assert main(('random_non-related_file',)) == 0
51 assert main(('foo',)) == 1
Anthony Sottile70e405e2016-11-30 09:56:42 -080052 out, _ = capsys.readouterr()
53 assert out.startswith('foo: new submodule introduced\n')
54
55
56def test_main_no_new_submodule(git_dir_with_git_dir):
57 open('test.py', 'a+').close()
Anthony Sottile69f2da62018-10-12 19:37:46 -070058 subprocess.check_call(('git', 'add', 'test.py'))
Mikhail Khvoinitsky10c5e4e2021-06-23 03:10:13 +030059 assert main(('test.py',)) == 0