summaryrefslogtreecommitdiffstats
path: root/tests/commands
diff options
context:
space:
mode:
Diffstat (limited to 'tests/commands')
-rw-r--r--tests/commands/autoupdate_test.py32
-rw-r--r--tests/commands/hook_impl_test.py10
-rw-r--r--tests/commands/install_uninstall_test.py57
-rw-r--r--tests/commands/migrate_config_test.py7
-rw-r--r--tests/commands/run_test.py19
5 files changed, 113 insertions, 12 deletions
diff --git a/tests/commands/autoupdate_test.py b/tests/commands/autoupdate_test.py
index 25161d1..bd89c1d 100644
--- a/tests/commands/autoupdate_test.py
+++ b/tests/commands/autoupdate_test.py
@@ -414,9 +414,9 @@ def test_autoupdate_local_hooks(in_git_dir, store):
config = sample_local_config()
add_config_to_repo('.', config)
assert autoupdate(C.CONFIG_FILE, store, freeze=False, tags_only=False) == 0
- new_config_writen = read_config('.')
- assert len(new_config_writen['repos']) == 1
- assert new_config_writen['repos'][0] == config
+ new_config_written = read_config('.')
+ assert len(new_config_written['repos']) == 1
+ assert new_config_written['repos'][0] == config
def test_autoupdate_local_hooks_with_out_of_date_repo(
@@ -429,9 +429,9 @@ def test_autoupdate_local_hooks_with_out_of_date_repo(
config = {'repos': [local_config, stale_config]}
write_config('.', config)
assert autoupdate(C.CONFIG_FILE, store, freeze=False, tags_only=False) == 0
- new_config_writen = read_config('.')
- assert len(new_config_writen['repos']) == 2
- assert new_config_writen['repos'][0] == local_config
+ new_config_written = read_config('.')
+ assert len(new_config_written['repos']) == 2
+ assert new_config_written['repos'][0] == local_config
def test_autoupdate_meta_hooks(tmpdir, store):
@@ -474,3 +474,23 @@ def test_updates_old_format_to_new_format(tmpdir, capsys, store):
)
out, _ = capsys.readouterr()
assert out == 'Configuration has been migrated.\n'
+
+
+def test_maintains_rev_quoting_style(tmpdir, out_of_date, store):
+ fmt = (
+ 'repos:\n'
+ '- repo: {path}\n'
+ ' rev: "{rev}"\n'
+ ' hooks:\n'
+ ' - id: foo\n'
+ '- repo: {path}\n'
+ " rev: '{rev}'\n"
+ ' hooks:\n'
+ ' - id: foo\n'
+ )
+ cfg = tmpdir.join(C.CONFIG_FILE)
+ cfg.write(fmt.format(path=out_of_date.path, rev=out_of_date.original_rev))
+
+ assert autoupdate(str(cfg), store, freeze=False, tags_only=False) == 0
+ expected = fmt.format(path=out_of_date.path, rev=out_of_date.head_rev)
+ assert cfg.read() == expected
diff --git a/tests/commands/hook_impl_test.py b/tests/commands/hook_impl_test.py
index ddf65b7..2fc0146 100644
--- a/tests/commands/hook_impl_test.py
+++ b/tests/commands/hook_impl_test.py
@@ -96,6 +96,7 @@ def test_run_legacy_recursive(tmpdir):
('pre-merge-commit', []),
('pre-push', ['branch_name', 'remote_name']),
('commit-msg', ['.git/COMMIT_EDITMSG']),
+ ('post-commit', []),
('post-checkout', ['old_head', 'new_head', '1']),
# multiple choices for commit-editmsg
('prepare-commit-msg', ['.git/COMMIT_EDITMSG']),
@@ -117,7 +118,7 @@ def test_check_args_length_error_too_many_plural():
)
-def test_check_args_length_error_too_many_singluar():
+def test_check_args_length_error_too_many_singular():
with pytest.raises(SystemExit) as excinfo:
hook_impl._check_args_length('commit-msg', [])
msg, = excinfo.value.args
@@ -149,6 +150,13 @@ def test_run_ns_commit_msg():
assert ns.commit_msg_filename == '.git/COMMIT_MSG'
+def test_run_ns_post_commit():
+ ns = hook_impl._run_ns('post-commit', True, (), b'')
+ assert ns is not None
+ assert ns.hook_stage == 'post-commit'
+ assert ns.color is True
+
+
def test_run_ns_post_checkout():
ns = hook_impl._run_ns('post-checkout', True, ('a', 'b', 'c'), b'')
assert ns is not None
diff --git a/tests/commands/install_uninstall_test.py b/tests/commands/install_uninstall_test.py
index 66b9190..5809a3f 100644
--- a/tests/commands/install_uninstall_test.py
+++ b/tests/commands/install_uninstall_test.py
@@ -726,6 +726,32 @@ def test_commit_msg_legacy(commit_msg_repo, tempdir_factory, store):
assert second_line.startswith('Must have "Signed off by:"...')
+def test_post_commit_integration(tempdir_factory, store):
+ path = git_dir(tempdir_factory)
+ config = [
+ {
+ 'repo': 'local',
+ 'hooks': [{
+ 'id': 'post-commit',
+ 'name': 'Post commit',
+ 'entry': 'touch post-commit.tmp',
+ 'language': 'system',
+ 'always_run': True,
+ 'verbose': True,
+ 'stages': ['post-commit'],
+ }],
+ },
+ ]
+ write_config(path, config)
+ with cwd(path):
+ _get_commit_output(tempdir_factory)
+ assert not os.path.exists('post-commit.tmp')
+
+ install(C.CONFIG_FILE, store, hook_types=['post-commit'])
+ _get_commit_output(tempdir_factory)
+ assert os.path.exists('post-commit.tmp')
+
+
def test_post_checkout_integration(tempdir_factory, store):
path = git_dir(tempdir_factory)
config = [
@@ -763,6 +789,37 @@ def test_post_checkout_integration(tempdir_factory, store):
assert 'some_file' not in stderr
+def test_skips_post_checkout_unstaged_changes(tempdir_factory, store):
+ path = git_dir(tempdir_factory)
+ config = {
+ 'repo': 'local',
+ 'hooks': [{
+ 'id': 'fail',
+ 'name': 'fail',
+ 'entry': 'fail',
+ 'language': 'fail',
+ 'always_run': True,
+ 'stages': ['post-checkout'],
+ }],
+ }
+ write_config(path, config)
+ with cwd(path):
+ cmd_output('git', 'add', '.')
+ _get_commit_output(tempdir_factory)
+
+ install(C.CONFIG_FILE, store, hook_types=['pre-commit'])
+ install(C.CONFIG_FILE, store, hook_types=['post-checkout'])
+
+ # make an unstaged change so staged_files_only fires
+ open('file', 'a').close()
+ cmd_output('git', 'add', 'file')
+ with open('file', 'w') as f:
+ f.write('unstaged changes')
+
+ retc, out = _get_commit_output(tempdir_factory, all_files=False)
+ assert retc == 0
+
+
def test_prepare_commit_msg_integration_failing(
failing_prepare_commit_msg_repo, tempdir_factory, store,
):
diff --git a/tests/commands/migrate_config_test.py b/tests/commands/migrate_config_test.py
index efc0d1c..6a049d5 100644
--- a/tests/commands/migrate_config_test.py
+++ b/tests/commands/migrate_config_test.py
@@ -1,6 +1,7 @@
import pytest
import pre_commit.constants as C
+from pre_commit.clientlib import InvalidConfigError
from pre_commit.commands.migrate_config import _indent
from pre_commit.commands.migrate_config import migrate_config
@@ -147,10 +148,10 @@ def test_migrate_config_sha_to_rev(tmpdir):
@pytest.mark.parametrize('contents', ('', '\n'))
-def test_empty_configuration_file_user_error(tmpdir, contents):
+def test_migrate_config_invalid_configuration(tmpdir, contents):
cfg = tmpdir.join(C.CONFIG_FILE)
cfg.write(contents)
- with tmpdir.as_cwd():
- assert not migrate_config(C.CONFIG_FILE)
+ with tmpdir.as_cwd(), pytest.raises(InvalidConfigError):
+ migrate_config(C.CONFIG_FILE)
# even though the config is invalid, this should be a noop
assert cfg.read() == contents
diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py
index c51bcff..2461ed5 100644
--- a/tests/commands/run_test.py
+++ b/tests/commands/run_test.py
@@ -939,7 +939,7 @@ def test_classifier_normalizes_filenames_on_windows_to_forward_slashes(tmpdir):
tmpdir.join('a/b/c').ensure()
with mock.patch.object(os, 'altsep', '/'):
with mock.patch.object(os, 'sep', '\\'):
- classifier = Classifier((r'a\b\c',))
+ classifier = Classifier.from_config((r'a\b\c',), '', '^$')
assert classifier.filenames == ['a/b/c']
@@ -947,7 +947,7 @@ def test_classifier_does_not_normalize_backslashes_non_windows(tmpdir):
with mock.patch.object(os.path, 'lexists', return_value=True):
with mock.patch.object(os, 'altsep', None):
with mock.patch.object(os, 'sep', '/'):
- classifier = Classifier((r'a/b\c',))
+ classifier = Classifier.from_config((r'a/b\c',), '', '^$')
assert classifier.filenames == [r'a/b\c']
@@ -1022,3 +1022,18 @@ def test_args_hook_only(cap_out, store, repo_with_passing_hook):
run_opts(hook='do_not_commit'),
)
assert b'identity-copy' not in printed
+
+
+def test_skipped_without_any_setup_for_post_checkout(in_git_dir, store):
+ environ = {'_PRE_COMMIT_SKIP_POST_CHECKOUT': '1'}
+ opts = run_opts(hook_stage='post-checkout')
+ assert run(C.CONFIG_FILE, store, opts, environ=environ) == 0
+
+
+def test_pre_commit_env_variable_set(cap_out, store, repo_with_passing_hook):
+ args = run_opts()
+ environ: EnvironT = {}
+ ret, printed = _do_run(
+ cap_out, store, repo_with_passing_hook, args, environ,
+ )
+ assert environ['PRE_COMMIT'] == '1'