var fs = require('fs'), tmp = require('tmp'), setup = require('../../../middleware/changeLanguage'); const proxyquire = require('proxyquire').noCallThru(); // 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.isLanguageChangeRequired = function(test, common) { test('invalid query - null req/res', function(t) { var middleware = load(); middleware(null, null, t.end); }); test('invalid query - no results', function(t) { var req = { language: { iso6393: 'spa' } }; var res = {}; var middleware = load(); middleware(req, res, function(){ t.deepEqual( req, { language: { iso6393: 'spa' } } ); t.deepEqual( res, {} ); t.end(); }); }); test('invalid query - empty results', function(t) { var req = { language: { iso6393: 'spa' } }; var res = { data: [] }; var middleware = load(); middleware(req, res, function(){ t.deepEqual( req, { language: { iso6393: 'spa' } } ); t.deepEqual( res, { data: [] } ); t.end(); }); }); test('invalid query - no target language', function(t) { var req = {}; var res = { data: [] }; var middleware = load(); middleware(req, res, function(){ t.deepEqual( req, {} ); t.deepEqual( res, { data: [] } ); t.end(); }); }); }; // check the service is called and response mapped correctly module.exports.tests.miss = function(test, common) { test('miss', function(t) { var req = { language: { iso6393: 'spa' } }; var res = { data: [ { layer: 'locality', name: { default: 'London' }, parent: { locality_id: [ 101750367 ], locality: [ 'London' ] } }, { layer: 'example', name: { default: 'London' }, parent: { locality_id: [ 101735809 ], locaity: [ 'London' ] } } ]}; var middleware = load(); // mock out the transport middleware.transport.query = function mock( ids, cb ){ t.deepEqual( ids, [ '101735809', '101750367' ] ); t.equal( typeof cb, 'function' ); cb( 'error' ); }; middleware(req, res, function(){ t.deepEqual( res, { data: [ { layer: 'locality', name: { default: 'London' }, parent: { locality_id: [ 101750367 ], locality: [ 'London' ] } }, { layer: 'example', name: { default: 'London' }, parent: { locality_id: [ 101735809 ], locaity: [ 'London' ] } } ]}); t.end(); }); }); }; // check the service is called and response mapped correctly module.exports.tests.hit = function(test, common) { test('hit', function(t) { var req = { language: { iso6393: 'spa' } }; var res = { data: [ { layer: 'locality', name: { default: 'London' }, parent: { locality_id: [ 101750367 ], locality: [ 'London' ] } }, { layer: 'example', name: { default: 'London' }, parent: { locality_id: [ 101735809 ], locality: [ 'London' ] } } ]}; var middleware = load(); // mock out the transport middleware.transport.query = function mock( ids, cb ){ t.deepEqual( ids, [ '101735809', '101750367' ] ); t.equal( typeof cb, 'function' ); cb( null, { '101750367': { 'names': { 'default':['London'], 'chi':['倫敦'], 'spa':['Londres'], 'eng':['London'], 'hin':['लंदन'], 'ara':['لندن'], 'por':['Londres'], 'ben':['লন্ডন'], 'rus':['Лондон'], 'jpn':['ロンドン'], 'kor':['런던'] } }, '101735809': { 'names':{ 'default':['London'], 'eng':['London'] } } }); }; middleware(req, res, function(){ t.deepEqual( res, { data: [ { layer: 'locality', name: { default: 'Londres' }, parent: { locality_id: [ 101750367 ], locality: [ 'Londres' ] } }, { layer: 'example', name: { default: 'London' }, parent: { locality_id: [ 101735809 ], locality: [ 'London' ] } } ]}); t.end(); }); }); test('empty array name translation should not change the value', t => { t.plan(2); const req = { language: { iso6393: 'ISO3 value' } }; const res = { data: [ { layer: 'locality', name: { default: 'original name' }, parent: { locality_id: [ 123 ], locality: [ 'original name' ] } } ] }; const changeLanguage = proxyquire('../../../middleware/changeLanguage', { '../service/language': { findById: () => ({ query: (ids, callback) => { t.deepEquals(ids, ['123']); callback(null, { '123': { 'names': { 'ISO3 value':[] } } }); } }) } })(); changeLanguage(req, res, () => { t.deepEqual( res, { data: [ { layer: 'locality', name: { default: 'original name' }, parent: { locality_id: [ 123 ], locality: [ 'original name' ] } } ]}); }); }); }; module.exports.all = function (tape, common) { function test(name, testFunction) { return tape('[middleware] changeLanguage: ' + name, testFunction); } for( var testCase in module.exports.tests ){ module.exports.tests[testCase](test, common); } };