nqm-minimongo
Version:
Client-side mongo database with server sync over http
371 lines (301 loc) • 12.1 kB
text/coffeescript
_ = require 'lodash'
chai = require 'chai'
assert = chai.assert
error = (err) ->
console.log err
assert.fail(JSON.stringify(err))
# Runs queries on @col which must be a collection (with a:<string>, b:<integer>, c:<json>, geo:<geojson>, stringarr: <json array of strings>)
# When present:
# c.arrstr is an array of string values
# c.arrint is an array of integer values
# @reset(done) must truncate the collection
module.exports = ->
before ->
# Test a filter to return specified rows (in order)
assert.deepEqual _.pluck(results, '_id'), ids
done()
context 'With sample rows', ->
beforeEach (done) ->
done()
it 'finds all rows', (done) ->
assert.equal results.length, 3
done()
it 'finds all rows with options', (done) ->
assert.equal 3, results.length
done()
it 'filters by id', (done) ->
it 'filters by string', (done) ->
it 'filters by $in string', (done) ->
it 'filters by number', (done) ->
it 'filters by $in number', (done) ->
it 'filters by $regex', (done) ->
it 'filters by $regex case-sensitive', (done) ->
it 'filters by $regex case-insensitive', (done) ->
it 'filters by $or', (done) ->
it 'filters by path', (done) ->
it 'filters by $ne', (done) ->
it 'filters by $gt', (done) ->
it 'filters by $lt', (done) ->
it 'filters by $gte', (done) ->
it 'filters by $lte', (done) ->
it 'filters by $not', (done) ->
it 'filters by $or', (done) ->
it 'filters by $exists: true', (done) ->
it 'filters by $exists: false', (done) ->
it 'includes fields', (done) ->
assert.deepEqual results[0], { _id: "1", a: "Alice" }
done()
it 'includes subfields', (done) ->
assert.deepEqual results[0], { _id: "1", c: { d: 1 } }
done()
it 'ignores non-existent subfields', (done) ->
assert.deepEqual results[0], { _id: "1" }
done()
it 'excludes fields', (done) ->
assert.isUndefined results[0].a
assert.equal results[0].b, 1
done()
it 'excludes subfields', (done) ->
assert.deepEqual results[0].c, { e: 2 }
done()
it 'finds one row', (done) ->
assert.equal 'Charlie', result.a
done()
it 'removes item', (done) ->
assert.equal 2, results.length
assert "1" in (result._id for result in results)
assert "2" not in (result._id for result in results)
done()
, error
, error
it 'removes non-existent item', (done) ->
assert.equal 3, results.length
done()
it 'sorts ascending', (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1","3","2"]
done()
it 'sorts descending', (done) ->
assert.deepEqual _.pluck(results, '_id'), ["2","3","1"]
done()
it 'limits', (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1","3"]
done()
it 'skips', (done) ->
assert.deepEqual _.pluck(results, '_id'), ["2"]
done()
# MemoryDb is much faster if we relax this constraint
it 'fetches independent copies', (done) ->
assert result1 != result2
done()
# MemoryDb is much faster if we relax this constraint
it 'upsert keeps independent copies', (done) ->
doc = { _id: "2" }
doc.a = "xyz"
item.a = "xyz"
assert doc != doc2
assert doc2.a != "xyz"
done()
it 'adds _id to rows', (done) ->
assert.property item, '_id'
assert.lengthOf item._id, 32
done()
it 'returns array if called with array', (done) ->
assert.equal items[0].a, "1"
done()
it 'updates by id', (done) ->
assert.equal item.a, "2"
assert.equal 1, results.length, "Should be only one document"
done()
it 'call upsert with upserted row', (done) ->
assert.equal item._id, "1"
assert.equal item.a, "1"
done()
it 'upserts multiple rows', (done) ->
docs = []
for i in [0...100]
docs.push { b: i }
assert.equal results.length, 100
done()
, error
, error
context 'With sample with capitalization', ->
beforeEach (done) ->
done()
it 'finds sorts in Javascript order', (done) ->
assert.deepEqual _.pluck(results, '_id'), ["2","1"]
done()
context 'With integer array in json rows', ->
beforeEach (done) ->
done()
it 'filters by $in', (done) ->
it 'filters by list $in with multiple', (done) ->
context 'With object array rows', ->
beforeEach (done) ->
done()
it 'filters by $elemMatch', (done) ->
context 'With array rows with inner string arrays', ->
beforeEach (done) ->
done()
it 'filters by $elemMatch', (done) ->
context 'With text array rows', ->
beforeEach (done) ->
done()
, error
, error
, error
it 'filters by $in', (done) ->
it 'filters by direct reference', (done) ->
it 'filters by both item and complete array', (done) ->
geopoint = (lng, lat) ->
return {
type: 'Point'
coordinates: [lng, lat]
}
context 'With geolocated rows', ->
beforeEach (done) ->
done()
it 'finds points near', (done) ->
selector = geo:
$near:
$geometry: geopoint(90, 45)
assert.deepEqual _.pluck(results, '_id'), ["1","3","2","4"]
done()
it 'finds points near maxDistance', (done) ->
selector = geo:
$near:
$geometry: geopoint(90, 45)
$maxDistance: 111180
assert.deepEqual _.pluck(results, '_id'), ["1","3"]
done()
it 'finds points near maxDistance just above', (done) ->
selector = geo:
$near:
$geometry: geopoint(90, 45)
$maxDistance: 111410
assert.deepEqual _.pluck(results, '_id'), ["1","3","2"]
done()
it 'finds points within simple box', (done) ->
selector = geo:
$geoIntersects:
$geometry:
type: 'Polygon'
coordinates: [[
[89.5, 45.5], [89.5, 46.5], [90.5, 46.5], [90.5, 45.5], [89.5, 45.5]
]]
assert.deepEqual _.pluck(results, '_id'), ["2"]
done()
it 'finds points within big box', (done) ->
selector = geo:
$geoIntersects:
$geometry:
type: 'Polygon'
coordinates: [[
[0, -89], [0, 89], [179, 89], [179, -89], [0, -89]
]]
assert.deepEqual _.pluck(results, '_id'), ["1", "2", "3", "4"]
done()
it 'handles undefined', (done) ->
selector = geo:
$geoIntersects:
$geometry:
type: 'Polygon'
coordinates: [[
[89.5, 45.5], [89.5, 46.5], [90.5, 46.5], [90.5, 45.5], [89.5, 45.5]
]]
assert.deepEqual _.pluck(results, '_id'), ["2"]
done()