nqm-minimongo
Version:
Client-side mongo database with server sync over http
401 lines (350 loc) • 15.2 kB
text/coffeescript
_ = require 'lodash'
chai = require 'chai'
assert = chai.assert
# Runs caching tests on @col which must be a collection (with a:<string>, b:<integer>, c:<json>, geo:<geojson>)
# @reset(done) must truncate the collection
module.exports = ->
describe "local database", ->
beforeEach (done) ->
it 'caches row', (done) ->
assert.equal results[0].a, 'apple'
done()
it 'caches rows', (done) ->
rows = [
{ _id: "1", a: 'apple' }
{ _id: "2", a: 'banana' }
{ _id: "3", a: 'orange' }
{ _id: "4", a: 'kiwi' }
]
assert.equal results.length, 4
done()
it 'caches zero rows', (done) ->
rows = []
assert.equal results.length, 0
done()
it 'cache overwrite existing', (done) ->
assert.equal results[0].a, 'banana'
done()
it 'cache with same _rev overwrite existing', (done) ->
assert.equal results[0].a, 'banana'
done()
it 'cache with greater _rev overwrite existing', (done) ->
assert.equal results[0].a, 'banana'
done()
it 'cache with lesser _rev does not overwrite existing', (done) ->
assert.equal results[0].a, 'apple'
done()
it "cache doesn't overwrite upsert", (done) ->
assert.equal results[0].a, 'apple'
done()
it "cache doesn't overwrite remove", (done) ->
assert.equal results.length, 0
done()
it "cache removes missing unsorted", (done) ->
assert.equal results.length, 2
done()
it "handles implicitly sorted ($near) with limit"
# TODO
it "cache removes missing filtered", (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1", "3"]
done()
it "cache removes missing sorted limited", (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1", "3"]
done()
it "cache does not remove missing sorted limited past end", (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1", "3", "4"]
done()
it "uncache removes matching", (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1", "3"]
done()
it "uncache does not remove upserts", (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1", "2", "3"]
done()
it "uncache does not remove removes", (done) ->
assert.deepEqual _.pluck(results, '_id'), ["1", "3"]
assert.deepEqual results, ["2"]
done()
it "returns pending upserts", (done) ->
assert.equal results.length, 1
assert.equal results[0].doc.a, 'banana'
assert.isNull results[0].base
done()
it "resolves pending upserts", (done) ->
assert.equal results.length, 0
done()
it "sets base of upserts", (done) ->
assert.equal results.length, 1
assert.equal results[0].doc.a, 'banana'
assert.equal results[0].base.a, 'apple'
done()
it "keeps base on subsequent upserts", (done) ->
assert.equal results.length, 1
assert.equal results[0].doc.a, 'orange'
assert.equal results[0].base.a, 'apple'
done()
it "allows setting of upsert base", (done) ->
assert.equal results.length, 1
assert.equal results[0].doc.a, 'banana'
assert.equal results[0].base.a, 'apple'
done()
it "allows setting of null upsert base", (done) ->
assert.equal results.length, 1
assert.equal results[0].doc.a, 'banana'
assert.equal results[0].base, null
done()
it "allows multiple upserts", (done) ->
docs = [
{ _id: "1", a: 'apple' }
{ _id: "2", a: 'banana' }
{ _id: "3", a: 'orange' }
]
assert.deepEqual _.pluck(results, "doc"), docs
assert.deepEqual _.pluck(results, "base"), [null, null, null]
done()
it "allows multiple upserts with bases", (done) ->
docs = [
{ _id: "1", a: 'apple' }
{ _id: "2", a: 'banana' }
{ _id: "3", a: 'orange' }
]
bases = [
{ _id: "1", a: 'apple2' }
{ _id: "2", a: 'banana2' }
{ _id: "3", a: 'orange2' }
]
assert.deepEqual _.pluck(results, "doc"), docs
assert.deepEqual _.pluck(results, "base"), bases
done()
it "resolves multiple upserts", (done) ->
docs = [
{ _id: "1", a: 'apple' }
{ _id: "2", a: 'banana' }
{ _id: "3", a: 'orange' }
]
assert.equal results.length, 0
done()
it "handles removed pending upserts", (done) ->
docs = [
{ _id: "1", a: 'apple' }
{ _id: "2", a: 'banana' }
{ _id: "3", a: 'orange' }
]
assert.equal results.length, 0
done()
it "retains changed pending upserts but updates base", (done) ->
assert.equal results.length, 1
assert.equal results[0].doc.a, 'banana2'
assert.equal results[0].base.a, 'banana'
done()
it "removes by filter", (done) ->
assert.equal results.length, 1
assert.equal results[0].doc.a, "apple"
done()
it "removes pending upserts", (done) ->
assert.equal results.length, 0
done()
it "returns pending removes", (done) ->
assert.equal results.length, 1
assert.equal results[0], 1
done()
it "returns pending removes that are not present", (done) ->
assert.equal results.length, 1
assert.equal results[0], 2
done()
it "resolves pending removes", (done) ->
assert.equal results.length, 0
done()
it "seeds", (done) ->
assert.equal results[0].a, 'apple'
done()
it "does not overwrite existing", (done) ->
assert.equal results[0].a, 'banana'
done()
it "does not add removed", (done) ->
assert.equal results.length, 0
done()
it "allows removing uncached rows", (done) ->
assert.equal results.length, 1
assert.equal results[0], "12345"
done()
it 'seeds rows', (done) ->
assert.equal results[0].a, 'apple'
done()
it 'seed does not overwrite existing', (done) ->
assert.equal results[0].a, 'apple'
done()
it "seed doesn't overwrite upsert", (done) ->
assert.equal results[0].a, 'apple'
done()
it "seed doesn't overwrite remove", (done) ->
assert.equal results.length, 0
done()
it 'cache one single doc', (done) ->
assert.equal results[0].a, 'apple'
done()
it 'cache one overwrite existing', (done) ->
assert.equal results[0].a, 'banana'
done()
it "cache one doesn't overwrite upsert", (done) ->
assert.equal results[0].a, 'apple'
done()
it "cache one doesn't overwrite remove", (done) ->
assert.equal results.length, 0
done()
it 'cache one with same _rev overwrite existing', (done) ->
assert.equal results[0].a, 'banana'
done()
it 'cache one with greater _rev overwrite existing', (done) ->
assert.equal results[0].a, 'banana'
done()
it 'cache one with lesser _rev does not overwrite existing', (done) ->
assert.equal results[0].a, 'apple'
done()