From c6cedac7eb7c3bdb73e67a6cebb8a4f68f6a4c46 Mon Sep 17 00:00:00 2001 From: Geoff Schmidt Date: Fri, 16 Mar 2012 02:43:20 -0700 Subject: [PATCH] Test database failure reporting --- packages/mongo-livedata/collection.js | 3 +- packages/mongo-livedata/mongo_driver.js | 24 +++++++++++++ .../mongo-livedata/mongo_livedata_tests.js | 34 +++++++++++++++++++ packages/mongo-livedata/package.js | 6 ++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 packages/mongo-livedata/mongo_livedata_tests.js diff --git a/packages/mongo-livedata/collection.js b/packages/mongo-livedata/collection.js index be58303c3d..242be24a0e 100644 --- a/packages/mongo-livedata/collection.js +++ b/packages/mongo-livedata/collection.js @@ -175,9 +175,8 @@ _.each(["insert", "update", "remove"], function (name) { // baffled if their writes don't work because their database is // down. callback = function (err) { - if (err) { + if (err) Meteor._debug(name + " failed: " + err.error + " -- " + err.reason); - } }; if (name === "insert") { diff --git a/packages/mongo-livedata/mongo_driver.js b/packages/mongo-livedata/mongo_driver.js index f38f2fc73e..bceb13178e 100644 --- a/packages/mongo-livedata/mongo_driver.js +++ b/packages/mongo-livedata/mongo_driver.js @@ -93,6 +93,14 @@ _Mongo.prototype._maybeBeginWrite = function () { _Mongo.prototype.insert = function (collection_name, document) { var self = this; + + if (collection_name === "___meteor_failure_test_collection" && + document.fail) { + var e = new Error("Failure test"); + e.expected = true; + throw e; + } + var write = self._maybeBeginWrite(); var finish = Meteor.bindEnvironment(function () { @@ -127,6 +135,14 @@ _Mongo.prototype.insert = function (collection_name, document) { _Mongo.prototype.remove = function (collection_name, selector) { var self = this; + + if (collection_name === "___meteor_failure_test_collection" && + selector.fail) { + var e = new Error("Failure test"); + e.expected = true; + throw e; + } + var write = self._maybeBeginWrite(); var finish = Meteor.bindEnvironment(function () { @@ -164,6 +180,14 @@ _Mongo.prototype.remove = function (collection_name, selector) { _Mongo.prototype.update = function (collection_name, selector, mod, options) { var self = this; + + if (collection_name === "___meteor_failure_test_collection" && + selector.fail) { + var e = new Error("Failure test"); + e.expected = true; + throw e; + } + var write = self._maybeBeginWrite(); var finish = Meteor.bindEnvironment(function () { diff --git a/packages/mongo-livedata/mongo_livedata_tests.js b/packages/mongo-livedata/mongo_livedata_tests.js new file mode 100644 index 0000000000..86aa53dd54 --- /dev/null +++ b/packages/mongo-livedata/mongo_livedata_tests.js @@ -0,0 +1,34 @@ +// This is a magic collection that fails its writes on the server when +// the selector (or inserted document) contains fail: true. + +// XXX namespacing +Meteor._FailureTestCollection = + new Meteor.Collection("___meteor_failure_test_collection"); + +testAsyncMulti("mongo-livedata - database failure reporting", [ + function (test, expect) { + var ftc = Meteor._FailureTestCollection; + + var exception = function (err) { + test.instanceOf(err, Error); + }; + + _.each(["insert", "remove", "update"], function (op) { + if (Meteor.is_server) { + test.throws(function () { + ftc[op]({fail: true}); + }); + + ftc[op]({fail: true}, expect(exception)); + } + + if (Meteor.is_client) { + ftc[op]({fail: true}, expect(exception)); + + // This would log to console in normal operation. + Meteor._suppress_log(1); + ftc[op]({fail: true}); + } + }); + } +]); diff --git a/packages/mongo-livedata/package.js b/packages/mongo-livedata/package.js index 4aee3d30f6..e0a1d5c75d 100644 --- a/packages/mongo-livedata/package.js +++ b/packages/mongo-livedata/package.js @@ -21,3 +21,9 @@ Package.on_use(function (api) { api.add_files('remote_collection_driver.js', 'server'); api.add_files('collection.js', ['client', 'server']); }); + +Package.on_test(function (api) { + api.use('mongo-livedata'); + api.use('tinytest'); + api.add_files('mongo_livedata_tests.js', ['client', 'server']); +}); \ No newline at end of file