Browse Source

passed down peliasConfig.api schema to sanitizers

pull/928/head
Lily He 8 years ago
parent
commit
40ca17b886
  1. 6
      routes/v1.js
  2. 23
      sanitizer/_location_bias.js
  3. 30
      sanitizer/autocomplete.js
  4. 54
      sanitizer/search.js
  5. 51
      sanitizer/structured_geocoding.js
  6. 77
      test/unit/sanitizer/_location_bias.js
  7. 121
      test/unit/sanitizer/autocomplete.js
  8. 23
      test/unit/sanitizer/search.js
  9. 23
      test/unit/sanitizer/structured_geocoding.js

6
routes/v1.js

@ -129,7 +129,7 @@ function addRoutes(app, peliasConfig) {
controllers.mdToHTML(peliasConfig.api, './public/attribution.md') controllers.mdToHTML(peliasConfig.api, './public/attribution.md')
]), ]),
search: createRouter([ search: createRouter([
sanitizers.search.middleware, sanitizers.search.middleware(peliasConfig.api),
middleware.requestLanguage, middleware.requestLanguage,
middleware.calcSize(), middleware.calcSize(),
controllers.placeholder(placeholderService, placeholderShouldExecute), controllers.placeholder(placeholderService, placeholderShouldExecute),
@ -156,7 +156,7 @@ function addRoutes(app, peliasConfig) {
postProc.sendJSON postProc.sendJSON
]), ]),
structured: createRouter([ structured: createRouter([
sanitizers.structured_geocoding.middleware, sanitizers.structured_geocoding.middleware(peliasConfig.api),
middleware.requestLanguage, middleware.requestLanguage,
middleware.calcSize(), middleware.calcSize(),
controllers.search(peliasConfig.api, esclient, queries.structured_geocoding, not(hasResponseDataOrRequestErrors)), controllers.search(peliasConfig.api, esclient, queries.structured_geocoding, not(hasResponseDataOrRequestErrors)),
@ -177,7 +177,7 @@ function addRoutes(app, peliasConfig) {
postProc.sendJSON postProc.sendJSON
]), ]),
autocomplete: createRouter([ autocomplete: createRouter([
sanitizers.autocomplete.middleware, sanitizers.autocomplete.middleware(peliasConfig.api),
middleware.requestLanguage, middleware.requestLanguage,
controllers.search(peliasConfig.api, esclient, queries.autocomplete, not(hasResponseDataOrRequestErrors)), controllers.search(peliasConfig.api, esclient, queries.autocomplete, not(hasResponseDataOrRequestErrors)),
postProc.distances('focus.point.'), postProc.distances('focus.point.'),

23
sanitizer/_location_bias.js

@ -1,18 +1,21 @@
/* const _ = require('lodash');
/**
Set a focus.lat and focus.lon if specified in pelias config Set a focus.lat and focus.lon if specified in pelias config
* @param {object} defaultParameters property of pelias config
*/ */
var _ = require('lodash');
function setup(defaultParameters){ function setup(defaultParameters){
return function setLocationBias(req, res, next){
if (_.isUndefined(req.clean) || return function setLocationBias(raw, clean){
_.isUndefined(defaultParameters['focus.point.lat']) || if (!_.isUndefined(raw) &&
_.isUndefined(defaultParameters['focus.point.lon'])) { !_.isUndefined(defaultParameters['focus.point.lat']) &&
return next(); !_.isUndefined(defaultParameters['focus.point.lon'])) {
raw['focus.point.lat'] = defaultParameters['focus.point.lat'];
raw['focus.point.lon'] = defaultParameters['focus.point.lon'];
} }
req.clean['focus.point.lat'] = defaultParameters['focus.point.lat'];
req.clean['focus.point.lon'] = defaultParameters['focus.point.lon']; return { errors: [], warnings: [] };
next();
}; };
} }

30
sanitizer/autocomplete.js

@ -1,7 +1,9 @@
var type_mapping = require('../helper/type_mapping'); var type_mapping = require('../helper/type_mapping');
var sanitizeAll = require('../sanitizer/sanitizeAll');
var sanitizeAll = require('../sanitizer/sanitizeAll'), // middleware
sanitizers = { module.exports.middleware = (_api_pelias_config) => {
var sanitizers = {
singleScalarParameters: require('../sanitizer/_single_scalar_parameters'), singleScalarParameters: require('../sanitizer/_single_scalar_parameters'),
text: require('../sanitizer/_text_addressit'), text: require('../sanitizer/_text_addressit'),
tokenizer: require('../sanitizer/_tokenizer'), tokenizer: require('../sanitizer/_tokenizer'),
@ -11,25 +13,21 @@ var sanitizeAll = require('../sanitizer/sanitizeAll'),
// depends on the layers and sources sanitizers, must be run after them // depends on the layers and sources sanitizers, must be run after them
sources_and_layers: require('../sanitizer/_sources_and_layers'), sources_and_layers: require('../sanitizer/_sources_and_layers'),
private: require('../sanitizer/_flag_bool')('private', false), private: require('../sanitizer/_flag_bool')('private', false),
location_bias: require('../sanitizer/_location_bias'), location_bias: require('../sanitizer/_location_bias')(_api_pelias_config.defaultParameters),
geo_autocomplete: require('../sanitizer/_geo_autocomplete'), geo_autocomplete: require('../sanitizer/_geo_autocomplete'),
boundary_country: require('../sanitizer/_boundary_country'), boundary_country: require('../sanitizer/_boundary_country'),
categories: require('../sanitizer/_categories') categories: require('../sanitizer/_categories')
}; };
var sanitize = function(req, cb) { sanitizeAll(req, sanitizers, cb); }; var sanitize = function(req, cb) { sanitizeAll(req, sanitizers, cb); };
// export sanitize for testing
module.exports.sanitize = sanitize;
module.exports.sanitizer_list = sanitizers;
// middleware return function( req, res, next ){
module.exports.middleware = function( req, res, next ){ sanitize( req, function( err, clean ){
sanitize( req, function( err, clean ){ if( err ){
if( err ){ res.status(400); // 400 Bad Request
res.status(400); // 400 Bad Request return next(err);
return next(err); }
}
next(); next();
}); });
};
}; };

54
sanitizer/search.js

@ -1,31 +1,33 @@
var type_mapping = require('../helper/type_mapping'); var type_mapping = require('../helper/type_mapping');
var sanitizeAll = require('../sanitizer/sanitizeAll');
// middleware
module.exports.middleware = (_api_pelias_config) => {
var sanitizers = {
singleScalarParameters: require('../sanitizer/_single_scalar_parameters'),
quattroshapes_deprecation: require('../sanitizer/_deprecate_quattroshapes'),
text: require('../sanitizer/_text'),
iso2_to_iso3: require('../sanitizer/_iso2_to_iso3'),
city_name_standardizer: require('../sanitizer/_city_name_standardizer'),
size: require('../sanitizer/_size')(/* use defaults*/),
layers: require('../sanitizer/_targets')('layers', type_mapping.layer_mapping),
sources: require('../sanitizer/_targets')('sources', type_mapping.source_mapping),
// depends on the layers and sources sanitizers, must be run after them
sources_and_layers: require('../sanitizer/_sources_and_layers'),
private: require('../sanitizer/_flag_bool')('private', false),
location_bias: require('../sanitizer/_location_bias')(_api_pelias_config.defaultParameters),
geo_search: require('../sanitizer/_geo_search'),
boundary_country: require('../sanitizer/_boundary_country'),
categories: require('../sanitizer/_categories'),
// this can go away once geonames has been abrogated
geonames_warnings: require('../sanitizer/_geonames_warnings')
};
var sanitizeAll = require('../sanitizer/sanitizeAll'), var sanitize = function(req, cb) { sanitizeAll(req, sanitizers, cb); };
sanitizers = {
singleScalarParameters: require('../sanitizer/_single_scalar_parameters'),
quattroshapes_deprecation: require('../sanitizer/_deprecate_quattroshapes'),
text: require('../sanitizer/_text'),
iso2_to_iso3: require('../sanitizer/_iso2_to_iso3'),
city_name_standardizer: require('../sanitizer/_city_name_standardizer'),
size: require('../sanitizer/_size')(/* use defaults*/),
layers: require('../sanitizer/_targets')('layers', type_mapping.layer_mapping),
sources: require('../sanitizer/_targets')('sources', type_mapping.source_mapping),
// depends on the layers and sources sanitizers, must be run after them
sources_and_layers: require('../sanitizer/_sources_and_layers'),
private: require('../sanitizer/_flag_bool')('private', false),
location_bias: require('../sanitizer/_location_bias'),
geo_search: require('../sanitizer/_geo_search'),
boundary_country: require('../sanitizer/_boundary_country'),
categories: require('../sanitizer/_categories'),
// this can go away once geonames has been abrogated
geonames_warnings: require('../sanitizer/_geonames_warnings')
};
var sanitize = function(req, cb) { sanitizeAll(req, sanitizers, cb); }; return function( req, res, next ){
sanitize( req, function( err, clean ){
next();
});
};
// middleware
module.exports.middleware = function( req, res, next ){
sanitize( req, function( err, clean ){
next();
});
}; };

51
sanitizer/structured_geocoding.js

@ -1,29 +1,30 @@
var type_mapping = require('../helper/type_mapping'); var type_mapping = require('../helper/type_mapping');
var sanitizeAll = require('../sanitizer/sanitizeAll');
var sanitizeAll = require('../sanitizer/sanitizeAll'),
sanitizers = {
singleScalarParameters: require('../sanitizer/_single_scalar_parameters'),
quattroshapes_deprecation: require('../sanitizer/_deprecate_quattroshapes'),
synthesize_analysis: require('../sanitizer/_synthesize_analysis'),
iso2_to_iso3: require('../sanitizer/_iso2_to_iso3'),
city_name_standardizer: require('../sanitizer/_city_name_standardizer'),
size: require('../sanitizer/_size')(/* use defaults*/),
layers: require('../sanitizer/_targets')('layers', type_mapping.layer_mapping),
sources: require('../sanitizer/_targets')('sources', type_mapping.source_mapping),
// depends on the layers and sources sanitizers, must be run after them
sources_and_layers: require('../sanitizer/_sources_and_layers'),
private: require('../sanitizer/_flag_bool')('private', false),
location_bias: require('../sanitizer/_location_bias'),
geo_search: require('../sanitizer/_geo_search'),
boundary_country: require('../sanitizer/_boundary_country'),
categories: require('../sanitizer/_categories')
};
var sanitize = function(req, cb) { sanitizeAll(req, sanitizers, cb); };
// middleware // middleware
module.exports.middleware = function( req, res, next ){ module.exports.middleware = (_api_pelias_config) => {
sanitize( req, function( err, clean ){ var sanitizers = {
next(); singleScalarParameters: require('../sanitizer/_single_scalar_parameters'),
}); quattroshapes_deprecation: require('../sanitizer/_deprecate_quattroshapes'),
synthesize_analysis: require('../sanitizer/_synthesize_analysis'),
iso2_to_iso3: require('../sanitizer/_iso2_to_iso3'),
city_name_standardizer: require('../sanitizer/_city_name_standardizer'),
size: require('../sanitizer/_size')(/* use defaults*/),
layers: require('../sanitizer/_targets')('layers', type_mapping.layer_mapping),
sources: require('../sanitizer/_targets')('sources', type_mapping.source_mapping),
// depends on the layers and sources sanitizers, must be run after them
sources_and_layers: require('../sanitizer/_sources_and_layers'),
private: require('../sanitizer/_flag_bool')('private', false),
location_bias: require('../sanitizer/_location_bias')(_api_pelias_config.defaultParameters),
geo_search: require('../sanitizer/_geo_search'),
boundary_country: require('../sanitizer/_boundary_country'),
categories: require('../sanitizer/_categories')
};
var sanitize = function(req, cb) { sanitizeAll(req, sanitizers, cb); };
return function( req, res, next ){
sanitize( req, function( err, clean ){
next();
});
};
}; };

77
test/unit/sanitizer/_location_bias.js

@ -1,87 +1,70 @@
var setup = require('../../../sanitizer/_location_bias'); const setup = require('../../../sanitizer/_location_bias');
module.exports.tests = {}; module.exports.tests = {};
module.exports.tests.setLocationBias = function(test, common) { module.exports.tests.setLocationBias = function(test, common) {
test('set focus point', t => { test('set focus point', t => {
var defaultParameters = { // specify focus point latitude and longitude const defaultParameters = { // specify focus point latitude and longitude
'focus.point.lat': 12.12121212, 'focus.point.lat': 12.12121212,
'focus.point.lon': 21.21212121 'focus.point.lon': 21.21212121
}; };
var locationBias = setup(defaultParameters); const locationBias = setup(defaultParameters);
var req = { const raw = {};
clean: {} const expected = {
};
var expected = {
clean: {
'focus.point.lat': 12.12121212, 'focus.point.lat': 12.12121212,
'focus.point.lon': 21.21212121 'focus.point.lon': 21.21212121
}
}; };
locationBias(req, undefined, () => { locationBias(raw, undefined);
t.deepEqual(req, expected, 'focus point should be set'); t.deepEqual(raw, expected, 'focus point should be set');
t.end(); t.end();
});
}); });
test('undefined req.clean', t => { test('undefined raw', t => {
var defaultParameters = { const defaultParameters = {
'focus.point.lat': 12.12121212, 'focus.point.lat': 12.12121212,
'focus.point.lon': 21.21212121 'focus.point.lon': 21.21212121
}; };
var locationBias = setup(defaultParameters); const locationBias = setup(defaultParameters);
var req = {};
var expected = {};
locationBias(req, undefined, () => { locationBias(undefined, undefined);
t.deepEqual(req, expected, 'should be unmodified' ); t.deepEqual(undefined, undefined, 'should be unmodified' );
t.end(); t.end();
});
}); });
test('focusPointLat is undefined', t => { test('focusPointLat is undefined', t => {
var defaultParameters = { const defaultParameters = {
'focus.point.lon': 12.2121212 'focus.point.lon': 12.2121212
}; };
var locationBias = setup(defaultParameters); const locationBias = setup(defaultParameters);
var req = { const raw = {};
clean: {} const expected = {};
};
var expected = {
clean: {}
};
locationBias(req, undefined, () => { locationBias(raw, undefined);
t.deepEqual(req, expected, 'should be unmodified' ); t.deepEqual(raw, expected, 'should be unmodified' );
t.end(); t.end();
});
}); });
test('focusPointLon is undefined', t => { test('focusPointLon is undefined', t => {
var defaultParameters = { const defaultParameters = {
'focus.point.lat': 12.2121212 'focus.point.lat': 12.2121212
}; };
var locationBias = setup(defaultParameters); const locationBias = setup(defaultParameters);
var req = { const raw = {};
clean: {} const expected = {};
};
var expected = {
clean: {}
};
locationBias(req, undefined, () => { locationBias(raw, undefined);
t.deepEqual(req, expected, 'should be unmodified' ); t.deepEqual(raw, expected, 'should be unmodified' );
t.end(); t.end();
});
}); });
}; };
module.exports.all = function (tape, common) { module.exports.all = (tape, common) => {
function test(name, testFunction) { function test(name, testFunction) {
return tape('[middleware] locationBias: ' + name, testFunction); return tape(`SANITIZE _location_bias: ${name}`, testFunction);
} }
for( var testCase in module.exports.tests ){ for( var testCase in module.exports.tests ){

121
test/unit/sanitizer/autocomplete.js

@ -1,21 +1,126 @@
var autocomplete = require('../../../sanitizer/autocomplete'); const proxyquire = require('proxyquire').noCallThru();
const _ = require('lodash');
module.exports.tests = {}; module.exports.tests = {};
module.exports.tests.sanitizers = function(test, common) { module.exports.tests.sanitizers = function(test, common) {
test('check sanitizer list', function (t) { test('verify that all sanitizers were called as expected', function(t) {
var expected = [ var called_sanitizers = [];
'singleScalarParameters', 'text', 'tokenizer', 'size', 'layers', 'sources',
'sources_and_layers', 'private', 'location_bias', 'geo_autocomplete', 'boundary_country', 'categories' var autocomplete = proxyquire('../../../sanitizer/autocomplete', {
'../sanitizer/_single_scalar_parameters': () => {
called_sanitizers.push('_single_scalar_parameters');
return { errors: [], warnings: [] };
},
'../sanitizer/_text_addressit': () => {
called_sanitizers.push('_text_addressit');
return { errors: [], warnings: [] };
},
'../sanitizer/_tokenizer': () => {
called_sanitizers.push('_tokenizer');
return { errors: [], warnings: [] };
},
'../sanitizer/_size': function() {
if (_.isEqual(_.values(arguments), [10, 10, 10])) {
return () => {
called_sanitizers.push('_size');
return { errors: [], warnings: [] };
};
} else {
throw new Error('incorrect parameters passed to _size');
}
},
'../sanitizer/_targets': (type) => {
if (['layers', 'sources'].indexOf(type) !== -1) {
return () => {
called_sanitizers.push(`_targets/${type}`);
return { errors: [], warnings: [] };
};
}
else {
throw new Error('incorrect parameters passed to _targets');
}
},
'../sanitizer/_sources_and_layers': () => {
called_sanitizers.push('_sources_and_layers');
return { errors: [], warnings: [] };
},
'../sanitizer/_flag_bool': function() {
if (arguments[0] === 'private' && arguments[1] === false) {
return () => {
called_sanitizers.push('_flag_bool');
return { errors: [], warnings: [] };
};
}
else {
throw new Error('incorrect parameters passed to _flag_bool');
}
},
'../sanitizer/_location_bias': (defaultParameters) => {
if (defaultParameters.key === 'value'){
return () => {
called_sanitizers.push('_location_bias');
return { errors: [], warnings: [] };
};
} else {
throw new Error('incorrect parameter passed to _location_bias');
}
},
'../sanitizer/_geo_autocomplete': () => {
called_sanitizers.push('_geo_autocomplete');
return { errors: [], warnings: [] };
},
'../sanitizer/_boundary_country': () => {
called_sanitizers.push('_boundary_country');
return { errors: [], warnings: [] };
},
'../sanitizer/_categories': () => {
called_sanitizers.push('_categories');
return { errors: [], warnings: [] };
},
});
const expected_sanitizers = [
'_single_scalar_parameters',
'_text_addressit',
'_tokenizer',
'_size',
'_targets/layers',
'_targets/sources',
'_sources_and_layers',
'_flag_bool',
'_location_bias',
'_geo_autocomplete',
'_boundary_country',
'_categories'
]; ];
t.deepEqual(Object.keys(autocomplete.sanitizer_list), expected);
t.end(); const req = {};
const res = {};
const middleware = autocomplete.middleware({
defaultParameters: {
key: 'value'
}
});
middleware(req, res, () => {
t.deepEquals(called_sanitizers, expected_sanitizers);
t.end();
});
}); });
}; };
module.exports.all = function (tape, common) { module.exports.all = function (tape, common) {
function test(name, testFunction) { function test(name, testFunction) {
return tape('SANTIZE /autocomplete ' + name, testFunction); return tape('SANITIZE /autocomplete ' + name, testFunction);
} }
for( var testCase in module.exports.tests ){ for( var testCase in module.exports.tests ){

23
test/unit/sanitizer/search.js

@ -88,9 +88,15 @@ module.exports.tests.sanitize = (test, common) => {
called_sanitizers.push('_geonames_warnings'); called_sanitizers.push('_geonames_warnings');
return { errors: [], warnings: [] }; return { errors: [], warnings: [] };
}, },
'../sanitizer/_location_bias': () => { '../sanitizer/_location_bias': (defaultParameters) => {
called_sanitizers.push('_location_bias'); if (defaultParameters.key === 'value'){
return { errors: [], warnings: [] }; return () => {
called_sanitizers.push('_location_bias');
return { errors: [], warnings: [] };
};
} else {
throw new Error('incorrect parameter passed to _location_bias');
}
} }
}); });
@ -116,17 +122,24 @@ module.exports.tests.sanitize = (test, common) => {
const req = {}; const req = {};
const res = {}; const res = {};
search.middleware(req, res, () => { const middleware = search.middleware({
defaultParameters: {
key: 'value'
}
});
middleware(req, res, () => {
t.deepEquals(called_sanitizers, expected_sanitizers); t.deepEquals(called_sanitizers, expected_sanitizers);
t.end(); t.end();
}); });
}); });
}; };
module.exports.all = (tape, common) => { module.exports.all = (tape, common) => {
function test(name, testFunction) { function test(name, testFunction) {
return tape(`SANTIZE /search ${name}`, testFunction); return tape(`SANITIZE /search ${name}`, testFunction);
} }
for( const testCase in module.exports.tests ){ for( const testCase in module.exports.tests ){

23
test/unit/sanitizer/structured_geocoding.js

@ -83,9 +83,15 @@ module.exports.tests.sanitize = function(test, common) {
called_sanitizers.push('_categories'); called_sanitizers.push('_categories');
return { errors: [], warnings: [] }; return { errors: [], warnings: [] };
}, },
'../sanitizer/_location_bias': () => { '../sanitizer/_location_bias': function (defaultParameters) {
called_sanitizers.push('_location_bias'); if (defaultParameters.key === 'value'){
return { errors: [], warnings: [] }; return () => {
called_sanitizers.push('_location_bias');
return { errors: [], warnings: [] };
};
} else {
throw new Error('incorrect parameter passed to _location_bias');
}
} }
}); });
@ -109,17 +115,24 @@ module.exports.tests.sanitize = function(test, common) {
var req = {}; var req = {};
var res = {}; var res = {};
search.middleware(req, res, function(){ const middleware = search.middleware({
defaultParameters: {
key: 'value'
}
});
middleware(req, res, function(){
t.deepEquals(called_sanitizers, expected_sanitizers); t.deepEquals(called_sanitizers, expected_sanitizers);
t.end(); t.end();
}); });
}); });
}; };
module.exports.all = function (tape, common) { module.exports.all = function (tape, common) {
function test(name, testFunction) { function test(name, testFunction) {
return tape('SANTIZE /structured ' + name, testFunction); return tape('SANITIZE /structured ' + name, testFunction);
} }
for( var testCase in module.exports.tests ){ for( var testCase in module.exports.tests ){

Loading…
Cancel
Save