From 0ecfe53b2d271133fac36de11ecfc0f7e47840f0 Mon Sep 17 00:00:00 2001 From: "Douglas B. Rumbaugh" Date: Sat, 6 Jun 2026 12:27:03 -0400 Subject: Initial version complete I dusted this off after years and had Claude finish it for me. caveat emptor: this is largely (though not entirely) LLM generated as of this commit --- tests/run_tests.fish | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 tests/run_tests.fish (limited to 'tests/run_tests.fish') 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 -- cgit v1.2.3