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
|
from __future__ import annotations
from unittest import mock
import pytest
import pre_commit.constants as C
from pre_commit import parse_shebang
from pre_commit.languages import rust
from pre_commit.store import _make_local_repo
from testing.language_helpers import run_language
from testing.util import cwd
ACTUAL_GET_DEFAULT_VERSION = rust.get_default_version.__wrapped__
@pytest.fixture
def cmd_output_b_mck():
with mock.patch.object(rust, 'cmd_output_b') as mck:
yield mck
def test_sets_system_when_rust_is_available(cmd_output_b_mck):
cmd_output_b_mck.return_value = (0, b'', b'')
assert ACTUAL_GET_DEFAULT_VERSION() == 'system'
def test_uses_default_when_rust_is_not_available(cmd_output_b_mck):
cmd_output_b_mck.return_value = (127, b'', b'error: not found')
assert ACTUAL_GET_DEFAULT_VERSION() == C.DEFAULT
def test_selects_system_even_if_rust_toolchain_toml(tmp_path):
toolchain_toml = '[toolchain]\nchannel = "wtf"\n'
tmp_path.joinpath('rust-toolchain.toml').write_text(toolchain_toml)
with cwd(tmp_path):
assert ACTUAL_GET_DEFAULT_VERSION() == 'system'
def _make_hello_world(tmp_path):
src_dir = tmp_path.joinpath('src')
src_dir.mkdir()
src_dir.joinpath('main.rs').write_text(
'fn main() {\n'
' println!("Hello, world!");\n'
'}\n',
)
tmp_path.joinpath('Cargo.toml').write_text(
'[package]\n'
'name = "hello_world"\n'
'version = "0.1.0"\n'
'edition = "2021"\n',
)
def test_installs_rust_missing_rustup(tmp_path):
_make_hello_world(tmp_path)
# pretend like `rustup` doesn't exist so it gets bootstrapped
calls = []
orig = parse_shebang.find_executable
def mck(exe, env=None):
calls.append(exe)
if len(calls) == 1:
assert exe == 'rustup'
return None
return orig(exe, env=env)
with mock.patch.object(parse_shebang, 'find_executable', side_effect=mck):
ret = run_language(tmp_path, rust, 'hello_world', version='1.56.0')
assert calls == ['rustup', 'rustup', 'cargo', 'hello_world']
assert ret == (0, b'Hello, world!\n')
@pytest.mark.parametrize('version', (C.DEFAULT, '1.56.0'))
def test_language_version_with_rustup(tmp_path, version):
assert parse_shebang.find_executable('rustup') is not None
_make_hello_world(tmp_path)
ret = run_language(tmp_path, rust, 'hello_world', version=version)
assert ret == (0, b'Hello, world!\n')
@pytest.mark.parametrize('dep', ('cli:shellharden:4.2.0', 'cli:shellharden'))
def test_rust_cli_additional_dependencies(tmp_path, dep):
_make_local_repo(str(tmp_path))
t_sh = tmp_path.joinpath('t.sh')
t_sh.write_text('echo $hi\n')
assert rust.get_default_version() == 'system'
ret = run_language(
tmp_path,
rust,
'shellharden --transform',
deps=(dep,),
args=(str(t_sh),),
)
assert ret == (0, b'echo "$hi"\n')
def test_run_lib_additional_dependencies(tmp_path):
_make_hello_world(tmp_path)
deps = ('shellharden:4.2.0', 'git-version')
ret = run_language(tmp_path, rust, 'hello_world', deps=deps)
assert ret == (0, b'Hello, world!\n')
bin_dir = tmp_path.joinpath('rustenv-system', 'bin')
assert bin_dir.is_dir()
assert not bin_dir.joinpath('shellharden').exists()
assert not bin_dir.joinpath('shellharden.exe').exists()
|