aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/run_tests.fish159
-rw-r--r--tests/run_tests.sh229
2 files changed, 388 insertions, 0 deletions
diff --git a/tests/run_tests.fish b/tests/run_tests.fish
new file mode 100644
index 0000000..b1b2c06
--- /dev/null
+++ b/tests/run_tests.fish
@@ -0,0 +1,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
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 ]