diff --git a/testing/util.py b/testing/util.py index 40ee389b..4275a28a 100644 --- a/testing/util.py +++ b/testing/util.py @@ -49,6 +49,15 @@ def is_valid_according_to_schema(obj, schema): return False +def cmd_output_mocked_pre_commit_home(*args, **kwargs): + # keyword-only argument + tempdir_factory = kwargs.pop('tempdir_factory') + pre_commit_home = kwargs.pop('pre_commit_home', tempdir_factory.get()) + # Don't want to write to the home directory + env = dict(kwargs.pop('env', os.environ), PRE_COMMIT_HOME=pre_commit_home) + return cmd_output(*args, env=env, **kwargs) + + skipif_slowtests_false = pytest.mark.skipif( os.environ.get('slowtests') == 'false', reason='slowtests=false', diff --git a/tests/commands/install_uninstall_test.py b/tests/commands/install_uninstall_test.py index 9f22a788..7717a1f0 100644 --- a/tests/commands/install_uninstall_test.py +++ b/tests/commands/install_uninstall_test.py @@ -25,6 +25,7 @@ from pre_commit.util import mkdirp from pre_commit.util import resource_filename 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 xfailif_no_symlink @@ -121,23 +122,16 @@ def test_uninstall(tempdir_factory): assert not os.path.exists(runner.pre_commit_path) -def _get_commit_output( - tempdir_factory, - touch_file='foo', - home=None, - env_base=os.environ, -): +def _get_commit_output(tempdir_factory, touch_file='foo', **kwargs): cmd_output('touch', touch_file) cmd_output('git', 'add', touch_file) - # Don't want to write to home directory - home = home or tempdir_factory.get() - env = dict(env_base, PRE_COMMIT_HOME=home) - return cmd_output( + return cmd_output_mocked_pre_commit_home( 'git', 'commit', '-am', 'Commit!', '--allow-empty', # git commit puts pre-commit to stderr stderr=subprocess.STDOUT, - env=env, retcode=None, + tempdir_factory=tempdir_factory, + **kwargs )[:2] @@ -458,7 +452,7 @@ def test_installs_hooks_with_hooks_True( with cwd(path): install(Runner(path), hooks=True) ret, output = _get_commit_output( - tempdir_factory, home=mock_out_store_directory, + tempdir_factory, pre_commit_home=mock_out_store_directory, ) assert ret == 0 @@ -473,7 +467,7 @@ def test_installed_from_venv(tempdir_factory): # Should still pick up the python from when we installed ret, output = _get_commit_output( tempdir_factory, - env_base={ + env={ 'HOME': os.path.expanduser('~'), 'PATH': _path_without_us(), 'TERM': os.environ.get('TERM', ''), @@ -486,14 +480,11 @@ def test_installed_from_venv(tempdir_factory): def _get_push_output(tempdir_factory): - # Don't want to write to home directory - home = tempdir_factory.get() - env = dict(os.environ, PRE_COMMIT_HOME=home) - return cmd_output( + return cmd_output_mocked_pre_commit_home( 'git', 'push', 'origin', 'HEAD:new_branch', - # git commit puts pre-commit to stderr + # git push puts pre-commit to stderr stderr=subprocess.STDOUT, - env=env, + tempdir_factory=tempdir_factory, retcode=None, )[:2] diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index d3f4bf15..d23882e7 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -26,6 +26,7 @@ from testing.auto_namedtuple import auto_namedtuple from testing.fixtures import add_config_to_repo from testing.fixtures import make_consuming_repo from testing.fixtures import modify_config +from testing.util import cmd_output_mocked_pre_commit_home @pytest.yield_fixture @@ -336,11 +337,9 @@ def test_non_ascii_hook_id( ): with cwd(repo_with_passing_hook): install(Runner(repo_with_passing_hook)) - # Don't want to write to home directory - env = dict(os.environ, PRE_COMMIT_HOME=tempdir_factory.get()) - _, stdout, _ = cmd_output( + _, stdout, _ = cmd_output_mocked_pre_commit_home( sys.executable, '-m', 'pre_commit.main', 'run', '☃', - env=env, retcode=None, + retcode=None, tempdir_factory=tempdir_factory, ) assert 'UnicodeDecodeError' not in stdout # Doesn't actually happen, but a reasonable assertion @@ -357,15 +356,13 @@ def test_stdout_write_bug_py26( install(Runner(repo_with_failing_hook)) - # Don't want to write to home directory - env = dict(os.environ, PRE_COMMIT_HOME=tempdir_factory.get()) # Have to use subprocess because pytest monkeypatches sys.stdout - _, stdout, _ = cmd_output( + _, stdout, _ = cmd_output_mocked_pre_commit_home( 'git', 'commit', '-m', 'Commit!', # git commit puts pre-commit to stderr stderr=subprocess.STDOUT, - env=env, retcode=None, + tempdir_factory=tempdir_factory, ) assert 'UnicodeEncodeError' not in stdout # Doesn't actually happen, but a reasonable assertion @@ -377,15 +374,13 @@ def test_hook_install_failure(mock_out_store_directory, tempdir_factory): with cwd(git_path): install(Runner(git_path)) - # Don't want to write to home directory - env = dict(os.environ, PRE_COMMIT_HOME=tempdir_factory.get()) - _, stdout, _ = cmd_output( + _, stdout, _ = cmd_output_mocked_pre_commit_home( 'git', 'commit', '-m', 'Commit!', # git commit puts pre-commit to stderr stderr=subprocess.STDOUT, - env=env, retcode=None, encoding=None, + tempdir_factory=tempdir_factory, ) assert b'UnicodeDecodeError' not in stdout # Doesn't actually happen, but a reasonable assertion @@ -424,13 +419,11 @@ def test_lots_of_files(mock_out_store_directory, tempdir_factory): cmd_output('bash', '-c', 'git add .') install(Runner(git_path)) - # Don't want to write to home directory - env = dict(os.environ, PRE_COMMIT_HOME=tempdir_factory.get()) - cmd_output( + cmd_output_mocked_pre_commit_home( 'git', 'commit', '-m', 'Commit!', # git commit puts pre-commit to stderr stderr=subprocess.STDOUT, - env=env, + tempdir_factory=tempdir_factory, ) @@ -609,13 +602,11 @@ def test_files_running_subdir( cmd_output('git', 'add', 'subdir/foo.py') with cwd('subdir'): - # Don't want to write to home directory - env = dict(os.environ, PRE_COMMIT_HOME=tempdir_factory.get()) # Use subprocess to demonstrate behaviour in main - _, stdout, _ = cmd_output( + _, stdout, _ = cmd_output_mocked_pre_commit_home( sys.executable, '-m', 'pre_commit.main', 'run', '-v', # Files relative to where we are (#339) '--files', 'foo.py', - env=env, + tempdir_factory=tempdir_factory, ) assert 'subdir/foo.py'.replace('/', os.sep) in stdout diff --git a/tests/error_handler_test.py b/tests/error_handler_test.py index d63511b7..b5455b0c 100644 --- a/tests/error_handler_test.py +++ b/tests/error_handler_test.py @@ -13,7 +13,7 @@ import pytest from pre_commit import error_handler from pre_commit import five from pre_commit.errors import FatalError -from pre_commit.util import cmd_output +from testing.util import cmd_output_mocked_pre_commit_home @pytest.yield_fixture @@ -107,14 +107,14 @@ def test_error_handler_non_ascii_exception(mock_out_store_directory): def test_error_handler_no_tty(tempdir_factory): - output = cmd_output( + output = cmd_output_mocked_pre_commit_home( sys.executable, '-c', 'from __future__ import unicode_literals\n' 'from pre_commit.error_handler import error_handler\n' 'with error_handler():\n' ' raise ValueError("\\u2603")\n', - env=dict(os.environ, PRE_COMMIT_HOME=tempdir_factory.get()), retcode=1, + tempdir_factory=tempdir_factory, ) assert output[1].replace('\r', '') == ( 'An unexpected error has occurred: ValueError: ☃\n'