'meteor test-packages' improvements:

- Allow testing a package directory in isolation
- Allow specifying a release version to use while running
  tests
This commit is contained in:
Avital Oliver
2013-02-14 14:03:51 -08:00
committed by David Glasser
parent 28af50e403
commit 55bfce0de2
4 changed files with 61 additions and 19 deletions

View File

@@ -397,9 +397,10 @@ _.extend(Bundle.prototype, {
pkg.on_use_handler(inst.api, where);
},
includeTests: function (packageName) {
includeTests: function (packageOrPackageName) {
var self = this;
var pkg = packages.get(self.releaseManifest, packageName);
// 'packages.get' is a noop if 'packageOrPackageName' is a Package object.
var pkg = packages.get(self.releaseManifest, packageOrPackageName);
if (self.tests_included[pkg.id])
return;
self.tests_included[pkg.id] = true;
@@ -766,8 +767,8 @@ _.extend(Bundle.prototype, {
* 'symlink' : symlink from a prebuild local installation. used
* by `meteor run`
*
* - testPackages : array of package names whose tests should be included
* in this bundle
* - testPackages : array of package objects or package names whose
* tests should be included in this bundle
*
* - versionOverride : (for tests) a meteor release version to use
* instead of reading from .meteor/version
@@ -793,8 +794,8 @@ exports.bundle = function (app_dir, output_path, options) {
// Include tests if requested
if (options.testPackages) {
_.each(options.testPackages, function(packageName) {
bundle.includeTests(packageName);
_.each(options.testPackages, function(packageOrPackageName) {
bundle.includeTests(packageOrPackageName);
});
}

View File

@@ -153,13 +153,21 @@ Fiber(function () {
var opt = require('optimist')
.alias('port', 'p').default('port', 3000)
.describe('port', 'Port to listen on. NOTE: Also uses port N+1 and N+2.')
.describe('release', 'Meteor release version to test.')
.describe('deploy', 'Optionally, specify a domain to deploy to instead of running locally.')
.describe('deploy', 'Optionally, specify a domain to deploy to, rather than running locally.')
.boolean('once') // See #Once
.usage(
"Usage: meteor test-packages [options] [comma delimited packages]\n" +
"Usage: \n" +
"\n" +
"Run unit tests for packages. Point your browser to localhost:3000 to see results.");
"meteor test-packages [--release=x.y.z] --package-dir=<path to local package> [options]\n" +
" Runs unit tests on one package located on disk.\n" +
"\n" +
"meteor test-packages [--release=x.y.z] [comma delimited package names] [options]\n" +
" Runs unit tests for a set of packages.\n" +
"\n" +
"You must either pass the --release option, or be in a git checkout of Meteor,\n" +
"in which cases local packages are loaded.\n" +
"\n" +
"Point your browser to localhost:3000 to run tests and see results.\n");
var new_argv = opt.argv;
@@ -172,14 +180,26 @@ Fiber(function () {
var releaseVersion = new_argv['release'];
var testPackages;
if (new_argv._[1]) {
testPackages = new_argv._[1].split(',');
if (new_argv["package-dir"]) {
var packageDir = path.resolve(new_argv["package-dir"], "."); // strips trailing path.sep
// was important to strip trailing path.sep, otherwise we'd get a package named "foo/"
var packageName = path.basename(packageDir);
testPackages = [packages.loadFromDir(packageName, packageDir)];
} else {
if (releaseVersion) {
var releaseManifest = warehouse.releaseManifestByVersion(releaseVersion);
testPackages = _.keys(packages.list(releaseManifest));
if (new_argv._[1]) {
testPackages = new_argv._[1].split(',');
} else {
testPackages = _.keys(packages.list());
if (releaseVersion) {
var releaseManifest = warehouse.releaseManifestByVersion(releaseVersion);
testPackages = _.keys(packages.list(releaseManifest));
} else {
if (files.in_checkout()) {
testPackages = _.keys(packages.list());
} else {
process.stdout.write("Please specify a release version.");
process.exit(1);
}
}
}
}

View File

@@ -142,10 +142,30 @@ sleep 2 # need to make sure these kills take effect
echo "... test-packages"
if [ ! "$TEST_INSTALLED_METEOR" ]; then
$METEOR test-packages -p $PORT >> $OUTPUT 2>&1 &
mkdir -p "$TMPDIR/local-packages/die-now/"
cat > "$TMPDIR/local-packages/die-now/package.js" <<EOF
Package.on_test(function (api) {
api.use('deps'); // try to use a core package
console.log("Dying");
process.exit(0);
});
EOF
if [ "$TEST_INSTALLED_METEOR" ]; then
$METEOR test-packages --release=0.0.1 -p $PORT --package-dir="$TMPDIR/local-packages/die-now/" | grep Dying >> $OUTPUT 2>&1
else
$METEOR test-packages -p $PORT --package-dir="$TMPDIR/local-packages/die-now/" | grep Dying >> $OUTPUT 2>&1
fi
# since the server process was killed via 'process.exit', mongo is still running.
ps ax | grep -e "$MONGOMARK" | grep -v grep | awk '{print $1}' | xargs kill || true
sleep 2 # make sure mongo is dead
if [ "$TEST_INSTALLED_METEOR" ]; then
( ! $METEOR test-packages -p $PORT ) | grep "Please specify a release version" >> $OUTPUT 2>&1
$METEOR test-packages --release=0.0.1 -p $PORT >> $OUTPUT 2>&1 &
else
$METEOR test-packages -p $PORT >> $OUTPUT 2>&1 &
fi
METEOR_PID=$!

View File

@@ -21,7 +21,8 @@ TARGET_DIR=$ENGINE_DIR admin/build-engine-tree.sh
export TEST_INSTALLED_METEOR=1 # to use the --release option on `meteor test-packages`
export TEST_WAREHOUSE_DIR=$(make_temp_dir meteor-installed-cli-tests-warehouse) # run with empty warehouse
METEOR_DIR=$ENGINE_DIR/bin ./cli-test.sh
unset TEST_INSTALLED_METEOR
unset TEST_WAREHOUSE_DIR
## Run bundler unit tests
./bundler-test.sh