aboutsummaryrefslogtreecommitdiffstats
path: root/tests/run_tests.sh
blob: e0134fcc34c487943b1ee1cadc69aa092004bec8 (plain)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#!/bin/sh
#
# Test suite for sh-ves. Runs the full create/activate/modify/deactivate
# lifecycle in an isolated temporary data directory and asserts on variable
# state at each step. Run with any POSIX shell:
#
#   $ sh tests/run_tests.sh
#   $ dash tests/run_tests.sh
#

fails=0
checks=0

assert_eq() {
    checks=$((checks + 1))
    if [ "$2" = "$3" ]; then
        printf "ok   - %s\n" "$1"
    else
        printf "FAIL - %s\n     expected: [%s]\n     actual:   [%s]\n" "$1" "$2" "$3"
        fails=$((fails + 1))
    fi
}

assert_status() {
    checks=$((checks + 1))
    if [ "$2" -eq "$3" ]; then
        printf "ok   - %s\n" "$1"
    else
        printf "FAIL - %s\n     expected status: [%s]\n     actual status:   [%s]\n" "$1" "$2" "$3"
        fails=$((fails + 1))
    fi
}

# Set up an isolated sh-ves installation in a temp directory.
tmpdir=$(mktemp -d) || exit 1
trap 'rm -rf "$tmpdir"' EXIT

script_dir=$(cd "$(dirname "$0")/.." && pwd)

XDG_DATA_HOME="$tmpdir/share"
SHVES_SCRIPTS_DIR="$script_dir"
export XDG_DATA_HOME SHVES_SCRIPTS_DIR

. "$script_dir/ves-init.sh"

# --- creation ---------------------------------------------------------------

ves create test_env > /dev/null
assert_status "create succeeds" 0 $?
assert_eq "env file created" "name: test_env" "$(cat "$SHVES_ENV_DIR/test_env")"

ves create test_env > /dev/null 2>&1
assert_status "duplicate create fails" 1 $?

ves create "bad name" > /dev/null 2>&1
assert_status "invalid name rejected" 1 $?

ves create --override ovr_env > /dev/null
assert_status "create --override succeeds" 0 $?
grep -q "^export_var:PATH=$" "$SHVES_ENV_DIR/ovr_env"
assert_status "--override truncates PATH" 0 $?

# --- export to an inactive environment --------------------------------------

ves export --env=test_env MY_VAR hello > /dev/null
assert_status "export --env succeeds" 0 $?
assert_eq "value stored in file" "hello" "$(_shves_get_var "$SHVES_ENV_DIR/test_env" MY_VAR)"
assert_eq "inactive export does not touch shell" "" "$MY_VAR"

ves export MY_VAR oops > /dev/null 2>&1
assert_status "export with no env active or given fails" 1 $?

# --- activation --------------------------------------------------------------

prior_path="$PATH"

ves activate test_env
assert_status "activate succeeds" 0 $?
assert_eq "active env name set" "test_env" "$SHVES_ENV_NM"
assert_eq "stored variable exported" "hello" "$MY_VAR"
assert_eq "child processes see variable" "hello" "$(sh -c 'printf %s "$MY_VAR"')"

ves activate ovr_env > /dev/null 2>&1
assert_status "second activation refused" 1 $?

# --- live modification -------------------------------------------------------

ves export MY_VAR goodbye > /dev/null
assert_eq "export updates active shell" "goodbye" "$MY_VAR"
assert_eq "export updates file" "goodbye" "$(_shves_get_var "$SHVES_ENV_DIR/test_env" MY_VAR)"

ves var-add MY_PATH /opt/foo > /dev/null
assert_eq "var-add creates :-list" "/opt/foo" "$MY_PATH"
ves var-add MY_PATH /opt/bar > /dev/null
assert_eq "var-add prepends" "/opt/bar:/opt/foo" "$MY_PATH"

ves var-add LDPATH mylib > /dev/null
assert_eq "var-add expands relative LDPATH entries" "$XDG_DATA_HOME/ves/lib/mylib" "$LDPATH"

ves var-add PATH /opt/mybin > /dev/null
assert_eq "var-add PATH seeds from live value" "/opt/mybin:$prior_path" "$PATH"
ves var-rm PATH /opt/mybin > /dev/null
assert_eq "var-rm PATH restores prior entries" "$prior_path" "$PATH"

ves var-rm LDPATH mylib > /dev/null
assert_eq "var-rm removes expanded entry" "" "$LDPATH"

ves var-rm MY_PATH /opt/bar > /dev/null
assert_eq "var-rm removes entry" "/opt/foo" "$MY_PATH"
ves var-rm MY_PATH /nonexistent > /dev/null 2>&1
assert_status "var-rm of absent entry fails" 1 $?

ves list MY_PATH > "$tmpdir/list.out"
assert_eq "list prints entries" "/opt/foo" "$(cat "$tmpdir/list.out")"

