From f2be1f9e8a58a6209d43a83994b48f1687086100 Mon Sep 17 00:00:00 2001
From: Dan Dascalescu <ddascalescu+github@gmail.com>
Date: Sun, 14 Dec 2014 16:09:53 -0800
Subject: [PATCH] Automate tests for CI

---
 meteor/package.js  |  2 +-
 meteor/publish.sh  | 61 +++++++++++++++-------------------------------
 meteor/runtests.sh | 42 ++++++++++++++++---------------
 package.json       |  3 +++
 4 files changed, 46 insertions(+), 62 deletions(-)

diff --git a/meteor/package.js b/meteor/package.js
index 1ef298670..963f12eb4 100644
--- a/meteor/package.js
+++ b/meteor/package.js
@@ -13,7 +13,7 @@ Package.describe({
 });
 
 Package.onUse(function (api) {
-  api.versionsFrom('METEOR@0.9.2.1');
+  api.versionsFrom(['METEOR@0.9.2.1', 'METEOR@1.0']);
   api.addFiles([
     // we bundle all font files, but the client will request only one of them via the CSS @font-face rule
     'fonts/fontawesome-webfont.eot',  // IE8 or older only understands EOT. IE9+ will read it too because it loads the first occurrence of `src`
diff --git a/meteor/publish.sh b/meteor/publish.sh
index e5fa1d380..56cd665ef 100755
--- a/meteor/publish.sh
+++ b/meteor/publish.sh
@@ -1,61 +1,40 @@
-# Publish package on Meteor's Atmosphere.js
+#!/bin/bash
+# Publish package to Meteor's repository, Atmospherejs.com
 
-# Make sure Meteor is installed, per https://www.meteor.com/install. The curl'ed script is totally safe; takes 2 minutes to read its source and check.
+# Make sure Meteor is installed, per https://www.meteor.com/install.
+# The curl'ed script is totally safe; takes 2 minutes to read its source and check.
 type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; }
 
 # sanity check: make sure we're in the root directory of the checkout
 cd "$( dirname "$0" )/.."
 
-# publish separately any package*.js files we have, e.g. package.js, package-compat.js
+ALL_EXIT_CODE=0
+
+# test any package*.js packages we may have, e.g. package.js, package-compat.js
 for PACKAGE_FILE in meteor/package*.js; do
 
   # Meteor expects package.js to be in the root directory of the checkout, so copy there our package file under that name, temporarily
   cp $PACKAGE_FILE ./package.js
 
   # publish package, creating it if it's the first time we're publishing
-  PACKAGE_NAME=$(grep -i name $PACKAGE_FILE | head -1 | cut -d "'" -f 2)
-  ATMOSPHERE_NAME=${PACKAGE_NAME/://}
+  PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2)
 
   echo "Publishing $PACKAGE_NAME..."
 
-  # attempt to re-publish the package - the most common operation once the initial release has been made
-  POTENTIAL_ERROR=$( meteor publish 2>&1 )
-
-  if [[ $POTENTIAL_ERROR =~ "There is no package named" ]]; then
-    # actually this is the first time the package is created, so pass the special --create flag and congratulate the maintainer
-    echo "Thank you for creating the official Meteor package for this library!"
-    if meteor publish --create; then
-      echo "Please post the following to https://github.com/raix/Meteor-community-discussions/issues/14:
-
---------------------------------------------- 8< --------------------------------------------------------
-
-Happy to announce that I've published the official $PACKAGE_NAME to Atmosphere. Please star!
-https://atmospherejs.com/$ATMOSPHERE_NAME
-
---------------------------------------------- >8 --------------------------------------------------------
-
-"
-    else
-      echo "We got an error. Please post it at https://github.com/raix/Meteor-community-discussions/issues/14"
-    fi
+  # Attempt to re-publish the package - the most common operation once the initial release has
+  # been made. If the package name was changed (rare), you'll have to pass the --create flag.
+  meteor publish "$@"; EXIT_CODE=$?
+  ALL_EXIT_CODE=$(( $ALL_EXIT_CODE + $EXIT_CODE ))
+  if (( $EXIT_CODE == 0 )); then
+    echo "Thanks for releasing a new version. You can see it at"
+    echo "https://atmospherejs.com/${PACKAGE_NAME/://}"
   else
-    if (( $? > 0 )); then
-      # the error wasn't that the package didn't exist, so we need to ask for help
-      echo "We got an error. Please post it at https://github.com/raix/Meteor-community-discussions/issues/14:
---------------------------------------------- 8< --------------------------------------------------------
-$POTENTIAL_ERROR
---------------------------------------------- >8 --------------------------------------------------------
-"
-    else
-      echo "Thanks for releasing a new version of $PACKAGE_NAME! You can see it at
-https://atmospherejs.com/$ATMOSPHERE_NAME"
-    fi
+    echo "We got an error. Please post it at https://github.com/raix/Meteor-community-discussions/issues/14"
   fi
 
-  # we copied the file as package.js, regardless of its original name
-  rm package.js
-
-  # temporary build files
-  rm -rf ".build.$PACKAGE_NAME"
+  # rm the temporary build files and package.js
+  rm -rf ".build.$PACKAGE_NAME" versions.json package.js
 
 done
+
+exit $ALL_EXIT_CODE
diff --git a/meteor/runtests.sh b/meteor/runtests.sh
index 8ad84041a..dec7b3b5a 100755
--- a/meteor/runtests.sh
+++ b/meteor/runtests.sh
@@ -1,36 +1,38 @@
+#!/bin/sh
 # Test Meteor package before publishing to Atmospherejs.com
 
-# Make sure Meteor is installed, per https://www.meteor.com/install. The curl'ed script is totally safe; takes 2 minutes to read its source and check.
+# Make sure Meteor is installed, per https://www.meteor.com/install.
+# The curl'ed script is totally safe; takes 2 minutes to read its source and check.
 type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; }
 
 # sanity check: make sure we're in the root directory of the checkout
 cd "$( dirname "$0" )/.."
 
-# run tests and delete the temporary package.js even if Ctrl+C is pressed
-int_trap() {
-  echo
-  printf "Tests interrupted. Hopefully you verified in the browser that tests pass?\n\n"
-}
+ALL_EXIT_CODE=0
 
-trap int_trap INT
-
-# test any package*.js packages we may have, e.g. package.js, package-compat.js
+# test any package*.js packages we may have, e.g. package.js, package-standalone.js
 for PACKAGE_FILE in meteor/package*.js; do
 
-  PACKAGE_NAME=$(grep -i name $PACKAGE_FILE | head -1 | cut -d "'" -f 2)
-
-  echo "Testing $PACKAGE_NAME..."
-
-  # Meteor expects package.js to be in the root directory of the checkout, so copy there our package file under that name, temporarily
+  # Meteor expects package.js in the root dir of the checkout, so copy there our package file under that name, temporarily
   cp $PACKAGE_FILE ./package.js
 
+  PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2)
+
+  echo "### Testing $PACKAGE_NAME..."
+
   # provide an invalid MONGO_URL so Meteor doesn't bog us down with an empty Mongo database
-  MONGO_URL=mongodb:// meteor test-packages ./
+  if [ $# -gt 0 ]; then
+    # interpret any parameter to mean we want an interactive test
+    MONGO_URL=mongodb:// meteor test-packages ./
+  else
+    # automated/CI test with phantomjs
+    spacejam --mongo-url mongodb:// test-packages ./
+    ALL_EXIT_CODES=$(( $ALL_EXIT_CODES + $? ))
+  fi
 
-  rm -rf ".build.$PACKAGE_NAME"
-  rm -rf ".build.local-test:$PACKAGE_NAME"
-  rm versions.json 2>/dev/null
-
-  rm package.js
+  # delete temporary build files and package.js
+  rm -rf .build.* versions.json package.js
 
 done
+
+exit $ALL_EXIT_CODES
diff --git a/package.json b/package.json
index e7c82330b..f7f2e57b6 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,9 @@
   ],
   "dependencies": {
   },
+  "devDependencies": {
+    "spacejam": "^1.1.1"
+  },
   "engines" : {
     "node" : ">=0.10.3"
   }