UNPKG

nitrogen-core

Version:

Core services used across ingestion, registry, and consumption servers.

223 lines (183 loc) 8.04 kB
var assert = require('assert') , mongodbProviders = require('nitrogen-mongodb-providers') , core = require('../../lib') , fs = require('fs') , moment = require('moment') , mongoose = require('mongoose') , flat = require('flat'); describe('messages service', function() { it('can flatten a message', function(done) { var obj = { ts: "Mon Feb 02 2015 14:59:48 GMT-0800 (PST)", body: { longitude: "-122.3331", latitude: "48.2332" }, from: "54cffafea09ef731a1c09682", type: 'location', index_until: "Mon Feb 09 2015 14:59:48 GMT-0800 (PST)", expires: "Thu Dec 31 2499 16:00:00 GMT-0800 (PST)", tags: ['involves:54cffafea09ef731a1c09682'], response_to: [], ver: 0.2, updated_at: '2015-02-02T22:59:48.387Z', created_at: '2015-02-02T22:59:48.387Z', id: '54d00164509ef69fa13cb99d' }; var message = new core.models.Message(obj); assert.equal(message.body.longitude, "-122.3331"); assert.equal("body.longitude" in message, false); var flatMsg = core.services.messages.flatten(message.toJSON()); assert.equal(flatMsg["body__longitude"], "-122.3331"); assert.equal("body" in flatMsg, false); done(); }); it('can create and remove a message', function(done) { var message = new core.models.Message({ from: core.fixtures.models.principals.device.id, type: "_test", body: { reading: 5.1 } }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, savedMessages) { assert(!err); assert.notEqual(savedMessages[0].id, null); assert.equal(savedMessages[0].body_length > 0, true); var foundServicePrincipal = false; savedMessages[0].visible_to.forEach(function(id) { foundServicePrincipal = foundServicePrincipal || (id == core.services.principals.servicePrincipal.id); }); assert(foundServicePrincipal); core.services.messages.remove(core.services.principals.servicePrincipal, { id: savedMessages[0].id }, function(err) { assert(!err); done(); }); }); }); it('can add multiple messages', function(done) { var messages = [ new core.models.Message({ from: core.fixtures.models.principals.device.id, type: "_test", body: { reading: 5.1 } }), new core.models.Message({ from: core.fixtures.models.principals.device.id, type: "_test", body: { reading: 5.1 } }) ]; core.services.messages.createMany(core.fixtures.models.principals.user, messages, function(err, savedMessages) { assert(!err); assert.equal(savedMessages.length, 2); done(); }); }); if (core.config.primary_archive_provider instanceof mongodbProviders.MongoDBArchiveProvider) { it('can remove messages with a query', function(done) { var message = new core.models.Message({ from: core.fixtures.models.principals.device.id, type: "_test" }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, savedMessages) { assert(!err); assert.notEqual(savedMessages[0].id, null); core.services.messages.remove(core.services.principals.servicePrincipal, { type: "_test" }, function(err) { assert(!err); core.services.messages.find(core.services.principals.servicePrincipal, { type: "_test" }, function(err, messages) { assert(!err); assert.equal(messages.length, 0); done(); }); }); }); }); } it ('rejects message with invalid principal in from', function(done) { var message = new core.models.Message({ from: new mongoose.Types.ObjectId(), type: "_test" }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, savedMessages) { assert(err); done(); }); }); it ('rejects message without type', function(done) { var message = new core.models.Message({ from: core.fixtures.models.principals.device.id }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, savedMessages) { assert(err); done(); }); }); it ('handles log message by creating log entry', function(done) { var message = new core.models.Message({ from: core.fixtures.models.principals.device.id, type: "log", body: { severity: "error", message: "something terrible happened" } }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, savedMessages) { assert(!err); core.services.messages.find(core.fixtures.models.principals.user, { type: 'log' }, {}, function(err, messages) { assert(!err); assert.equal(messages.length, 1); messages.forEach(function(message) { assert(message.type === 'log'); done(); }); }); }); }); it ('flunks incorrect schema for log message', function(done) { var message = new core.models.Message({ from: core.fixtures.models.principals.device.id, type: "log", body: { notright: "error", message: "something terrible happened" } }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, savedMessages) { assert.notEqual(err, null); done(); }); }); it ('allows unknown well known schema', function(done) { var message = new core.models.Message({ type: "unknownCommand" }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, savedMessages) { assert(!err); done(); }); }); it('does queries with string object ids correctly', function(done) { var deviceIdString = core.fixtures.models.principals.device.id.toString(); core.services.messages.find(core.fixtures.models.principals.device, { from: deviceIdString, type: 'ip' }, { sort: { ts: -1 }}, function(err, messages) { assert(!err); assert.equal(messages.length, 2); messages.forEach(function(message) { assert(message.from && message.from.toString() === core.fixtures.models.principals.device.id); }); done(); }); }); it('fans out group messages to members', function(done) { var message = new core.models.Message({ from: core.fixtures.models.principals.user.id, to: core.fixtures.models.principals.group.id, type: "_fanoutTest", body: { data: 1 } }); core.services.messages.create(core.fixtures.models.principals.user, message, function(err, messages) { assert(!err); messages.forEach(function(message) { assert(message.to.toString() === core.fixtures.models.principals.device.id.toString() || message.to.toString() === core.fixtures.models.principals.user.id.toString()); }); done(); }); }); });