#!/bin/bash

# the "npm" command is set to a custom function here so that we can
# test the code in this repo, rather than whichever version of npm
# happens to be installed.

main () {
  # setup
  FAILURES=0

  cd "$TESTDIR"

  # install
  npm install "$NPMPKG" || exit 1

  # used in test later
  npm config set package-config:foo boo || exit 1

  npm install $( ls packages | awk '{print "packages/" $1 }' ) || exit 1
  (ls packages | while read pkg; do
    npm test "$pkg"
  done) || exit 1
  if [ "$FAILURES" == "0" ]; then
    npm rm $(ls packages) npm || exit 1
  fi
  cleanup

  if ! [ "$npm_package_config_publishtest" == "true" ]; then
    echo_err "To test publishing: npm config set npm:publishtest true"
  else
    # attempt to publish and unpublish each of them.
    npm install "$NPMPKG" || exit 1

    (ls packages | grep -v 'npm-test-private' | while read pkg; do
      npm publish packages/$pkg || exit 1
      npm install $pkg || exit 1
      npm unpublish $pkg || exit 1
    done) || exit 1

    # verify that the private package can't be published
    # bypass the test-harness npm function.
    "$NPMCLI" publish packages/npm-test-private && (
      npm unpublish npm-test-private
      exit 1000
    )
    if [ $? -eq 1000 ]; then
      fail "Private package shouldn't be publishable" >&2
    fi

    if [ "$FAILURES" == "0" ]; then
      npm rm $(ls packages) npm || exit 1
    fi
    cleanup

  fi

  if [ $FAILURES -eq 0 ]; then
    echo_err "ok"
    rm -rf $TMP
  else
    echo_err "FAILED: $FAILURES"
  fi
  exit $FAILURES
}



####################
# Test Harness below

# fake functions
npm () {
  echo -e "npm $@"
  "$NPMCLI" "$@" \
    || fail npm "$@"
}

# get the absolute path of the executable
SELF_PATH="$0"
if [ "${SELF_PATH:0:1}" != "." ] && [ "${SELF_PATH:0:1}" != "/" ]; then
  SELF_PATH=./"$SELF_PATH"
fi
SELF_PATH=$( cd -P -- "$(dirname -- "$SELF_PATH")" \
          && pwd -P \
          ) && SELF_PATH=$SELF_PATH/$(basename -- "$0")
# resolve symlinks
while [ -h "$SELF_PATH" ]; do
  DIR=$(dirname -- "$SELF_PATH")
  SYM=$(readlink -- "$SELF_PATH")
  SELF_PATH=$( cd -- "$DIR" \
            && cd -- $(dirname -- "$SYM") \
            && pwd \
            )/$(basename -- "$SYM")
done
NPMPKG="$(dirname -- "$(dirname -- "$SELF_PATH")")"
NPMCLI="$NPMPKG/cli.js"
TESTDIR="$NPMPKG/test/"
TMP=${TMPDIR:-/tmp}
rm -rf $TMP/npm*
TMP=$TMP/npm-test-$$
echo "Testing in $TMP ..."
ROOTDIR="$TMP/root"

cleanup () {
  if [ "$FAILURES" != "0" ] && [ "$FAILURES" != "" ]; then
    return
  fi
  [ -d "$ROOTDIR" ] && rm -rf -- "$ROOTDIR"
  mkdir -p -- "$ROOTDIR"
}

export npm_config_prefix="$ROOTDIR"
export npm_config_color="always"
export npm_config_global=true
# have to set this to false, or it'll try to test itself forever
export npm_config_npat=false
export PATH="$PATH":"$ROOTDIR/bin":"$ROOTDIR/node_modules/.bin"
export NODE_PATH="$ROOTDIR/node_modules"

echo_err () {
  echo "$@" >&2
}
fail () {
  let 'FAILURES += 1'
  echo_err ""
  echo_err -e "\033[33mFailure: $@\033[m"
  exit 1
}

cleanup
main
