#!/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