1#!/usr/bin/env bash
2set -euo pipefail
3
4# always execute relative to here
5cd "$(dirname "$0")"
6
7# add the built direnv to the path
8root=$(cd .. && pwd -P)
9export PATH=$root:$PATH
10
11load_stdlib() {
12  # shellcheck disable=SC1090
13  source "$root/stdlib.sh"
14}
15
16assert_eq() {
17  if [[ $1 != "$2" ]]; then
18    echo "expected '$1' to equal '$2'"
19    return 1
20  fi
21}
22
23test_name() {
24  echo "--- $*"
25}
26
27test_name dotenv
28(
29  load_stdlib
30
31  workdir=$(mktemp -d)
32  trap 'rm -rf "$workdir"' EXIT
33
34  cd "$workdir"
35
36  # Try to source a file that doesn't exist - should not succeed
37  dotenv .env.non_existing_file && return 1
38
39  # Try to source a file that exists
40  echo "export FOO=bar" > .env
41  dotenv .env
42  [[ $FOO = bar ]]
43)
44
45test_name dotenv_if_exists
46(
47  load_stdlib
48
49  workdir=$(mktemp -d)
50  trap 'rm -rf "$workdir"' EXIT
51
52  cd "$workdir"
53
54  # Try to source a file that doesn't exist - should succeed
55  dotenv_if_exists .env.non_existing_file  || return 1
56
57  # Try to source a file that exists
58  echo "export FOO=bar" > .env
59  dotenv_if_exists .env
60  [[ $FOO = bar ]]
61)
62
63test_name find_up
64(
65  load_stdlib
66  path=$(find_up "README.md")
67  assert_eq "$path" "$root/README.md"
68)
69
70test_name source_up
71(
72  load_stdlib
73  cd scenarios/inherited
74  source_up
75)
76
77test_name direnv_apply_dump
78(
79  tmpfile=$(mktemp)
80  cleanup() { rm "$tmpfile"; }
81  trap cleanup EXIT
82
83  load_stdlib
84  FOO=bar direnv dump > "$tmpfile"
85  direnv_apply_dump "$tmpfile"
86  assert_eq "$FOO" bar
87)
88
89test_name PATH_rm
90(
91  load_stdlib
92
93  export PATH=/usr/local/bin:/home/foo/bin:/usr/bin:/home/foo/.local/bin
94  PATH_rm '/home/foo/*'
95
96  assert_eq "$PATH" /usr/local/bin:/usr/bin
97)
98
99test_name path_rm
100(
101  load_stdlib
102
103  somevar=/usr/local/bin:/usr/bin:/home/foo/.local/bin
104  path_rm somevar '/home/foo/*'
105
106  assert_eq "$somevar" /usr/local/bin:/usr/bin
107)
108
109test_name expand_path
110(
111  load_stdlib
112  tmpdir=$(mktemp -d)
113  trap 'rm -rf $tmpdir' EXIT
114
115  cd "$tmpdir"
116  ret=$(expand_path ./bar)
117
118  assert_eq "$ret" "$tmpdir/bar"
119)
120
121test_name semver_search
122(
123  load_stdlib
124  versions=$(mktemp -d)
125  trap 'rm -rf $versions' EXIT
126
127  mkdir "$versions/program-1.4.0"
128  mkdir "$versions/program-1.4.1"
129  mkdir "$versions/program-1.5.0"
130  mkdir "$versions/1.6.0"
131
132  assert_eq "$(semver_search "$versions" "program-" "1.4.0")" "1.4.0"
133  assert_eq "$(semver_search "$versions" "program-" "1.4")"   "1.4.1"
134  assert_eq "$(semver_search "$versions" "program-" "1")"     "1.5.0"
135  assert_eq "$(semver_search "$versions" "program-" "1.8")"   ""
136  assert_eq "$(semver_search "$versions" "" "1.6")"           "1.6.0"
137  assert_eq "$(semver_search "$versions" "program-" "")"      "1.5.0"
138  assert_eq "$(semver_search "$versions" "" "")"              "1.6.0"
139)
140
141test_name use_julia
142(
143  load_stdlib
144  JULIA_VERSIONS=$(TMPDIR=. mktemp -d -t tmp.XXXXXXXXXX)
145  trap 'rm -rf $JULIA_VERSIONS' EXIT
146
147  test_julia() {
148    version_prefix="$1"
149    version="$2"
150    # Fake the existence of a julia binary
151    julia=$JULIA_VERSIONS/$version_prefix$version/bin/julia
152    mkdir -p "$(dirname "$julia")"
153    echo "#!/usr/bin/env bash
154    echo \"test-julia $version\"" > "$julia"
155    chmod +x "$julia"
156    # Locally disable set -u (see https://github.com/direnv/direnv/pull/667)
157    if ! [[ "$(set +u; use julia "$version" 2>&1)" =~ Successfully\ loaded\ test-julia\ $version ]]; then
158      return 1
159    fi
160  }
161
162  # Default JULIA_VERSION_PREFIX
163  unset JULIA_VERSION_PREFIX
164  test_julia "julia-" "1.0.0"
165  test_julia "julia-" "1.1"
166  # Custom JULIA_VERSION_PREFIX
167  JULIA_VERSION_PREFIX="jl-"
168  test_julia "jl-"    "1.2.0"
169  test_julia "jl-"    "1.3"
170  # Empty JULIA_VERSION_PREFIX
171  # shellcheck disable=SC2034
172  JULIA_VERSION_PREFIX=
173  test_julia ""    "1.4.0"
174  test_julia ""    "1.5"
175)
176
177test_name source_env_if_exists
178(
179  load_stdlib
180
181  workdir=$(mktemp -d)
182  trap 'rm -rf "$workdir"' EXIT
183
184  cd "$workdir"
185
186  # Try to source a file that doesn't exist
187  source_env_if_exists non_existing_file
188
189  # Try to source a file that exists
190  echo "export FOO=bar" > existing_file
191  source_env_if_exists existing_file
192  [[ $FOO = bar ]]
193)
194
195# test strict_env and unstrict_env
196./strict_env_test.bash
197
198echo OK
199