blob: b1b2c067591d4ed063e223978bdb8f84bb8bc898 (
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
|
#!/usr/bin/env fish
#
# Test suite for the sh-ves fish shim. Mirrors the core lifecycle checks of
# run_tests.sh, driven through the ves.fish wrapper function.
#
# $ fish tests/run_tests.fish
set fails 0
set checks 0
function assert_eq
set -g checks (math $checks + 1)
if test "$argv[2]" = "$argv[3]"
printf "ok - %s\n" $argv[1]
else
printf "FAIL - %s\n expected: [%s]\n actual: [%s]\n" $argv[1] $argv[2] $argv[3]
set -g fails (math $fails + 1)
end
end
function assert_status
set -g checks (math $checks + 1)
if test $argv[2] -eq $argv[3]
printf "ok - %s\n" $argv[1]
else
printf "FAIL - %s\n expected status: [%s]\n actual status: [%s]\n" $argv[1] $argv[2] $argv[3]
set -g fails (math $fails + 1)
end
end
# Set up an isolated sh-ves installation in a temp directory.
set tmpdir (mktemp -d); or exit 1
set script_dir (cd (dirname (status filename))/..; and pwd)
set -gx XDG_DATA_HOME $tmpdir/share
set -gx SHVES_SCRIPTS_DIR $script_dir
source $script_dir/ves.fish
# --- creation ----------------------------------------------------------------
ves create test_env > /dev/null
assert_status "create succeeds" 0 $status
ves create test_env > /dev/null 2>&1
assert_status "duplicate create fails" 1 $status
# --- export to an inactive environment ---------------------------------------
ves export --env=test_env MY_VAR hello > /dev/null
assert_status "export --env succeeds" 0 $status
assert_eq "inactive export does not touch shell" "" "$MY_VAR"
# --- activation --------------------------------------------------------------
set prior_path "$PATH"
ves activate test_env
assert_status "activate succeeds" 0 $status
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 test_env > /dev/null 2>&1
assert_status "second activation refused" 1 $status
# --- live modification -------------------------------------------------------
ves export MY_VAR goodbye > /dev/null
assert_eq "export updates active shell" "goodbye" "$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-rm MY_PATH /opt/bar > /dev/null
assert_eq "var-rm removes entry" "/opt/foo" "$MY_PATH"
set prior_path_head $PATH[1]
ves var-add PATH /opt/mybin > /dev/null
assert_eq "var-add PATH visible to children" "/opt/mybin" (sh -c 'printf %s "${PATH%%:*}"')
assert_eq "PATH stays a fish list" "/opt/mybin" "$PATH[1]"
assert_eq "var-add PATH seeds from live value" "$prior_path_head" "$PATH[2]"
ves var-rm PATH /opt/mybin > /dev/null
assert_eq "prompt shows active env" "(VENV test_env)" (ves prompt)
# --- deactivation ------------------------------------------------------------
ves deactivate
assert_status "deactivate succeeds" 0 $status
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"
ves deactivate > /dev/null 2>&1
assert_status "double deactivate fails" 1 $status
# --- show / unset / copy / rename / run / switch -------------------------
assert_eq "show prints stored variables" "MY_VAR=goodbye" (ves show test_env | grep MY_VAR)
ves export --env=test_env TMP_VAR x > /dev/null
ves unset --env=test_env TMP_VAR > /dev/null
assert_status "unset succeeds" 0 $status
assert_eq "unset removes variable" "" (ves show test_env | grep TMP_VAR)
set -gx MY_VAR original
ves activate test_env > /dev/null
ves unset MY_VAR > /dev/null
assert_eq "live unset restores prior value" "original" "$MY_VAR"
ves deactivate > /dev/null
set -e MY_VAR
# restore the variable for the run check below
ves export --env=test_env MY_VAR goodbye > /dev/null
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" "AP_PATH=/opt/a:/opt/b" (ves show test_env | grep AP_PATH)
ves copy test_env copy_env > /dev/null
assert_status "copy succeeds" 0 $status
ves rename copy_env renamed_env > /dev/null
assert_status "rename succeeds" 0 $status
ves delete renamed_env > /dev/null
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 create other_env > /dev/null
ves activate other_env > /dev/null
ves switch test_env > /dev/null
assert_eq "switch changes active env" "test_env" "$SHVES_ENV_NM"
ves deactivate > /dev/null
ves delete other_env > /dev/null
# --- completions ----------------------------------------------------------
source $script_dir/completions/ves.fish
set -l comp (complete -C'ves activ')
assert_eq "subcommand completion works" "activate" (string split \t -- $comp[1])[1]
set -l comp (complete -C'ves activate ')
assert_eq "env name completion works" "test_env" (string split \t -- $comp[1])[1]
# --- envs / delete -----------------------------------------------------------
assert_eq "envs lists environments" "test_env" (ves envs)
ves delete test_env > /dev/null
assert_status "delete succeeds" 0 $status
# --- summary -------------------------------------------------------------
rm -rf $tmpdir
printf "\n%d checks, %d failures\n" $checks $fails
test $fails -eq 0
|