Skip to content

Commit

Permalink
Merge pull request #84 from avital/use-mingo
Browse files Browse the repository at this point in the history
Use sharedb-mingo-memory instead of custom MemoryDB in tests
  • Loading branch information
avital committed Jun 3, 2016
2 parents 405f0ac + 1ea767d commit 4bf6fa6
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 97 deletions.
14 changes: 8 additions & 6 deletions lib/db/memory.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,21 +95,23 @@ MemoryDB.prototype.query = function(collection, query, fields, options, callback
snapshots.push(snapshot);
}
try {
var filtered = db._querySync(snapshots, query, options);
callback(null, filtered);
var result = db._querySync(snapshots, query, options);
callback(null, result.snapshots, result.extra);
} catch (err) {
callback(err);
}
});
};

// For testing, it may be useful to implement the desired query language by
// defining this function
// For testing, it may be useful to implement the desired query
// language by defining this function. Returns an object with
// two properties:
// - snapshots: array of query result snapshots
// - extra: (optional) other types of results, such as counts
MemoryDB.prototype._querySync = function(snapshots, query, options) {
return snapshots;
return {snapshots: snapshots};
};


MemoryDB.prototype._writeOpSync = function(collection, id, op) {
var opLog = this._getOpLogSync(collection, id);
// This will write an op in the log at its version, which should always be
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
"coveralls": "^2.11.8",
"expect.js": "^0.3.1",
"istanbul": "^0.4.2",
"mocha": "^2.3.3"
"mocha": "^2.3.3",
"sharedb-mingo-memory": "^0.1.14"
},
"scripts": {
"test": "node_modules/.bin/mocha",
Expand Down
71 changes: 47 additions & 24 deletions test/client/query-subscribe.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@ var expect = require('expect.js');
var async = require('async');
var util = require('../util');

module.exports = function() {
module.exports = function(options) {
var getQuery = options.getQuery;

describe('client query subscribe', function() {
before(function() {
if (!getQuery) return this.skip();
this.matchAllDbQuery = getQuery({query: {}});
});

it('creating a document updates a subscribed query', function(done) {
var connection = this.backend.connect();
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', this.matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.get('dogs', 'fido').create({age: 3});
});
Expand All @@ -23,12 +29,13 @@ describe('client query subscribe', function() {

it('creating an additional document updates a subscribed query', function(done) {
var connection = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.get('dogs', 'taco').create({age: 2});
});
Expand All @@ -46,12 +53,13 @@ describe('client query subscribe', function() {

it('deleting a document updates a subscribed query', function(done) {
var connection = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.get('dogs', 'fido').del();
});
Expand All @@ -70,12 +78,13 @@ describe('client query subscribe', function() {
it('subscribed query does not get updated after destroyed', function(done) {
var connection = this.backend.connect();
var connection2 = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', matchAllDbQuery, null, function(err) {
if (err) return done(err);
query.destroy(function(err) {
if (err) return done(err);
Expand All @@ -91,12 +100,13 @@ describe('client query subscribe', function() {
it('subscribed query does not get updated after connection is disconnected', function(done) {
var connection = this.backend.connect();
var connection2 = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.close();
connection2.get('dogs', 'taco').create({age: 2}, done);
Expand All @@ -111,12 +121,13 @@ describe('client query subscribe', function() {
var backend = this.backend;
var connection = backend.connect();
var connection2 = backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.close();
connection2.get('dogs', 'taco').create({age: 2});
Expand All @@ -134,12 +145,13 @@ describe('client query subscribe', function() {
var backend = this.backend;
var connection = backend.connect();
var connection2 = backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.close();
connection2.get('dogs', 'fido').fetch(function(err) {
Expand Down Expand Up @@ -174,12 +186,13 @@ describe('client query subscribe', function() {

it('creating an additional document updates a subscribed query', function(done) {
var connection = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.get('dogs', 'taco').create({age: 2});
});
Expand All @@ -200,7 +213,7 @@ describe('client query subscribe', function() {
this.backend.db.canPollDoc = function() {
return false;
};
var query = connection.createSubscribeQuery('items', {}, {pollDebounce: 1000});
var query = connection.createSubscribeQuery('items', this.matchAllDbQuery, {pollDebounce: 1000});
var batchSizes = [];
var total = 0;

Expand Down Expand Up @@ -232,7 +245,7 @@ describe('client query subscribe', function() {
return false;
};
this.backend.db.pollDebounce = 1000;
var query = connection.createSubscribeQuery('items', {});
var query = connection.createSubscribeQuery('items', this.matchAllDbQuery);
var batchSizes = [];
var total = 0;

Expand Down Expand Up @@ -261,7 +274,7 @@ describe('client query subscribe', function() {
it('pollInterval updates a subscribed query after an unpublished create', function(done) {
var connection = this.backend.connect();
this.backend.suppressPublish = true;
var query = connection.createSubscribeQuery('dogs', {}, {pollInterval: 50}, function(err) {
var query = connection.createSubscribeQuery('dogs', this.matchAllDbQuery, {pollInterval: 50}, function(err) {
if (err) return done(err);
connection.get('dogs', 'fido').create({});
});
Expand All @@ -275,7 +288,7 @@ describe('client query subscribe', function() {
var connection = this.backend.connect();
this.backend.suppressPublish = true;
this.backend.db.pollInterval = 50;
var query = connection.createSubscribeQuery('dogs', {}, null, function(err) {
var query = connection.createSubscribeQuery('dogs', this.matchAllDbQuery, null, function(err) {
if (err) return done(err);
connection.get('dogs', 'fido').create({});
});
Expand All @@ -289,7 +302,7 @@ describe('client query subscribe', function() {
var connection = this.backend.connect();
this.backend.suppressPublish = true;
var count = 0;
var query = connection.createSubscribeQuery('dogs', {}, {pollInterval: 50}, function(err) {
var query = connection.createSubscribeQuery('dogs', this.matchAllDbQuery, {pollInterval: 50}, function(err) {
if (err) return done(err);
connection.get('dogs', count.toString()).create({});
});
Expand All @@ -307,7 +320,7 @@ describe('client query subscribe', function() {
callback(null, [], {colors: ['brown', 'gold']});
});
};
var query = connection.createSubscribeQuery('dogs', {}, null, function(err, results, extra) {
var query = connection.createSubscribeQuery('dogs', this.matchAllDbQuery, null, function(err, results, extra) {
if (err) return done(err);
expect(results).eql([]);
expect(extra).eql({colors: ['brown', 'gold']});
Expand All @@ -331,7 +344,7 @@ describe('client query subscribe', function() {
this.backend.db.canPollDoc = function() {
return false;
};
var query = connection.createSubscribeQuery('dogs', {}, null, function(err, results, extra) {
var query = connection.createSubscribeQuery('dogs', this.matchAllDbQuery, null, function(err, results, extra) {
if (err) return done(err);
expect(extra).eql(1);
expect(query.extra).eql(1);
Expand All @@ -351,7 +364,8 @@ describe('client query subscribe', function() {
function(cb) { connection.get('dogs', 'spot').create({age: 3}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {age: 3}, null, function(err, results) {
var dbQuery = getQuery({query: {age: 3}});
var query = connection.createSubscribeQuery('dogs', dbQuery, null, function(err, results) {
if (err) return done(err);
var sorted = util.sortById(results);
expect(util.pluck(sorted, 'id')).eql(['fido', 'spot']);
Expand All @@ -377,7 +391,8 @@ describe('client query subscribe', function() {
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {age: 3}, null, function(err, results) {
var dbQuery = getQuery({query: {age: 3}});
var query = connection.createSubscribeQuery('dogs', dbQuery, null, function(err, results) {
if (err) return done(err);
var sorted = util.sortById(results);
expect(util.pluck(sorted, 'id')).eql(['fido']);
Expand All @@ -398,17 +413,25 @@ describe('client query subscribe', function() {

it('changing a sorted property moves in a subscribed query', function(done) {
var connection = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;

async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); }
], function(err) {
if (err) return done(err);
var query = connection.createSubscribeQuery('dogs', {$orderby: {age: 1}}, null, function(err, results) {
if (err) return done(err);
expect(util.pluck(results, 'id')).eql(['fido', 'spot']);
expect(util.pluck(results, 'data')).eql([{age: 3}, {age: 5}]);
connection.get('dogs', 'spot').submitOp({p: ['age'], na: -3});
});
var dbQuery = getQuery({query: matchAllDbQuery, sort: [['age', 1]]});
var query = connection.createSubscribeQuery(
'dogs',
dbQuery,
null,
function(err, results) {
if (err) return done(err);
expect(util.pluck(results, 'id')).eql(['fido', 'spot']);
expect(util.pluck(results, 'data')).eql([{age: 3}, {age: 5}]);
connection.get('dogs', 'spot').submitOp({p: ['age'], na: -3});
});

query.on('move', function(docs, from, to) {
expect(docs.length).eql(1);
expect(from).a('number');
Expand Down
22 changes: 16 additions & 6 deletions test/client/query.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@ var expect = require('expect.js');
var async = require('async');
var util = require('../util');

module.exports = function() {
module.exports = function(options) {
var getQuery = options.getQuery;

describe('client query', function() {
before(function() {
if (!getQuery) return this.skip();
this.matchAllDbQuery = getQuery({query: {}});
});

['createFetchQuery', 'createSubscribeQuery'].forEach(function(method) {
it(method + ' on an empty collection', function(done) {
var connection = this.backend.connect();
connection[method]('dogs', {}, null, function(err, results) {
connection[method]('dogs', this.matchAllDbQuery, null, function(err, results) {
if (err) return done(err);
expect(results).eql([]);
done();
Expand All @@ -17,13 +23,14 @@ describe('client query', function() {

it(method + ' on collection with fetched docs', function(done) {
var connection = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); },
function(cb) { connection.get('cats', 'finn').create({age: 2}, cb); }
], function(err) {
if (err) return done(err);
connection[method]('dogs', {}, null, function(err, results) {
connection[method]('dogs', matchAllDbQuery, null, function(err, results) {
if (err) return done(err);
var sorted = util.sortById(results);
expect(util.pluck(sorted, 'id')).eql(['fido', 'spot']);
Expand All @@ -36,13 +43,14 @@ describe('client query', function() {
it(method + ' on collection with unfetched docs', function(done) {
var connection = this.backend.connect();
var connection2 = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); },
function(cb) { connection.get('cats', 'finn').create({age: 2}, cb); }
], function(err) {
if (err) return done(err);
connection2[method]('dogs', {}, null, function(err, results) {
connection2[method]('dogs', matchAllDbQuery, null, function(err, results) {
if (err) return done(err);
var sorted = util.sortById(results);
expect(util.pluck(sorted, 'id')).eql(['fido', 'spot']);
Expand All @@ -55,6 +63,7 @@ describe('client query', function() {
it(method + ' on collection with one fetched doc', function(done) {
var connection = this.backend.connect();
var connection2 = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); },
Expand All @@ -63,7 +72,7 @@ describe('client query', function() {
if (err) return done(err);
connection2.get('dogs', 'fido').fetch(function(err) {
if (err) return done(err);
connection2[method]('dogs', {}, null, function(err, results) {
connection2[method]('dogs', matchAllDbQuery, null, function(err, results) {
if (err) return done(err);
var sorted = util.sortById(results);
expect(util.pluck(sorted, 'id')).eql(['fido', 'spot']);
Expand All @@ -77,6 +86,7 @@ describe('client query', function() {
it(method + ' on collection with one fetched doc missing an op', function(done) {
var connection = this.backend.connect();
var connection2 = this.backend.connect();
var matchAllDbQuery = this.matchAllDbQuery;
async.parallel([
function(cb) { connection.get('dogs', 'fido').create({age: 3}, cb); },
function(cb) { connection.get('dogs', 'spot').create({age: 5}, cb); },
Expand All @@ -95,7 +105,7 @@ describe('client query', function() {
connection2.get('dogs', 'spot')
]
};
connection2[method]('dogs', {}, options, function(err, results) {
connection2[method]('dogs', matchAllDbQuery, options, function(err, results) {
if (err) return done(err);
var sorted = util.sortById(results);
expect(util.pluck(sorted, 'id')).eql(['fido', 'spot']);
Expand Down
Loading

0 comments on commit 4bf6fa6

Please sign in to comment.