Skip to content

Commit 123e691

Browse files
authored
Merge pull request #43 from nodenv/tests
Improve test coverage
2 parents 8beca12 + 1f93846 commit 123e691

File tree

9 files changed

+111
-73
lines changed

9 files changed

+111
-73
lines changed

etc/nodenv.d/version-name/package-json-engine.bash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
source "$(plugin_root)/libexec/nodenv-package-json-engine"
55

66
if ! NODENV_PACKAGE_JSON_VERSION=$(get_version_respecting_precedence); then
7-
echo "package-json-engine: no version satisfying \`$(get_expression_respecting_precedence)' installed" >&2
7+
echo "package-json-engine: version satisfying \`$(get_expression_respecting_precedence)' not installed" >&2
88
exit 1
99
elif [ -n "$NODENV_PACKAGE_JSON_VERSION" ]; then
1010
export NODENV_VERSION="${NODENV_PACKAGE_JSON_VERSION}"

libexec/nodenv-package-json-engine

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ package_json_has_precedence() {
2323
}
2424

2525
find_package_json_path() {
26-
root="$1"
26+
local package_json root="$1"
2727
while [ -n "$root" ]; do
28-
if [ -e "${root}/package.json" ]; then
29-
echo "${root}/package.json"
28+
package_json="$root/package.json"
29+
30+
if [ -r "$package_json" ] && [ -f "$package_json" ]; then
31+
echo "$package_json"
3032
return
3133
fi
3234
root="${root%/*}"
@@ -37,7 +39,7 @@ extract_version_from_package_json() {
3739
package_json_path="$1"
3840
version_regex='\["engines","node"\][[:space:]]*"([^"]*)"'
3941
# -b -n gives minimal output - see https://github.com/dominictarr/JSON.sh#options
40-
[[ $("$JSON_SH" -b -n < "$package_json_path") =~ $version_regex ]]
42+
[[ $("$JSON_SH" -b -n < "$package_json_path" 2>/dev/null) =~ $version_regex ]]
4143
echo "${BASH_REMATCH[1]}"
4244
}
4345

test/fixtures/node-x.y.z/bin/node

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../..
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../node-x.y.z
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../node-x.y.z
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../node-x.y.z

test/nodenv-package-json-engine.bats

100644100755
Lines changed: 84 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,91 +3,130 @@
33
load test_helper
44

55
@test 'Recognizes simple node version specified in package.json engines' {
6-
create_version 4.2.1
7-
cd_into_package 4.2.1
6+
in_package_for_engine 4.2.1
87

98
run nodenv version
109
assert_success '4.2.1 (set by package-json-engine matching 4.2.1)'
11-
run nodenv which node
12-
assert_success "${NODENV_ROOT}/versions/4.2.1/bin/node"
13-
}
14-
15-
@test 'Recognizes a semver range matching an installed version' {
16-
create_version 4.2.1
17-
cd_into_package '>= 4.0.0'
18-
19-
run nodenv version
20-
assert_success '4.2.1 (set by package-json-engine matching >= 4.0.0)'
2110
}
2211

2312
@test 'Prefers the greatest installed version matching a range' {
24-
create_version 4.0.0
25-
create_version 4.2.1
26-
cd_into_package '^4.0.0'
13+
in_package_for_engine '^4.0.0'
2714

2815
run nodenv version
2916
assert_success '4.2.1 (set by package-json-engine matching ^4.0.0)'
3017
}
3118

3219
@test 'Ignores non-matching installed versions' {
33-
create_version 0.12.7
34-
cd_into_package '>= 4.0.0'
35-
36-
# For unknown reasons, nodenv-version succeeds when version-name fails,
37-
# so we're testing version-name directly
38-
run nodenv version-name
39-
assert [ "$output" = "package-json-engine: no version satisfying \`>= 4.0.0' installed" ]
40-
assert [ "$status" -eq 1 ]
20+
in_package_for_engine '^1.0.0'
4121

42-
# `which` should fail similarly
43-
run nodenv which node
44-
assert echo "$output" | grep 'no version satisfying'
45-
assert [ "$status" -eq 1 ]
22+
run nodenv version
23+
# note the command completes successfully
24+
assert_success "package-json-engine: version satisfying \`^1.0.0' not installed
25+
(set by package-json-engine matching ^1.0.0)"
4626
}
4727

4828
@test 'Prefers nodenv-local over package.json' {
49-
create_version 4.2.1
50-
create_version 5.0.0
51-
cd_into_package 4.2.1
29+
in_package_for_engine 4.2.1
5230
nodenv local 5.0.0
5331

5432
run nodenv version
5533
assert_success "5.0.0 (set by $PWD/.node-version)"
5634
}
5735

5836
@test 'Prefers nodenv-shell over package.json' {
59-
create_version 5.0.0
60-
cd_into_package 4.2.1
61-
eval "$(nodenv sh-shell 5.0.0)"
37+
in_package_for_engine 4.2.1
6238

63-
run nodenv version
39+
NODENV_VERSION=5.0.0 run nodenv version
6440
assert_success "5.0.0 (set by NODENV_VERSION environment variable)"
6541
}
6642

6743
@test 'Prefers package.json over nodenv-global' {
68-
create_version 4.2.1
69-
create_version 5.0.0
70-
cd_into_package 4.2.1
44+
in_package_for_engine 4.2.1
7145
nodenv global 5.0.0
7246

7347
run nodenv version-name
7448
assert_success '4.2.1'
7549
}
7650

7751
@test 'Is not confused by nodenv-shell shadowing nodenv-global' {
78-
create_version 4.2.1
79-
create_version 5.0.0
80-
cd_into_package 4.2.1
52+
in_package_for_engine 4.2.1
8153
nodenv global 5.0.0
82-
eval "$(nodenv sh-shell 5.0.0)"
54+
55+
NODENV_VERSION=5.0.0 run nodenv version
56+
assert_success "5.0.0 (set by NODENV_VERSION environment variable)"
57+
}
58+
59+
@test 'Does not match arbitrary "node" key in package.json' {
60+
in_package_with_babel_env
8361

8462
run nodenv version-name
85-
assert_success '5.0.0'
63+
64+
assert_success 'system'
8665
}
8766

88-
@test 'Does not match babel preset env settings' {
89-
create_version 4.2.1
90-
cd_into_babel_env_package
67+
@test 'Handles missing package.json' {
68+
in_example_package
69+
9170
run nodenv version-name
71+
9272
assert_success 'system'
9373
}
74+
75+
@test 'Does not fail with unreadable package.json' {
76+
in_example_package
77+
touch package.json
78+
chmod -r package.json
79+
80+
run nodenv version-name
81+
82+
assert_success 'system'
83+
}
84+
85+
@test 'Does not fail with non-file package.json' {
86+
in_example_package
87+
mkdir package.json
88+
89+
run nodenv version-name
90+
91+
assert_success 'system'
92+
}
93+
94+
@test 'Does not fail with empty or malformed package.json' {
95+
in_example_package
96+
97+
# empty
98+
touch package.json
99+
run nodenv version-name
100+
assert_success 'system'
101+
102+
# non json
103+
echo "foo" > package.json
104+
run nodenv version-name
105+
assert_success 'system'
106+
107+
# malformed
108+
echo "{" > package.json
109+
run nodenv version-name
110+
assert_success 'system'
111+
}
112+
113+
@test 'Handles multiple occurrences of "node" key' {
114+
in_example_package
115+
cat << JSON > package.json
116+
{
117+
"engines": {
118+
"node": "4.2.1"
119+
},
120+
"presets": [
121+
["env", {
122+
"targets": {
123+
"node": "current"
124+
}
125+
}]
126+
]
127+
}
128+
JSON
129+
130+
run nodenv version-name
131+
assert_success '4.2.1'
132+
}

test/test_helper.bash

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,40 @@ setup() {
77
unset NODENV_VERSION
88

99
local node_modules_bin=$BATS_TEST_DIRNAME/../node_modules/.bin
10-
local plugin_bin=$BATS_TEST_DIRNAME/../bin
1110

12-
export PATH="$plugin_bin:$node_modules_bin:/usr/bin:/bin:/usr/sbin:/sbin"
11+
export PATH="$node_modules_bin:/usr/bin:/bin:/usr/sbin:/sbin"
1312

14-
export NODENV_ROOT="$BATS_TMPDIR/nodenv_root"
15-
export NODENV_HOOK_PATH="$BATS_TEST_DIRNAME/../etc/nodenv.d"
16-
17-
# unique
13+
export NODENV_ROOT="$BATS_TEST_DIRNAME/fixtures/nodenv_root"
1814

15+
# custom setup
1916
EXAMPLE_PACKAGE_DIR="$BATS_TMPDIR/example_package"
17+
mkdir -p "$EXAMPLE_PACKAGE_DIR"
18+
cd "$EXAMPLE_PACKAGE_DIR" || return 1
2019
}
2120

2221
teardown() {
23-
rm -r "$EXAMPLE_PACKAGE_DIR"
24-
rm -r "$NODENV_ROOT"
22+
rm -f "$EXAMPLE_PACKAGE_DIR"/.node-version
23+
rm -rf "$EXAMPLE_PACKAGE_DIR"/package.json
24+
rm -f "$NODENV_ROOT/version"
2525
}
2626

27-
# cd_into_package nodeVersion [extraArgs]
28-
cd_into_package() {
29-
mkdir -p "$EXAMPLE_PACKAGE_DIR"
27+
in_example_package() {
3028
cd "$EXAMPLE_PACKAGE_DIR" || return 1
31-
local version="$1"
29+
}
30+
31+
in_package_for_engine() {
32+
in_example_package
3233
cat << JSON > package.json
3334
{
3435
"engines": {
35-
"node": "$version"
36+
"node": "$1"
3637
}
3738
}
3839
JSON
3940
}
4041

41-
cd_into_babel_env_package() {
42-
mkdir -p "$EXAMPLE_PACKAGE_DIR"
43-
cd "$EXAMPLE_PACKAGE_DIR" || return 1
42+
in_package_with_babel_env() {
43+
in_example_package
4444
cat << JSON > package.json
4545
{
4646
"presets": [
@@ -53,10 +53,3 @@ cd_into_babel_env_package() {
5353
}
5454
JSON
5555
}
56-
57-
# Creates fake version directory
58-
create_version() {
59-
d="$NODENV_ROOT/versions/$1/bin"
60-
mkdir -p "$d"
61-
ln -s /bin/echo "$d/node"
62-
}

0 commit comments

Comments
 (0)