mirror of
https://github.com/meteor/meteor.git
synced 2026-05-02 03:01:46 -04:00
105 lines
2.8 KiB
JavaScript
105 lines
2.8 KiB
JavaScript
import { Tinytest } from "./tinytest.js";
|
|
import {
|
|
ServerTestResultsSubscription,
|
|
ServerTestResultsCollection,
|
|
} from "./model.js";
|
|
|
|
const hasOwn = Object.prototype.hasOwnProperty;
|
|
|
|
export { Tinytest };
|
|
|
|
// Like Tinytest._runTests, but runs the tests on both the client and
|
|
// the server. Sets a 'server' flag on test results that came from the
|
|
// server.
|
|
//
|
|
// Options:
|
|
// serial if true, will not run tests in parallel. Currently this means
|
|
// running the server tests before running the client tests.
|
|
// Default is currently true (serial operation), but we will likely
|
|
// change this to false in future.
|
|
Tinytest._runTestsEverywhere = function (onReport, onComplete, pathPrefix, options) {
|
|
var runId = Random.id();
|
|
var localComplete = false;
|
|
var localStarted = false;
|
|
var remoteComplete = false;
|
|
var done = false;
|
|
|
|
options = {
|
|
serial: true,
|
|
...options,
|
|
};
|
|
|
|
var serial = !!options.serial;
|
|
|
|
var maybeDone = function () {
|
|
if (!done && localComplete && remoteComplete) {
|
|
done = true;
|
|
onComplete && onComplete();
|
|
}
|
|
if (serial && remoteComplete && !localStarted) {
|
|
startLocalTests();
|
|
}
|
|
};
|
|
|
|
var startLocalTests = function() {
|
|
localStarted = true;
|
|
Tinytest._runTests(onReport, function () {
|
|
localComplete = true;
|
|
maybeDone();
|
|
}, pathPrefix);
|
|
};
|
|
|
|
var handle;
|
|
|
|
Meteor.connection.registerStoreClient(ServerTestResultsCollection, {
|
|
update(msg) {
|
|
// We only should call _runTestsEverywhere once per client-page-load, so
|
|
// we really only should see one runId here.
|
|
if (msg.id !== runId) {
|
|
return;
|
|
}
|
|
|
|
if (! msg.fields) {
|
|
return;
|
|
}
|
|
|
|
// This will only work for added & changed messages.
|
|
// hope that is all you get.
|
|
Object.keys(msg.fields).forEach(key => {
|
|
// Skip the 'complete' report (deal with it last)
|
|
if (key === 'complete') {
|
|
return;
|
|
}
|
|
const report = msg.fields[key];
|
|
report.events.forEach(event => {
|
|
delete event.cookie; // can't debug a server test on the client..
|
|
});
|
|
report.server = true;
|
|
onReport(report);
|
|
});
|
|
|
|
// Now that we've processed all the other messages,
|
|
// check if we have the 'complete' message
|
|
if (hasOwn.call(msg.fields, 'complete')) {
|
|
remoteComplete = true;
|
|
handle.stop();
|
|
Meteor.call('tinytest/clearResults', runId);
|
|
maybeDone();
|
|
}
|
|
}
|
|
});
|
|
|
|
handle = Meteor.subscribe(ServerTestResultsSubscription, runId);
|
|
|
|
Meteor.call('tinytest/run', runId, pathPrefix, function (error, result) {
|
|
if (error) {
|
|
// XXX better report error
|
|
throw new Error("Test server returned an error");
|
|
}
|
|
});
|
|
|
|
if (!serial) {
|
|
startLocalTests();
|
|
}
|
|
};
|