Skip to content

Commit 918821b

Browse files
authored
Merge pull request pre-commit#1590 from pre-commit/nodeenv_system_healthy_fix
fix for node healthy() when system executable moves
2 parents f511afe + b149c7a commit 918821b

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

pre_commit/languages/node.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from pre_commit.util import cmd_output_b
2222

2323
ENVIRONMENT_DIR = 'node_env'
24-
healthy = helpers.basic_healthy
2524

2625

2726
@functools.lru_cache(maxsize=1)
@@ -73,6 +72,12 @@ def in_env(
7372
yield
7473

7574

75+
def healthy(prefix: Prefix, language_version: str) -> bool:
76+
with in_env(prefix, language_version):
77+
retcode, _, _ = cmd_output_b('node', '--version', retcode=None)
78+
return retcode == 0
79+
80+
7681
def install_environment(
7782
prefix: Prefix, version: str, additional_dependencies: Sequence[str],
7883
) -> None:

tests/languages/node_test.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
1+
import os
2+
import shutil
13
import sys
24
from unittest import mock
35

46
import pytest
57

68
import pre_commit.constants as C
9+
from pre_commit import envcontext
710
from pre_commit import parse_shebang
8-
from pre_commit.languages.node import get_default_version
11+
from pre_commit.languages import node
12+
from pre_commit.prefix import Prefix
13+
from testing.util import xfailif_windows
914

1015

11-
ACTUAL_GET_DEFAULT_VERSION = get_default_version.__wrapped__
16+
ACTUAL_GET_DEFAULT_VERSION = node.get_default_version.__wrapped__
1217

1318

1419
@pytest.fixture
@@ -45,3 +50,31 @@ def test_uses_default_when_node_and_npm_are_not_available(find_exe_mck):
4550
def test_sets_default_on_windows(find_exe_mck):
4651
find_exe_mck.return_value = '/path/to/exe'
4752
assert ACTUAL_GET_DEFAULT_VERSION() == C.DEFAULT
53+
54+
55+
@xfailif_windows # pragma: win32 no cover
56+
def test_healthy_system_node(tmpdir):
57+
tmpdir.join('package.json').write('{"name": "t", "version": "1.0.0"}')
58+
59+
prefix = Prefix(str(tmpdir))
60+
node.install_environment(prefix, 'system', ())
61+
assert node.healthy(prefix, 'system')
62+
63+
64+
@xfailif_windows # pragma: win32 no cover
65+
def test_unhealthy_if_system_node_goes_missing(tmpdir):
66+
bin_dir = tmpdir.join('bin').ensure_dir()
67+
node_bin = bin_dir.join('node')
68+
node_bin.mksymlinkto(shutil.which('node'))
69+
70+
prefix_dir = tmpdir.join('prefix').ensure_dir()
71+
prefix_dir.join('package.json').write('{"name": "t", "version": "1.0.0"}')
72+
73+
path = ('PATH', (str(bin_dir), os.pathsep, envcontext.Var('PATH')))
74+
with envcontext.envcontext((path,)):
75+
prefix = Prefix(str(prefix_dir))
76+
node.install_environment(prefix, 'system', ())
77+
assert node.healthy(prefix, 'system')
78+
79+
node_bin.remove()
80+
assert not node.healthy(prefix, 'system')

0 commit comments

Comments
 (0)