Tests for `nvm_get_latest`
diff --git a/test/fast/Unit tests/nvm_get_latest missing curl or wget b/test/fast/Unit tests/nvm_get_latest missing curl or wget
new file mode 100755
index 0000000..1ad960a
--- /dev/null
+++ b/test/fast/Unit tests/nvm_get_latest missing curl or wget
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+die () { echo $@ ; cleanup ; exit 1; }
+
+cleanup() {
+  unset -f nvm_has
+}
+
+. ../../../nvm.sh
+
+nvm_has() { return 1 ; }
+
+OUTPUT="$(nvm_get_latest 2>&1)"
+EXIT_CODE="$(nvm_get_latest >/dev/null 2>&1 ; echo $?)"
+[ "_$OUTPUT" = "_nvm needs curl or wget to proceed." ] \
+  || die "no curl/wget did not report correct error message, got '$OUTPUT'"
+[ "_$EXIT_CODE" = "_1" ] \
+  || die "no curl/wget did not exit with code 1, got $EXIT_CODE"
+
+cleanup
diff --git a/test/installation/nvm_get_latest/nvm_get_latest b/test/installation/nvm_get_latest/nvm_get_latest
new file mode 100755
index 0000000..60d63ca
--- /dev/null
+++ b/test/installation/nvm_get_latest/nvm_get_latest
@@ -0,0 +1,117 @@
+#!/bin/sh
+
+die () { echo $@ ; cleanup ; exit 1; }
+
+cleanup() {
+  unset -f curl wget nvm_has
+}
+
+. ../../../nvm.sh
+
+EXPECTED_VERSION="v12.3.456"
+URL="https://github.com/creationix/nvm/releases/tag/$EXPECTED_VERSION"
+EXPECTED_CURL_ARGS="-w %{url_effective}\n -L -s -S http://latest.nvm.sh -o /dev/null"
+EXPECTED_WGET_ARGS="http://latest.nvm.sh --server-response -O /dev/null"
+
+curl() {
+  if [ "_$*" != "_$EXPECTED_CURL_ARGS" ]; then
+    echo 2>& "expected args ($EXPECTED_CURL_ARGS), got ($*)"
+    return 1
+  else
+    echo $URL
+  fi
+}
+wget() {
+  if [ "_$*" != "_$EXPECTED_WGET_ARGS" ]; then
+    echo 2>& "expected args ($EXPECTED_WGET_ARGS), got ($*)"
+    return 1
+  else
+    local WGET_CONTENTS
+    WGET_CONTENTS="
+--2014-12-21 18:11:14--  http://latest.nvm.sh/
+Resolving latest.nvm.sh... 50.31.209.229
+Connecting to latest.nvm.sh|50.31.209.229|:80... connected.
+HTTP request sent, awaiting response... 
+  HTTP/1.1 301 Moved Permanently
+  Location: https://github.com/creationix/nvm/releases/latest
+  Content-Type: text/html; charset=utf-8
+  Content-Length: 84
+  Date: Mon, 22 Dec 2014 02:11:15 GMT
+Location: https://github.com/creationix/nvm/releases/latest [following]
+--2014-12-21 18:11:15--  https://github.com/creationix/nvm/releases/latest
+Resolving github.com... 192.30.252.130
+Connecting to github.com|192.30.252.130|:443... connected.
+HTTP request sent, awaiting response... 
+  HTTP/1.1 302 Found
+  Server: GitHub.com
+  Date: Mon, 22 Dec 2014 02:11:15 GMT
+  Content-Type: text/html; charset=utf-8
+  Transfer-Encoding: chunked
+  Status: 302 Found
+  X-XSS-Protection: 1; mode=block
+  X-Frame-Options: deny
+  Content-Security-Policy: default-src *; script-src assets-cdn.github.com collector-cdn.github.com; object-src assets-cdn.github.com; style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github.com; img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com collector.githubapp.com *.githubusercontent.com *.gravatar.com *.wp.com; media-src 'none'; frame-src 'self' render.githubusercontent.com gist.github.com www.youtube.com player.vimeo.com checkout.paypal.com; font-src assets-cdn.github.com; connect-src 'self' ghconduit.com:25035 live.github.com uploads.github.com www.google-analytics.com s3.amazonaws.com
+  Cache-Control: no-cache
+  Vary: X-PJAX
+  Location: $URL
+  X-UA-Compatible: IE=Edge,chrome=1
+  Set-Cookie: logged_in=no; domain=.github.com; path=/; expires=Fri, 22-Dec-2034 02:11:15 GMT; secure; HttpOnly
+  Set-Cookie: _gh_sess=eyJzZXNzaW9uX2lkIjoiNTMzNGNjZWUxM2VhZjNhN2M3MzIwZWUxNGYwNzhmNDkiLCJzcHlfcmVwbyI6ImNyZWF0aW9uaXgvbnZtIiwic3B5X3JlcG9fYXQiOjE0MTkyMTQyNzV9--e2fa4cf5305d61aa58c0e0bf21fdb335a9660dcf; path=/; secure; HttpOnly
+  X-Request-Id: 4b99bf200157dd845f76ab83e4093acc
+  X-Runtime: 0.030872
+  X-Rack-Cache: miss
+  X-GitHub-Request-Id: 45B56780:3913:880EF6:54977DC3
+  Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+  X-Content-Type-Options: nosniff
+  Vary: Accept-Encoding
+  X-Served-By: ef97014f01ea59c1ef337fe51a4d0331
+Location: $URL [following]
+--2014-12-21 18:11:15--  $URL
+Reusing existing connection to github.com:443.
+HTTP request sent, awaiting response... 
+  HTTP/1.1 200 OK
+  Server: GitHub.com
+  Date: Mon, 22 Dec 2014 02:11:15 GMT
+  Content-Type: text/html; charset=utf-8
+  Transfer-Encoding: chunked
+  Status: 200 OK
+  X-XSS-Protection: 1; mode=block
+  X-Frame-Options: deny
+  Content-Security-Policy: default-src *; script-src assets-cdn.github.com collector-cdn.github.com; object-src assets-cdn.github.com; style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github.com; img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com collector.githubapp.com *.githubusercontent.com *.gravatar.com *.wp.com; media-src 'none'; frame-src 'self' render.githubusercontent.com gist.github.com www.youtube.com player.vimeo.com checkout.paypal.com; font-src assets-cdn.github.com; connect-src 'self' ghconduit.com:25035 live.github.com uploads.github.com www.google-analytics.com s3.amazonaws.com
+  Cache-Control: no-cache, private
+  Vary: X-PJAX
+  X-UA-Compatible: IE=Edge,chrome=1
+  Set-Cookie: _gh_sess=eyJzZXNzaW9uX2lkIjoiNTMzNGNjZWUxM2VhZjNhN2M3MzIwZWUxNGYwNzhmNDkiLCJzcHlfcmVwbyI6ImNyZWF0aW9uaXgvbnZtIiwic3B5X3JlcG9fYXQiOjE0MTkyMTQyNzUsIl9jc3JmX3Rva2VuIjoiemZTVDNIRGo0QzF0dzkyNXp6NFBRdGJVbTl4NSsxTGo1cngwVFQ3NDVwdz0ifQ%3D%3D--b72bfd5241907dcf557b226e74351ff39f0e9ede; path=/; secure; HttpOnly
+  X-Request-Id: 305b0d158bf8c0b3fa488a33d7687091
+  X-Runtime: 0.038544
+  X-Rack-Cache: miss
+  X-GitHub-Request-Id: 45B56780:3913:880F19:54977DC3
+  Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+  X-Content-Type-Options: nosniff
+  Vary: Accept-Encoding
+  X-Served-By: 926b734ea1992f8ee1f88ab967a93dac
+Length: unspecified [text/html]
+Saving to: ‘/dev/null’
+
+     0K .......... .........                                    225K=0.09s
+
+2014-12-21 18:11:15 (225 KB/s) - ‘/dev/null’ saved [20298]
+
+"
+    "$WGET_CONTENTS" | while read line
+    do
+      2>& echo "$line"
+    done
+  fi
+}
+
+OUTPUT="$(nvm_get_latest)"
+EXIT_CODE="$(nvm_get_latest >/dev/null 2>&1 ; echo $?)"
+[ "_$OUTPUT" = "_$EXPECTED_VERSION" ] \
+  || die "success path did not return version '$EXPECTED_VERSION', got '$OUTPUT'"
+[ "_$EXIT_CODE" = "_0" ] \
+  || die "success path did not exit with code 0, got $EXIT_CODE"
+
+
+cleanup
+
diff --git a/test/installation/nvm_get_latest/nvm_get_latest failed redirect b/test/installation/nvm_get_latest/nvm_get_latest failed redirect
new file mode 100755
index 0000000..cc43b53
--- /dev/null
+++ b/test/installation/nvm_get_latest/nvm_get_latest failed redirect
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+die () { echo $@ ; cleanup ; exit 1; }
+
+cleanup() {
+  unset -f curl wget
+}
+
+. ../../../nvm.sh
+
+curl() {
+  return 1
+}
+wget() {
+  return 1
+}
+
+OUTPUT="$(nvm_get_latest 2>&1)"
+EXIT_CODE="$(nvm_get_latest >/dev/null 2>&1 ; echo $?)"
+[ "_$OUTPUT" = "_http://latest.nvm.sh did not redirect to the latest release on Github" ] \
+  || die "failed redirect did not report correct error message, got '$OUTPUT'"
+[ "_$EXIT_CODE" = "_2" ] \
+  || die "failed redirect did not exit with code 2, got $EXIT_CODE"
+
+cleanup
+