diff --git a/.travis.yml b/.travis.yml index b21ccef0f2..174da2c9e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,11 +8,8 @@ before_script: - psql -c 'create database unleash_test;' -U postgres script: - npm install -- npm run test:ci +- npm run test notifications: - hipchat: - rooms: - secure: GiIDk52xccnUKnevjLE+w6eUXg0jfV7oOmagw5VnOV5jXGUxdzMk/Q9um+oSClEPE51IvF76zoFEKPIX/CNdjgalEr+CZADy1gene/YRGrNgrXmYYmiU1/dNzelpla1WpKPrY2pkbOgKxrCR9ScID+pMs6vzvJnPwK9vu66W61U= slack: secure: MroremSKwtQkwPbrXjgs9hIqKTCDKk7bAIXXzjcS6wXC9uRaFgwFaW8oO3vBxtWa4BL44EQBLE/rboWgqFER62+XgXNgEqGZqrcJHJvby4r+dUNMPI64OZvWdIiydIYxLo8C1C4x5PqBup0xuLq8h/SBnNvA2NLgkjuvzOi+v/Q= addons: diff --git a/README.md b/README.md index 4df644a3b0..c6bb46c00f 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ __Warning: We are in the process of splitting up unleash into multiple packages in this repository, if you want to test the previous package see [previous tag](https://github.com/finn-no/unleash/tree/v1.0.0-alpha.2) __ [![Build Status](https://travis-ci.org/Unleash/unleash.svg?branch=master)](https://travis-ci.org/Unleash/unleash) -[![Coverage Status](https://coveralls.io/repos/github/Unleash/unleash/badge.svg?branch=master&path=packages/unleash-api)](https://coveralls.io/github/Unleash/unleash?branch=master) -[![Dependency Status](https://david-dm.org/Unleash/unleash.svg?path=packages/unleash-api)](https://david-dm.org/Unleash/unleash?path=packages/unleash-api) -[![devDependency Status](https://david-dm.org/Unleash/unleash/dev-status.svg?path=packages/unleash-api)](https://david-dm.org/Unleash/unleash?path=packages/unleash-api#info=devD) +[![Coverage Status](https://coveralls.io/repos/github/Unleash/unleash/badge.svg?branch=master)](https://coveralls.io/github/Unleash/unleash?branch=master) +[![Dependency Status](https://david-dm.org/Unleash/unleash.svg)](https://david-dm.org/Unleash/unleash?path=packages/unleash-api) +[![devDependency Status](https://david-dm.org/Unleash/unleash/dev-status.svg)](https://david-dm.org/Unleash/unleash?path=packages/unleash-api#info=devD) ![Admin UI](https://cloud.githubusercontent.com/assets/572/5873775/3ddc1a66-a2fa-11e4-923c-0a9569605dad.png) [Demo](http://unleash.herokuapp.com/) instance on Heroku @@ -55,18 +55,19 @@ export TEST_DATABASE_URL=postgres://unleash_user:passord@localhost:5432/unleash_ // Install dependencies npm install -// Run migrations in your local DBs (via unleash-api) -npm run db-migrate -DATABASE_URL=$TEST_DATABASE_URL npm run db-migrate +// Build unleash-frontend +// (yes this is a bit wierd and be easier when we have a release of the frontend artifact). +// You can of course "npm link unleash-frontend" instead +cd node_modules/unleash-frontend && npm install -// Start server -npm start +// Start server in development +npm start:dev // Admin dashboard http://localhost:4242 // Feature API: -http://localhost:4242/features +http://localhost:4242/api/features // Execute tests in all packages: npm test diff --git a/bin/unleash.js b/bin/unleash.js index 150365d27f..a3d0d7a74b 100755 --- a/bin/unleash.js +++ b/bin/unleash.js @@ -4,7 +4,7 @@ process.env.NODE_ENV = 'production'; const program = require('commander'); -const unleash = require('../server.js'); +const unleash = require('../server-prod.js'); program diff --git a/lib/db/client-metrics-store.js b/lib/db/client-metrics-store.js index 36251d65d8..7ed0d54c5b 100644 --- a/lib/db/client-metrics-store.js +++ b/lib/db/client-metrics-store.js @@ -14,8 +14,7 @@ class ClientMetricsStore { constructor (db) { this.db = db; - this._removeMetricsOlderThanOneHour(); - + setTimeout(() => this._removeMetricsOlderThanOneHour(), 10).unref(); setInterval(() => this._removeMetricsOlderThanOneHour(), 60 * 60 * 1000).unref(); } diff --git a/migrator.js b/migrator.js index d51e2564b0..f443dbeaec 100644 --- a/migrator.js +++ b/migrator.js @@ -3,23 +3,14 @@ const DBMigrate = require('db-migrate'); const path = require('path'); -function findUnleashApiRoot () { - try { - return path.dirname(require.resolve('unleash-api/package.json')); - } catch (e) {} - try { - return path.dirname(require.resolve('../unleash-api/package.json')); - } catch (e) {} - return process.cwd(); -} - function migrateDb (dbUri) { + console.log(dbUri); const dbmigrate = DBMigrate.getInstance(true, { - cwd: findUnleashApiRoot(), - config: { custom: dbUri }, + cwd: __dirname, + config: { "custom": dbUri}, env: 'custom' } ); return dbmigrate.up(); } -module.exports = migrateDb; +module.exports = migrateDb; \ No newline at end of file diff --git a/package.json b/package.json index 4f556a8bca..a2ebc4df85 100644 --- a/package.json +++ b/package.json @@ -33,16 +33,14 @@ "unleash": "./bin/unleash.js" }, "scripts": { - "db-migrate-and-start": "npm run db-migrate && npm run start", - "start": "node dev-server.js", - "start:dev": "NODE_ENV=development supervisor --ignore ./node_modules/ dev-server.js", + "start": "node server-dev.js", + "start:dev": "NODE_ENV=development supervisor --ignore ./node_modules/ server-dev.js", "start:dev:pg": "pg_virtualenv npm run start:dev:pg-chain", "start:dev:pg-chain": "export DATABASE_URL=postgres://$PGUSER:$PGPASSWORD@localhost:$PGPORT/postgres ; db-migrate up && npm run start:dev", "db-migrate": "db-migrate up", "db-migrate:down": "db-migrate down", "test": "export PORT=4243 ; mocha --recursive test && npm run test:coverage", "test:unit": "mocha test/unit/**/*.js ", - "test:ci": "npm run db-migrate && npm run test", "test:docker": "./scripts/docker-postgres.sh", "test:watch": "mocha --watch test test/*", "test:pg-virtualenv": "pg_virtualenv npm run test:pg-virtualenv-chai", @@ -52,10 +50,10 @@ }, "dependencies": { "body-parser": "1.15.2", - "cookie-parser": "^1.4.1", "commander": "^2.9.0", - "db-migrate": "0.10.0-beta.17", - "db-migrate-pg": "0.1.10", + "cookie-parser": "^1.4.1", + "db-migrate": "0.10.0-beta.20", + "db-migrate-pg": "0.1.11", "deep-diff": "^0.3.3", "errorhandler": "^1.4.3", "express": "4.14.0", @@ -67,6 +65,7 @@ "moment": "^2.15.2", "pg": "^6.1.0", "serve-favicon": "^2.3.0", + "unleash-frontend": "github:unleash/unleash-frontend", "yallist": "^2.0.0" }, "devDependencies": { diff --git a/test/e2e/event-api.test.js b/test/e2e/event-api.test.js index 7a9c6b3614..265f6c1824 100644 --- a/test/e2e/event-api.test.js +++ b/test/e2e/event-api.test.js @@ -1,8 +1,16 @@ 'use strict'; -const request = require('./test-helper').request; +const specHelper = require('./util/test-helper'); +let request; describe('The event api', () => { + beforeEach(done => { + specHelper.setupApp().then((app) => { + request = app.request; + done(); + }); + }); + it('returns events', done => { request .get('/api/events') diff --git a/test/e2e/feature-api.test.js b/test/e2e/feature-api.test.js index b248faab59..dca3a3ee2c 100644 --- a/test/e2e/feature-api.test.js +++ b/test/e2e/feature-api.test.js @@ -2,17 +2,19 @@ const logger = require('../../lib/logger'); const assert = require('assert'); -const specHelper = require('./test-helper'); -const request = specHelper.request; +const specHelper = require('./util/test-helper'); const stringify = function (o) { return JSON.stringify(o, null, ' '); }; +let request; + describe('The features api', () => { beforeEach(done => { - specHelper.db.resetAndSetup() - .then(done.bind(null, null)) - .catch(done); + specHelper.setupApp().then((app) => { + request = app.request; + done(); + }); }); it('returns three feature toggles', done => { diff --git a/test/e2e/feature-archive-api.test.js b/test/e2e/feature-archive-api.test.js index fff8efcb3f..9e421cb0df 100644 --- a/test/e2e/feature-archive-api.test.js +++ b/test/e2e/feature-archive-api.test.js @@ -1,18 +1,21 @@ 'use strict'; const assert = require('assert'); -const specHelper = require('./test-helper'); -const request = specHelper.request; +const specHelper = require('./util/test-helper'); const stringify = function (o) { return JSON.stringify(o, null, ' '); }; +let request; + describe('The archive features api', () => { beforeEach(done => { - specHelper.db.resetAndSetup() - .then(done.bind(null, null)) - .catch(done); - }); + specHelper.setupApp().then((app) => { + request = app.request; + done(); + }); + }); + it('returns three archived toggles', done => { request diff --git a/test/e2e/router.test.js b/test/e2e/router.test.js index c5d853778c..894ea80a8b 100644 --- a/test/e2e/router.test.js +++ b/test/e2e/router.test.js @@ -1,9 +1,17 @@ 'use strict'; -const specHelper = require('./test-helper'); -const request = specHelper.request; +const specHelper = require('./util/test-helper'); + +let request; describe('The routes', () => { + beforeEach(done => { + specHelper.setupApp().then((app) => { + request = app.request; + done(); + }); + }); + describe('healthcheck', () => { it('returns health good', done => { request.get('/health') diff --git a/test/e2e/strategy-api.test.js b/test/e2e/strategy-api.test.js index cf6e904b20..3601c3eee6 100644 --- a/test/e2e/strategy-api.test.js +++ b/test/e2e/strategy-api.test.js @@ -1,13 +1,14 @@ 'use strict'; -const specHelper = require('./test-helper'); -const request = specHelper.request; +const specHelper = require('./util/test-helper'); +let request; describe('The strategy api', () => { beforeEach(done => { - specHelper.db.resetAndSetup() - .then(done.bind(null, null)) - .catch(done); + specHelper.setupApp().then((app) => { + request = app.request; + done(); + }); }); it('gets all strategies', done => { diff --git a/test/e2e/database-config.js b/test/e2e/util/database-config.js similarity index 100% rename from test/e2e/database-config.js rename to test/e2e/util/database-config.js diff --git a/test/e2e/test-helper.js b/test/e2e/util/test-helper.js similarity index 71% rename from test/e2e/test-helper.js rename to test/e2e/util/test-helper.js index f38ee0c145..11d185144f 100644 --- a/test/e2e/test-helper.js +++ b/test/e2e/util/test-helper.js @@ -2,30 +2,25 @@ process.env.NODE_ENV = 'test'; -// Mute migrator -require('db-migrate-shared').log.silence(true); - const BPromise = require('bluebird'); -let request = require('supertest'); -const migrator = require('../../migrator'); +let supertest = require('supertest'); const options = { databaseUri: require('./database-config').getDatabaseUri(), }; -const { createStores } = require('../../lib/db'); +const migrator = require('../../../migrator'); +const { createStores } = require('../../../lib/db'); -const stores = createStores(options); +process.env.DATABASE_URL = options.databaseUri -const app = require('../../app')({ - baseUriPath: '', - stores, +const createApp = migrator(options.databaseUri).then(() => { + const stores = createStores(options); + const app = require('../../../app')({stores}); + return { stores, request: supertest(app) }; }); -BPromise.promisifyAll(request); -request = request(app); - -function createStrategies () { +function createStrategies (stores) { return BPromise.map([ { name: 'default', @@ -42,7 +37,7 @@ function createStrategies () { ], strategy => stores.strategyStore._createStrategy(strategy)); } -function createFeatures () { +function createFeatures (stores) { return BPromise.map([ { name: 'featureX', @@ -106,29 +101,28 @@ function createFeatures () { ], feature => stores.featureToggleStore._createFeature(feature)); } -function destroyStrategies () { +function destroyStrategies (stores) { return stores.db('strategies').del(); } -function destroyFeatures () { +function destroyFeatures (stores) { return stores.db('features').del(); } -function resetDatabase () { - return BPromise.all([destroyStrategies(), destroyFeatures()]); +function resetDatabase (stores) { + return BPromise.all([destroyStrategies(stores), destroyFeatures(stores)]); } -function setupDatabase () { - return BPromise.all([migrator(options.databaseUri), createStrategies(), createFeatures()]); +function setupDatabase (stores) { + return BPromise.all([createStrategies(stores), createFeatures(stores)]); } module.exports = { - request, - db: { - reset: resetDatabase, - setup: setupDatabase, - resetAndSetup () { - return resetDatabase().then(setupDatabase); - }, - }, + setupApp () { + return createApp.then((app) => { + return resetDatabase(app.stores) + .then(() => setupDatabase(app.stores)) + .then(() => app); + }); + } };