nitrogen-core
Version:
Core services used across ingestion, registry, and consumption servers.
223 lines (183 loc) • 8.04 kB
JavaScript
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();
});
});
});