#!/bin/sh die () { echo "$@" ; cleanup ; exit 1; } cleanup() { unset -f install_nvm_from_git install_nvm_as_script nvm_detect_profile nvm_has unset -f nvm_check_global_modules nvm_install_node unset -f setup cleanup die assert_nvm_dir_line unset NVM_ENV METHOD PROFILE rm -rf "${TMPDIR_FOR_TEST-}" 2>/dev/null } setup() { NVM_ENV=testing \. ../../install.sh # Mock installation functions to do nothing install_nvm_from_git() { :; } install_nvm_as_script() { :; } nvm_check_global_modules() { :; } nvm_install_node() { :; } # Mock nvm_has to return true for git nvm_has() { case "$1" in git) return 0 ;; xcode-select) return 1 ;; *) return 1 ;; esac } # no profile found, so the lines to add are printed nvm_detect_profile() { echo "" } } TMPDIR_FOR_TEST="$(mktemp -d)" TEST_HOME="${TMPDIR_FOR_TEST}/home" mkdir -p "${TEST_HOME}/.nvm" "${TEST_HOME}2/nvm" "${TMPDIR_FOR_TEST}/a.b/.nvm" "${TMPDIR_FOR_TEST}/axb/.nvm" "${TMPDIR_FOR_TEST}/c:d/.nvm" # `nvm_do_install` unsets every `nvm_` function when it finishes, so each run sources the installer and mocks afresh. assert_nvm_dir_line() { setup OUTPUT="$(HOME="$1" PROFILE='' METHOD='' NVM_DIR="$2" nvm_do_install 2>/dev/null)" EXPECTED="export NVM_DIR=\"$3\"" echo "${OUTPUT}" | command grep -qxF "${EXPECTED}" || die "HOME=$1 NVM_DIR=$2: expected line >${EXPECTED}<; got >${OUTPUT}<" } # inside $HOME: written relative to $HOME assert_nvm_dir_line "${TEST_HOME}" "${TEST_HOME}/.nvm" '$HOME/.nvm' # a sibling directory whose name starts with $HOME is not inside $HOME assert_nvm_dir_line "${TEST_HOME}" "${TEST_HOME}2/nvm" "${TEST_HOME}2/nvm" # with HOME=/, every absolute path starts with $HOME assert_nvm_dir_line '/' "${TEST_HOME}2/nvm" "${TEST_HOME}2/nvm" # $HOME is matched literally, not as a regex assert_nvm_dir_line "${TMPDIR_FOR_TEST}/a.b" "${TMPDIR_FOR_TEST}/axb/.nvm" "${TMPDIR_FOR_TEST}/axb/.nvm" assert_nvm_dir_line "${TMPDIR_FOR_TEST}/c:d" "${TMPDIR_FOR_TEST}/c:d/.nvm" '$HOME/.nvm' # with an empty HOME, no path is inside it assert_nvm_dir_line '' "${TEST_HOME}/.nvm" "${TEST_HOME}/.nvm" cleanup