diff options
Diffstat (limited to 'tests/run_tests.sh')
| -rw-r--r-- | tests/run_tests.sh | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/tests/run_tests.sh b/tests/run_tests.sh new file mode 100644 index 0000000..e0134fc --- /dev/null +++ b/tests/run_tests.sh @@ -0,0 +1,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 ] |