var fs = require('fs'), tmp = require('tmp'), setup = require('../../../middleware/interpolate'); // load middleware using the default pelias config var load = function(){ // adapter is driven by config var tmpfile = tmp.tmpNameSync({ postfix: '.json' }); fs.writeFileSync( tmpfile, '{}', { encoding: 'utf8' } ); process.env.PELIAS_CONFIG = tmpfile; var middleware = setup(); delete process.env.PELIAS_CONFIG; return middleware; }; module.exports.tests = {}; module.exports.tests.interface = function(test, common) { test('valid interface', function(t) { var middleware = load(); t.equal(typeof middleware, 'function', 'middleware is a function'); t.equal(middleware.length, 3, 'middleware is a function'); t.end(); }); }; module.exports.tests.isAddressQuery = function(test, common) { test('invalid address query - no parsed text', function(t) { var req = { clean: {} }; var middleware = load(); middleware(req, null, t.end); }); test('invalid address query - no number', function(t) { var req = { clean: { parsed_text: { street: 'sesame st' }} }; var middleware = load(); middleware(req, null, t.end); }); test('invalid address query - no street', function(t) { var req = { clean: { parsed_text: { number: '1', }} }; var middleware = load(); middleware(req, null, t.end); }); }; // test results are correctly mapped to the transport module.exports.tests.map = function(test, common) { test('documents mapped to transport: no hits', function(t) { var req = { clean: { parsed_text: { number: '1', street: 'sesame st' }} }; var res = { data: [] }; var middleware = load(); middleware(req, res, function(){ t.deepEqual( res, { data: [] } ); t.end(); }); }); test('documents mapped to transport: no street layer hits', function(t) { var req = { clean: { parsed_text: { number: '1', street: 'sesame st' }} }; var res = { data: [{ layer: 'foo' }] }; var middleware = load(); middleware(req, res, function(){ t.deepEqual( res, { data: [{ layer: 'foo' }] } ); t.end(); }); }); }; // check the service is called and response mapped correctly module.exports.tests.miss = function(test, common) { test('miss', function(t) { var req = { clean: { parsed_text: { number: '1', street: 'sesame st' }} }; var res = { data: [ { layer: 'street', center_point: { lat: 1, lon: 1 }, address_parts: { street: 'sesame rd' }, name: { default: 'example' } } ]}; var middleware = load(); // mock out the transport middleware.transport.query = function mock( coord, number, street, cb ){ t.deepEqual( coord, res.data[0].center_point ); t.deepEqual( number, req.clean.parsed_text.number ); t.deepEqual( street, res.data[0].address_parts.street ); t.equal( typeof cb, 'function' ); cb( 'error' ); }; middleware(req, res, function(){ t.deepEqual( res, { data: [ { layer: 'street', center_point: { lat: 1, lon: 1 }, address_parts: { street: 'sesame rd' }, name: { default: 'example' } } ]}); t.end(); }); }); }; // check the service is called and response mapped correctly module.exports.tests.hit = function(test, common) { test('hit', function(t) { var req = { clean: { parsed_text: { number: '1', street: 'sesame st' }} }; var res = { data: [ { layer: 'street', center_point: { lat: 1, lon: 1 }, address_parts: { street: 'sesame rd' }, name: { default: 'street name' }, source_id: '123456' } ]}; var middleware = load(); // mock out the transport middleware.transport.query = function mock( coord, number, street, cb ){ t.deepEqual( coord, res.data[0].center_point ); t.deepEqual( number, req.clean.parsed_text.number ); t.deepEqual( street, res.data[0].address_parts.street ); t.equal( typeof cb, 'function' ); cb( null, { properties: { number: '100A', source: 'OSM', source_id: 'way:111111', lat: 22.2, lon: -33.3, } }); }; middleware(req, res, function(){ t.deepEqual( res, { data: [ { layer: 'address', match_type: 'interpolated', center_point: { lat: 22.2, lon: -33.3 }, address_parts: { street: 'sesame rd', number: '100A' }, name: { default: '100A street name' }, source: 'openstreetmap', source_id: 'way:111111' } ]}); t.end(); }); }); }; // check the service is called and response mapped correctly module.exports.tests.hit = function(test, common) { test('hit', function(t) { var req = { clean: { parsed_text: { number: '1', street: 'sesame st' }} }; var res = { data: [ { layer: 'street', center_point: { lat: 1, lon: 1 }, address_parts: { street: 'sesame rd' }, name: { default: 'street name' }, source_id: '123456' }, { layer: 'street', center_point: { lat: 2, lon: 2 }, address_parts: { street: 'sesame rd' }, name: { default: 'street name' }, source_id: '654321' } ]}; var middleware = load(); // mock out the transport middleware.transport.query = function mock(coord, number, street, cb) { if (coord.lat === 2) { t.deepEqual(coord, res.data[1].center_point); t.deepEqual(number, req.clean.parsed_text.number); t.deepEqual(street, res.data[1].address_parts.street); t.equal(typeof cb, 'function'); return cb(null, { properties: { number: '100A', source: 'OSM', source_id: 'way:111111', lat: 22.2, lon: -33.3, } }); } else { return cb('miss'); } }; middleware(req, res, function(){ t.deepEqual( res, { data: [ { layer: 'address', match_type: 'interpolated', center_point: { lat: 22.2, lon: -33.3 }, address_parts: { street: 'sesame rd', number: '100A' }, name: { default: '100A street name' }, source: 'openstreetmap', source_id: 'way:111111' }, { layer: 'street', center_point: { lat: 1, lon: 1 }, address_parts: { street: 'sesame rd' }, name: { default: 'street name' }, source_id: '123456' } ]}); t.end(); }); }); }; module.exports.all = function (tape, common) { function test(name, testFunction) { return tape('[middleware] interpolate: ' + name, testFunction); } for( var testCase in module.exports.tests ){ module.exports.tests[testCase](test, common); } };