1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-24 01:18:01 +02:00

#18 storing events when they are created.

Also introduced mockery to mock db-access. Here we probably
need better modularisation and/or better dependecy management
(injecting of deps?).
This commit is contained in:
Ivar Conradi Østhus 2014-10-23 12:03:46 +02:00
parent 7868ba3f67
commit c991fed69c
8 changed files with 115 additions and 69 deletions

View File

@ -2,8 +2,8 @@ var Promise = require('bluebird'),
dbPool = require('./dbPool'); dbPool = require('./dbPool');
function storeEvent(event) { function storeEvent(event) {
var sql = 'INSERT INTO events(type, user, data) VALUES ($1, $2, $3)'; var sql = 'INSERT INTO events(type, created_by, data) VALUES ($1, $2, $3)';
var params = [event.type,event.user,event.data]; var params = [event.type, event.createdBy, event.data];
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
dbPool.query(sql, params, function (err) { dbPool.query(sql, params, function (err) {
@ -15,5 +15,5 @@ function storeEvent(event) {
module.exports = { module.exports = {
store: storeEvent() store: storeEvent
}; };

View File

@ -1,5 +1,5 @@
var Promise = require('bluebird'), var util = require('util'),
util = require('util'), eventDb = require('./eventDb'),
EventEmitter = require('events').EventEmitter; EventEmitter = require('events').EventEmitter;
function EventStore() { function EventStore() {
@ -8,10 +8,10 @@ function EventStore() {
util.inherits(EventStore, EventEmitter); util.inherits(EventStore, EventEmitter);
EventStore.prototype.create = function (event) { EventStore.prototype.create = function (event) {
return new Promise(function (resolve) { var that = this;
this.emit(event.type, event); return eventDb.store(event).then(function() {
resolve(); that.emit(event.type, event);
}.bind(this)); });
}; };
module.exports = new EventStore(); module.exports = new EventStore();

View File

@ -23,7 +23,7 @@ module.exports = function (app) {
app.post('/features', function (req, res) { app.post('/features', function (req, res) {
var newFeature = req.body, var newFeature = req.body,
user = req.connection.remoteAddress; createdBy = req.connection.remoteAddress;
db.getFeature(newFeature.name).then(function (feature) { db.getFeature(newFeature.name).then(function (feature) {
if (feature) { if (feature) {
@ -32,7 +32,7 @@ module.exports = function (app) {
} else { } else {
eventStore.create({ eventStore.create({
type: eventType.featureCreated, type: eventType.featureCreated,
user: user, createdBy: createdBy,
data: newFeature data: newFeature
}).then(function() { }).then(function() {
res.status(201).end(); res.status(201).end();

View File

@ -1,10 +1,11 @@
var eventStore = require('./eventStore'), var eventStore = require('./eventStore'),
eventType = require('./eventType'), eventType = require('./eventType'),
featuresMock = require('./featuresMock'), featuresMock = require('./featuresMock'),
logger = require('./logger'),
Promise = require('bluebird'); Promise = require('bluebird');
eventStore.on(eventType.featureCreated, function (event) { eventStore.on(eventType.featureCreated, function (event) {
console.log('feature created event recieved', event); logger.info('feature created event recieved', event);
} }
); );

View File

@ -1,54 +1,55 @@
{ {
"name": "unleash-server", "name": "unleash-server",
"description": "unleash your features", "description": "unleash your features",
"version": "0.0.1", "version": "0.0.1",
"keywords": [ "keywords": [
"unleash", "unleash",
"feature toggle", "feature toggle",
"feature", "feature",
"toggle" "toggle"
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "ssh://git@github.com:finn-no/unleash.git" "url": "ssh://git@github.com:finn-no/unleash.git"
}, },
"bugs": { "bugs": {
"url": "https://github.com/finn-no/unleash/issues" "url": "https://github.com/finn-no/unleash/issues"
}, },
"private": true, "private": true,
"scripts": { "scripts": {
"start": "node server.js", "start": "node server.js",
"start-dev": "NODE_ENV=local supervisor --ignore ./node_modules/,./public/js server.js", "start-dev": "NODE_ENV=local supervisor --ignore ./node_modules/,./public/js server.js",
"test": "jshint server.js lib public/scripts test && mocha test test/*", "test": "jshint server.js lib public/scripts test && mocha test test/*",
"tdd": "mocha --watch test test/*", "tdd": "mocha --watch test test/*",
"test-bamboo-ci": "mocha test test/*", "test-bamboo-ci": "mocha test test/*",
"db-create": "createdb unleash_${NODE_ENV:-dev}", "db-create": "createdb unleash_${NODE_ENV:-dev}",
"db-drop": "dropdb unleash_${NODE_ENV:-dev}", "db-drop": "dropdb unleash_${NODE_ENV:-dev}",
"db-migrate-up": "db-migrate --config config/database.json up", "db-migrate-up": "db-migrate --config config/database.json up",
"db-migrate-down": "db-migrate --config config/database.json down", "db-migrate-down": "db-migrate --config config/database.json down",
"db-setup": "npm run db-create; npm run db-migrate-up" "db-setup": "npm run db-create; npm run db-migrate-up"
}, },
"dependencies": { "dependencies": {
"bluebird": "2.2.2", "bluebird": "2.2.2",
"body-parser": "1.4.3", "body-parser": "1.4.3",
"db-migrate": "^0.7.1", "db-migrate": "^0.7.1",
"errorhandler": "1.1.1", "errorhandler": "1.1.1",
"express": "4.9.8", "express": "4.9.8",
"express-validator": "2.6.0", "express-validator": "2.6.0",
"ini": "1.3.0", "ini": "1.3.0",
"log4js": "0.6.21", "log4js": "0.6.21",
"nconf": "0.6.9", "nconf": "0.6.9",
"pg": "^3.6.1", "pg": "^3.6.1",
"any-db": "2.1.0", "any-db": "2.1.0",
"any-db-pool": "2.1.0", "any-db-pool": "2.1.0",
"any-db-postgres": "2.1.3" "any-db-postgres": "2.1.3"
}, },
"devDependencies": { "devDependencies": {
"chai": "1.9.1", "chai": "1.9.1",
"jshint": "2.5.2", "jshint": "2.5.2",
"mocha": "1.20.1", "mocha": "1.20.1",
"supertest": "0.13.0", "supertest": "0.13.0",
"supervisor": "~0.6.0", "supervisor": "~0.6.0",
"xmlbuilder": "^2.4.4" "xmlbuilder": "^2.4.4",
} "mockery": "~1.4.0"
}
} }

View File

@ -0,0 +1,13 @@
var Promise = require('bluebird');
function storeEvent(event) {
console.log('using eventDbMock to store: ', event);
return new Promise(function (resolve) {
resolve();
});
}
module.exports = {
store: storeEvent
};

View File

@ -1,8 +1,27 @@
var assert = require('assert'); var assert = require('assert'),
var eventType = require('../lib/eventType'); mockery = require('mockery'),
var eventStore = require('../lib/eventStore'); eventType = require('../lib/eventType'),
eventStore;
describe('EventStore', function () { describe('EventStore', function () {
before(function () {
mockery.enable({
warnOnReplace: false,
warnOnUnregistered: false,
useCleanCache: true
});
mockery.registerSubstitute('./eventDb', '../test/eventDbMock');
eventStore = require('../lib/eventStore');
});
after(function () {
mockery.disable();
mockery.deregisterAll();
});
describe('#create()', function () { describe('#create()', function () {
it('should emit event', function (done) { it('should emit event', function (done) {
eventStore.once(eventType.featureCreated, function (x) { eventStore.once(eventType.featureCreated, function (x) {
@ -20,7 +39,7 @@ describe('EventStore', function () {
eventStore.create({ eventStore.create({
type: eventType.featureCreated, type: eventType.featureCreated,
user: 'ole', createdBy: 'ole',
data: eventData data: eventData
}); });
}); });

View File

@ -1,4 +1,5 @@
var request = require('supertest'); var request = require('supertest'),
mockery = require('mockery'),
request = request('http://localhost:4242'); request = request('http://localhost:4242');
@ -6,10 +7,21 @@ describe('The api', function () {
var server; var server;
before(function () { before(function () {
mockery.enable({
warnOnReplace: false,
warnOnUnregistered: false,
useCleanCache: true
});
mockery.registerSubstitute('./eventDb', '../test/eventDbMock');
server = require('../server'); server = require('../server');
}); });
after(function () { after(function () {
mockery.disable();
mockery.deregisterAll();
server.server.close(); server.server.close();
}); });