Files
meteor/packages/tinytest/tinytest_server.js
Justin SB 2ac9da43f9 tinytest/run now returns immediatedly; sends a 'complete' record when finished
Otherwise the DDP call to tinytest/run was blocking client test execution,
in particular Accounts DDP calls won't run concurrently with another DDP call,
even if the first DDP call calls unblock.
2014-07-14 13:44:41 -07:00

73 lines
2.1 KiB
JavaScript

var Fiber = Npm.require('fibers');
var handlesForRun = {};
var reportsForRun = {};
Meteor.publish(Meteor._ServerTestResultsSubscription, function (runId) {
check(runId, String);
var self = this;
if (!_.has(handlesForRun, runId))
handlesForRun[runId] = [self];
else
handlesForRun[runId].push(self);
self.onStop(function () {
handlesForRun[runId] = _.without(handlesForRun[runId], self);
});
if (_.has(reportsForRun, runId)) {
self.added(Meteor._ServerTestResultsCollection, runId,
reportsForRun[runId]);
} else {
self.added(Meteor._ServerTestResultsCollection, runId, {});
}
self.ready();
});
Meteor.methods({
'tinytest/run': function (runId, pathPrefix) {
check(runId, String);
check(pathPrefix, Match.Optional([String]));
this.unblock();
reportsForRun[runId] = {};
var addReport = function (key, report) {
var fields = {};
fields[key] = report;
_.each(handlesForRun[runId], function (handle) {
handle.changed(Meteor._ServerTestResultsCollection, runId, fields);
});
// Save for future subscriptions.
reportsForRun[runId][key] = report;
};
var onReport = function (report) {
if (! Fiber.current) {
Meteor._debug("Trying to report a test not in a fiber! "+
"You probably forgot to wrap a callback in bindEnvironment.");
console.trace();
}
var dummyKey = Random.id();
addReport(dummyKey, report);
};
var onComplete = function() {
// We send an object for current and future compatibility,
// though we could get away with just sending { complete: true }
var report = { done: true };
var key = 'complete';
addReport(key, report);
};
Tinytest._runTests(onReport, onComplete, pathPrefix);
},
'tinytest/clearResults': function (runId) {
check(runId, String);
_.each(handlesForRun[runId], function (handle) {
// XXX this doesn't actually notify the client that it has been
// unsubscribed.
handle.stop();
});
delete handlesForRun[runId];
delete reportsForRun[runId];
}
});