mirror of https://github.com/pelias/api.git
Peter Johnson
10 years ago
10 changed files with 171 additions and 53 deletions
@ -1,16 +1,22 @@
|
||||
|
||||
var pkg = require('../package'); |
||||
|
||||
function controller( req, res, next ){ |
||||
function setup(){ |
||||
|
||||
// stats
|
||||
res.json({ |
||||
name: pkg.name, |
||||
version: { |
||||
number: pkg.version |
||||
} |
||||
}); |
||||
function controller( req, res, next ){ |
||||
|
||||
// stats
|
||||
res.json({ |
||||
name: pkg.name, |
||||
version: { |
||||
number: pkg.version |
||||
} |
||||
}); |
||||
|
||||
} |
||||
|
||||
return controller; |
||||
|
||||
} |
||||
|
||||
module.exports = controller; |
||||
module.exports = setup; |
@ -1,35 +1,41 @@
|
||||
|
||||
var query = require('../query/suggest'), |
||||
backend = require('../src/backend'); |
||||
function setup( backend, query ){ |
||||
|
||||
function controller( req, res, next ){ |
||||
// allow overriding of dependencies
|
||||
backend = backend || require('../src/backend'); |
||||
query = query || require('../query/suggest'); |
||||
|
||||
// backend command
|
||||
var cmd = { |
||||
index: 'pelias', |
||||
body: query( req.clean ) |
||||
}; |
||||
function controller( req, res, next ){ |
||||
|
||||
// query backend
|
||||
backend().client.suggest( cmd, function( err, data ){ |
||||
// backend command
|
||||
var cmd = { |
||||
index: 'pelias', |
||||
body: query( req.clean ) |
||||
}; |
||||
|
||||
var docs = []; |
||||
// query backend
|
||||
backend().client.suggest( cmd, function( err, data ){ |
||||
|
||||
// handle backend errors
|
||||
if( err ){ return next( err ); } |
||||
var docs = []; |
||||
|
||||
// map response to a valid FeatureCollection
|
||||
if( data && Array.isArray( data.pelias ) && data.pelias.length ){ |
||||
docs = data['pelias'][0].options || []; |
||||
} |
||||
// handle backend errors
|
||||
if( err ){ return next( err ); } |
||||
|
||||
// respond
|
||||
return res.status(200).json({ |
||||
date: new Date().getTime(), |
||||
body: docs |
||||
// map response to a valid FeatureCollection
|
||||
if( data && Array.isArray( data.pelias ) && data.pelias.length ){ |
||||
docs = data['pelias'][0].options || []; |
||||
} |
||||
|
||||
// respond
|
||||
return res.status(200).json({ |
||||
date: new Date().getTime(), |
||||
body: docs |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
} |
||||
|
||||
return controller; |
||||
} |
||||
|
||||
module.exports = controller; |
||||
module.exports = setup; |
@ -1,9 +1,17 @@
|
||||
|
||||
/** cluster webserver across all cores **/ |
||||
|
||||
var cluster = require('cluster'), |
||||
app = require('./app'); |
||||
app = require('./app'), |
||||
multicore = false, |
||||
port = ( process.env.PORT || 3100 ); |
||||
|
||||
cluster(app) |
||||
.use(cluster.stats()) |
||||
.listen( process.env.PORT || 3100 ); |
||||
/** cluster webserver across all cores **/ |
||||
if( multicore ){ |
||||
// @todo: not finished yet
|
||||
// cluster(app)
|
||||
// .use(cluster.stats())
|
||||
// .listen( process.env.PORT || 3100 );
|
||||
} |
||||
else { |
||||
console.log( 'listening on ' + port ); |
||||
app.listen( process.env.PORT || 3100 ); |
||||
} |
@ -0,0 +1,64 @@
|
||||
|
||||
var setup = require('../../../controller/suggest'), |
||||
mockBackend = require('../mock/backend'), |
||||
mockQuery = require('../mock/query'); |
||||
|
||||
module.exports.tests = {}; |
||||
|
||||
module.exports.tests.interface = function(test, common) { |
||||
test('valid interface', function(t) { |
||||
t.equal(typeof setup, 'function', 'setup is a function'); |
||||
t.equal(typeof setup(), 'function', 'setup returns a controller'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
// functionally test controller (backend success)
|
||||
module.exports.tests.functional_success = function(test, common) { |
||||
test('functional test', function(t) { |
||||
var backend = mockBackend( 'client/suggest/ok/1', function( cmd ){ |
||||
t.deepEqual(cmd, { body: { a: 'b' }, index: 'pelias' }, 'correct backend command'); |
||||
}); |
||||
var controller = setup( backend, mockQuery() ); |
||||
var res = { |
||||
status: function( code ){ |
||||
t.equal(code, 200, 'status set'); |
||||
return res; |
||||
}, |
||||
json: function( json ){ |
||||
t.equal(typeof json, 'object', 'returns json'); |
||||
t.equal(typeof json.date, 'number', 'date set'); |
||||
t.true(Array.isArray(json.body), 'body is array'); |
||||
t.deepEqual(json.body, [ { value: 1 }, { value: 2 } ], 'values correctly mapped'); |
||||
t.end(); |
||||
} |
||||
}; |
||||
controller( { clean: { a: 'b' } }, res ); |
||||
}); |
||||
}; |
||||
|
||||
// functionally test controller (backend failure)
|
||||
module.exports.tests.functional_failure = function(test, common) { |
||||
test('functional test', function(t) { |
||||
var backend = mockBackend( 'client/suggest/fail/1', function( cmd ){ |
||||
t.deepEqual(cmd, { body: { a: 'b' }, index: 'pelias' }, 'correct backend command'); |
||||
}); |
||||
var controller = setup( backend, mockQuery() ); |
||||
var next = function( message ){ |
||||
t.equal(message,'a backend error occurred','error passed to errorHandler'); |
||||
t.end(); |
||||
}; |
||||
controller( { clean: { a: 'b' } }, undefined, next ); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.all = function (tape, common) { |
||||
|
||||
function test(name, testFunction) { |
||||
return tape('GET /suggest ' + name, testFunction); |
||||
} |
||||
|
||||
for( var testCase in module.exports.tests ){ |
||||
module.exports.tests[testCase](test, common); |
||||
} |
||||
}; |
@ -0,0 +1,28 @@
|
||||
|
||||
var responses = {}; |
||||
responses['client/suggest/ok/1'] = function( cmd, cb ){ |
||||
return cb( undefined, suggestEnvelope([ { value: 1 }, { value: 2 } ]) ); |
||||
}; |
||||
responses['client/suggest/fail/1'] = function( cmd, cb ){ |
||||
return cb( 'a backend error occurred' ); |
||||
}; |
||||
|
||||
function setup( key, cmdCb ){ |
||||
function backend( a, b ){ |
||||
return { |
||||
client: { |
||||
suggest: function( cmd, cb ){ |
||||
if( 'function' === typeof cmdCb ){ cmdCb( cmd ); } |
||||
return responses[key].apply( this, arguments ); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
return backend; |
||||
} |
||||
|
||||
function suggestEnvelope( options ){ |
||||
return { pelias: [{ options: options }]}; |
||||
} |
||||
|
||||
module.exports = setup; |
@ -0,0 +1,10 @@
|
||||
|
||||
function setup(){ |
||||
return query; |
||||
} |
||||
|
||||
function query( clean ){ |
||||
return clean; |
||||
} |
||||
|
||||
module.exports = setup; |
Loading…
Reference in new issue