#!/usr/bin/env bash
# See CONTRIBUTING.md for info on running these tests.

testDetectWithPackageJson() {
  detect "stable-node"
  assertCaptured "Node.js"
  assertCapturedSuccess
}

testDetectWithoutPackageJson() {
  detect "no-package-json"
  assertCapturedError 1 ""
}

testNoVersion() {
  compile "no-version"
  assertCaptured "PRO TIP: Specify a node version in package.json"
  assertCaptured "Defaulting to latest stable node"
  assertCapturedSuccess
}

testDangerousRangeStar() {
  compile "dangerous-range-star"
  assertCaptured "PRO TIP: Avoid using semver ranges like '*'"
  assertCaptured "Requested node range:  *"
  assertCaptured "Resolved node version: 0.10"
  assertCapturedSuccess
}

testDangerousRangeGreaterThan() {
  compile "dangerous-range-greater-than"
  assertCaptured "PRO TIP: Avoid using semver ranges starting with '>'"
  assertCaptured "Requested node range:  >"
  assertCaptured "Resolved node version: 0.10."
  assertCapturedSuccess
}

testStableVersion() {
  compile "stable-node"
  assertNotCaptured "PRO TIP"
  assertCaptured "Resolved node version"
  assertCapturedSuccess
}

testUnstableVersion() {
  compile "unstable-version"
  assertCaptured "Requested node range:  >0.11.0"
  assertCaptured "Resolved node version: 0.11."
  assertCapturedSuccess
}

# testInvalidVersion() {
#   compile "invalid-node-version"
#   assertCapturedError 1 "not found among available versions"
# }

# testInvalidVersion() {
#   compile "invalid-dependency"
#   assertCapturedError 1 "not in the npm registry"
# }

testProfileCreated() {
  compile "stable-node"
  assertCaptured "Building runtime environment"
  assertFile "export PATH=\"\$HOME/vendor/node/bin:\$HOME/bin:\$HOME/node_modules/.bin:\$PATH\"" ".profile.d/nodejs.sh"
  assertCapturedSuccess
}

testNodeModulesCached() {
  cache=$(mktmpdir)
  compile "caching" $cache
  assertCaptured "Caching node"
  assertEquals "1" "$(ls -1 $cache/ | wc -l)"
}

# Pending

# testNodeBinariesAddedToPath() {
# }

# testNodeModulesRestoredFromCache() {
# }

## utils ########################################

pushd $(dirname 0) >/dev/null
BASE=$(pwd)
popd >/dev/null

source ${BASE}/vendor/test-utils/test-utils

mktmpdir() {
  dir=$(mktemp -t testXXXXX)
  rm -rf $dir
  mkdir $dir
  echo $dir
}

detect() {
  capture ${BASE}/bin/detect ${BASE}/test/$1
}

COMPILE_DIR=""

compile() {
  COMPILE_DIR=$(mktmpdir)
  cp -r ${BASE}/test/$1/* ${COMPILE_DIR}/
  capture ${BASE}/bin/compile ${COMPILE_DIR} ${2:-$(mktmpdir)}
}

assertFile() {
  assertEquals "$1" "$(cat ${COMPILE_DIR}/$2)"
}

source ${BASE}/vendor/shunit2/shunit2