ves var-add MY_PATH /opt/baz > /dev/null
assert_eq "list --index" "0 /opt/baz
1 /opt/foo" "$(ves list --index MY_PATH)"

# --- prompt ------------------------------------------------------------------

assert_eq "prompt shows active env" "(VENV test_env)" "$(ves prompt)"
assert_eq "prompt with symbol" "(>> test_env)" "$(ves prompt '>>')"

# --- delete protection -------------------------------------------------------

ves delete test_env > /dev/null 2>&1
assert_status "deleting active env refused" 1 $?

# --- deactivation ------------------------------------------------------------

ves deactivate
assert_status "deactivate succeeds" 0 $?
assert_eq "env name cleared" "" "$SHVES_ENV_NM"
assert_eq "modified variable restored" "" "$MY_VAR"
assert_eq "var-add variable removed" "" "$MY_PATH"
assert_eq "PATH restored" "$prior_path" "$PATH"
assert_eq "prompt empty when inactive" "" "$(ves prompt)"

ves deactivate > /dev/null 2>&1
assert_status "double deactivate fails" 1 $?

# changes made while active must persist in the file
assert_eq "file retains exported value" "goodbye" "$(_shves_get_var "$SHVES_ENV_DIR/test_env" MY_VAR)"

# --- override environments ---------------------------------------------------

ves activate ovr_env
assert_eq "override env truncates PATH" "" "$PATH"
ves deactivate
assert_eq "PATH restored after override env" "$prior_path" "$PATH"

# --- show / unset ------------------------------------------------------------

assert_eq "show prints stored variables" "MY_VAR=goodbye" "$(ves show test_env | grep MY_VAR)"
ves show > /dev/null 2>&1
assert_status "show with no env active or given fails" 1 $?

ves unset --env=test_env MY_PATH > /dev/null
assert_status "unset succeeds" 0 $?
_shves_has_var "$SHVES_ENV_DIR/test_env" MY_PATH
assert_status "unset removes variable from file" 1 $?
ves unset --env=test_env NOSUCH > /dev/null 2>&1
assert_status "unset of absent variable fails" 1 $?

# unset while active restores the pre-activation value immediately
MY_VAR=original
export MY_VAR
ves activate test_env
ves unset MY_VAR > /dev/null
assert_eq "live unset restores prior value" "original" "$MY_VAR"
ves deactivate
assert_eq "deactivate after live unset is clean" "original" "$MY_VAR"
unset MY_VAR

# restore the variable for the run/switch checks below
ves export --env=test_env MY_VAR goodbye > /dev/null

# --- var-add --append ----------------------------------------------------

ves export --env=test_env AP_PATH /opt/a > /dev/null
ves var-add --env=test_env --append AP_PATH /opt/b > /dev/null
assert_eq "var-add --append appends" "/opt/a:/opt/b" "$(_shves_get_var "$SHVES_ENV_DIR/test_env" AP_PATH)"

# --- copy / rename -------------------------------------------------------

ves copy test_env copy_env > /dev/null
assert_status "copy succeeds" 0 $?
assert_eq "copy preserves variables" "$(ves show test_env)" "$(ves show copy_env)"
assert_eq "copy rewrites name header" "name: copy_env" "$(grep '^name:' "$SHVES_ENV_DIR/copy_env")"
ves copy test_env copy_env > /dev/null 2>&1
assert_status "copy onto existing env fails" 1 $?

ves rename copy_env renamed_env > /dev/null
assert_status "rename succeeds" 0 $?
_shves_check_env_exists copy_env 1
assert_status "rename removes old env" 1 $?
ves delete renamed_env > /dev/null

# --- run -----------------------------------------------------------------

assert_eq "run executes inside env" "goodbye" "$(ves run test_env sh -c 'printf %s "$MY_VAR"')"
assert_eq "run does not leak into shell" "" "$MY_VAR"
ves run nosuch_env true > /dev/null 2>&1
assert_status "run with bad env fails" 1 $?

# --- switch --------------------------------------------------------------

ves activate ovr_env > /dev/null
ves switch test_env > /dev/null
assert_eq "switch changes active env" "test_env" "$SHVES_ENV_NM"
assert_eq "switch applies new env vars" "goodbye" "$MY_VAR"
ves deactivate
assert_eq "deactivate after switch restores" "" "$MY_VAR"

# --- envs / delete -----------------------------------------------------------

assert_eq "envs lists environments" "ovr_env
test_env" "$(ves envs)"

ves delete test_env > /dev/null
assert_status "delete succeeds" 0 $?
ves delete ovr_env > /dev/null
assert_eq "envs empty after deletes" "" "$(ves envs)"

# --- summary -------------------------------------------------------------

printf "\n%d checks, %d failures\n" "$checks" "$fails"
[ "$fails" -eq 0 ]