elasticmongooseq
Version:
Mongoose elasticsearch bindings
193 lines (148 loc) • 5.03 kB
text/coffeescript
helper = require('./helper')
mongoose = require('mongoose-q')()
Q = require('q')
ElasticMongooseQ = require('../index')
#
# Elasticsearch setup
#
elasticClient = helper.elasticsearch.client
elasticIndex = helper.elasticsearch.index
elasticMongooseQ = new ElasticMongooseQ
index: elasticIndex
client: elasticClient
#
# Fish Class
#
FishSchema = helper.mongo.AnimalSchema
animalMapping = helper.elasticsearch.animalMapping
# Add the plugin giving the type and
FishSchema.plugin elasticMongooseQ.plugin(),
type: 'fish'
mapping: animalMapping
toObjectMethod: 'toSearchObject'
# Mock method to test custom toObject with a delayed promise
FishSchema.methods.toSearchObject = (callback) ->
deferred = Q.defer()
setTimeout () =>
deferred.resolve @toObject()
, 50
deferred.promise.nodeify(callback)
Fish = mongoose.model "Fish", FishSchema
#
# Mamal Class
#
MamalSchema = helper.mongo.AnimalSchema
# Add the plugin giving the type and
MamalSchema.plugin elasticMongooseQ.plugin(),
type: 'mamal'
mapping: animalMapping
Mamal = mongoose.model "Mamal", MamalSchema
checkIndex = () ->
elasticMongooseQ.indexExists()
removeIndex = (bool) ->
if bool
elasticMongooseQ.deleteIndex()
else
Q()
createIndex = () ->
elasticMongooseQ.connect()
putMappings = ->
tasks = [
Fish.putMapping()
Mamal.putMapping()
]
Q.all(tasks)
addAnimals = ->
fish1 = new Fish name: 'Whale', description: 'The biggest fish like thing in the sea'
fish2 = new Fish name: 'Sail fish', description: 'A fast fish'
fish3 = new Fish name: 'Great white shark', description: "It'll get ya!"
mamal1 = new Mamal name: 'Monkey', description: 'Cheeky chappy'
mamal2 = new Mamal name: 'Squirrel', description: 'Known for climbing trees and trumping'
tasks = [
fish1.saveQ()
fish2.saveQ()
fish3.saveQ()
mamal1.saveQ()
mamal2.saveQ()
]
Q.all(tasks)
#
# Start tests
#
before (done) ->
helper.mongo.connect()
# Create fresh elasticsearch index
Q.delay(1000).then(checkIndex).then(removeIndex).then(createIndex).then(putMappings).nodeify(done)
describe 'ElasticMongooseQ', ->
context "Index", ->
describe 'putMapping', ->
it 'should put the mapping to the index', (done) ->
Fish.putMapping().then (resp) ->
expect(resp.acknowledged).to.equal(true)
.nodeify(done)
it 'should put the mapping to the index', (done) ->
Mamal.putMapping().then (resp) ->
expect(resp.acknowledged).to.equal(true)
.nodeify(done)
context "Collections", ->
describe "syncSearchIndex", ->
@timeout(15000)
before (done) ->
addAnimals().then(checkIndex).then(removeIndex).delay(500).then(createIndex).delay(500).then(putMappings).delay(500).nodeify(done)
it 'should index all Fish documents', (done) ->
Fish.syncSearchIndex().nodeify(done)
it 'should index all Mamal documents', (done) ->
Mamal.syncSearchIndex().nodeify(done)
describe "search", ->
@timeout(15000)
before (done) ->
checkIndex().then(removeIndex).delay(500).then(createIndex).delay(500).then(putMappings).then(addAnimals).delay(500).nodeify(done)
it 'should find 2 documents with the keyword fish', (done) ->
promise = Fish.search
query:
match:
description: 'fish'
promise.then (results) ->
expect(results.hits.hits).to.have.length(2)
.nodeify(done)
it 'should find 1 mamal with the keyword tree (stemmed trees)', (done) ->
promise = Mamal.search
query:
match:
description: 'tree'
promise.then (results) ->
expect(results.hits.hits).to.have.length(1)
.nodeify(done)
context "Documents", ->
elephant = new Mamal name: 'Elephant', description: 'The biggest mamal not in the sea'
saveElephant = () ->
elephant.saveQ()
findElephant = (elephant) ->
elasticClient.get
index: elasticIndex
type: 'mamal'
id: "#{elephant.id}"
checkElephantInIndex = (resp) ->
expect(resp._id).to.equal(elephant.id)
Q(true)
removeElephant = () ->
elephant.remove()
checkElephantNotInIndex = (err) ->
expect(err.message).to.equal('Not Found')
describe 'test model', ->
it 'should have the name "Elephant"', (done) ->
expect(elephant).to.have.property('name')
expect(elephant.name).to.equal('Elephant')
done()
describe 'when saving the elephant', ->
it 'should also save to elasticsearch', (done) ->
saveElephant().then(findElephant).then(checkElephantInIndex).nodeify(done)
describe 'when removing a document', ->
it 'should also remove from elasticsearch', (done) ->
saveElephant()
.then(findElephant)
.then(checkElephantInIndex)
.then(removeElephant)
.then(findElephant)
.catch(checkElephantNotInIndex)
.nodeify(done)