Skip to content
This repository was archived by the owner on Apr 2, 2024. It is now read-only.

Commit 7c21f49

Browse files
authored
Merge pull request share#319 from share/test-query-poll-doc
add test coverage for queryPollDoc
2 parents f0e8ed8 + 7b06e96 commit 7c21f49

File tree

2 files changed

+50
-22
lines changed

2 files changed

+50
-22
lines changed

test/BasicQueryableMemoryDB.js

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,7 @@ BasicQueryableMemoryDB.prototype.constructor = BasicQueryableMemoryDB;
1414
BasicQueryableMemoryDB.prototype._querySync = function(snapshots, query) {
1515
if (query.filter) {
1616
snapshots = snapshots.filter(function(snapshot) {
17-
for (var queryKey in query.filter) {
18-
// This fake only supports simple property equality filters, so
19-
// throw an error on Mongo-like filter properties with dots.
20-
if (queryKey.includes('.')) {
21-
throw new Error('Only simple property filters are supported, got:', queryKey);
22-
}
23-
if (snapshot.data[queryKey] !== query.filter[queryKey]) {
24-
return false;
25-
}
26-
}
27-
return true;
17+
return querySnapshot(snapshot, query);
2818
});
2919
}
3020

@@ -40,6 +30,42 @@ BasicQueryableMemoryDB.prototype._querySync = function(snapshots, query) {
4030
return {snapshots: snapshots};
4131
};
4232

33+
BasicQueryableMemoryDB.prototype.queryPollDoc = function(collection, id, query, options, callback) {
34+
var db = this;
35+
process.nextTick(function() {
36+
var snapshot = db._getSnapshotSync(collection, id);
37+
try {
38+
var matches = querySnapshot(snapshot, query);
39+
} catch (err) {
40+
return callback(err);
41+
}
42+
callback(null, matches);
43+
});
44+
};
45+
46+
BasicQueryableMemoryDB.prototype.canPollDoc = function(collection, query) {
47+
return !query.sort;
48+
};
49+
50+
function querySnapshot(snapshot, query) {
51+
// Never match uncreated or deleted snapshots
52+
if (snapshot.type == null) return false;
53+
// Match any snapshot when there is no query filter
54+
if (!query.filter) return true;
55+
// Check that each property in the filter equals the snapshot data
56+
for (var queryKey in query.filter) {
57+
// This fake only supports simple property equality filters, so
58+
// throw an error on Mongo-like filter properties with dots.
59+
if (queryKey.includes('.')) {
60+
throw new Error('Only simple property filters are supported, got:', queryKey);
61+
}
62+
if (snapshot.data[queryKey] !== query.filter[queryKey]) {
63+
return false;
64+
}
65+
}
66+
return true;
67+
}
68+
4369
// sortProperties is an array whose items are each [propertyName, direction].
4470
function snapshotComparator(sortProperties) {
4571
return function(snapshotA, snapshotB) {

test/db.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,8 @@ module.exports = function(options) {
734734
var db = this.db;
735735
db.commit('testcollection', 'test', {v: 0, create: {}}, snapshot, null, function(err) {
736736
if (err) return done(err);
737-
db.queryPoll('testcollection', {x: 5}, null, function(err, ids) {
737+
var dbQuery = getQuery({query: {x: 5}});
738+
db.queryPoll('testcollection', dbQuery, null, function(err, ids) {
738739
if (err) return done(err);
739740
expect(ids).eql(['test']);
740741
done();
@@ -743,7 +744,8 @@ module.exports = function(options) {
743744
});
744745

745746
it('returns nothing when there is no data', function(done) {
746-
this.db.queryPoll('testcollection', {x: 5}, null, function(err, ids) {
747+
var dbQuery = getQuery({query: {x: 5}});
748+
this.db.queryPoll('testcollection', dbQuery, null, function(err, ids) {
747749
if (err) return done(err);
748750
expect(ids).eql([]);
749751
done();
@@ -753,26 +755,26 @@ module.exports = function(options) {
753755

754756
describe('queryPollDoc', function() {
755757
it('returns false when the document does not exist', function(done) {
756-
var query = {};
757-
if (!this.db.canPollDoc('testcollection', query)) return done();
758+
var dbQuery = getQuery({query: {}});
759+
if (!this.db.canPollDoc('testcollection', dbQuery)) return done();
758760

759761
var db = this.db;
760-
db.queryPollDoc('testcollection', 'doesnotexist', query, null, function(err, result) {
762+
db.queryPollDoc('testcollection', 'doesnotexist', dbQuery, null, function(err, result) {
761763
if (err) return done(err);
762764
expect(result).equal(false);
763765
done();
764766
});
765767
});
766768

767769
it('returns true when the document matches', function(done) {
768-
var query = {x: 5};
769-
if (!this.db.canPollDoc('testcollection', query)) return done();
770+
var dbQuery = getQuery({query: {x: 5}});
771+
if (!this.db.canPollDoc('testcollection', dbQuery)) return done();
770772

771773
var snapshot = {type: 'json0', v: 1, data: {x: 5, y: 6}};
772774
var db = this.db;
773775
db.commit('testcollection', 'test', {v: 0, create: {}}, snapshot, null, function(err) {
774776
if (err) return done(err);
775-
db.queryPollDoc('testcollection', 'test', query, null, function(err, result) {
777+
db.queryPollDoc('testcollection', 'test', dbQuery, null, function(err, result) {
776778
if (err) return done(err);
777779
expect(result).equal(true);
778780
done();
@@ -781,14 +783,14 @@ module.exports = function(options) {
781783
});
782784

783785
it('returns false when the document does not match', function(done) {
784-
var query = {x: 6};
785-
if (!this.db.canPollDoc('testcollection', query)) return done();
786+
var dbQuery = getQuery({query: {x: 6}});
787+
if (!this.db.canPollDoc('testcollection', dbQuery)) return done();
786788

787789
var snapshot = {type: 'json0', v: 1, data: {x: 5, y: 6}};
788790
var db = this.db;
789791
db.commit('testcollection', 'test', {v: 0, create: {}}, snapshot, null, function(err) {
790792
if (err) return done(err);
791-
db.queryPollDoc('testcollection', 'test', query, null, function(err, result) {
793+
db.queryPollDoc('testcollection', 'test', dbQuery, null, function(err, result) {
792794
if (err) return done(err);
793795
expect(result).equal(false);
794796
done();

0 commit comments

Comments
 (0)