mirror of https://github.com/pelias/api.git
Browse Source
This sanitiser can do a better job of determining when an invalid combination of sources and layers was specified, and produce helpful error messages.pull/407/head
Julian Simioni
9 years ago
5 changed files with 157 additions and 0 deletions
@ -0,0 +1,37 @@
|
||||
var _ = require( 'lodash' ); |
||||
var type_mapping = require( '../helper/type_mapping' ); |
||||
|
||||
/* |
||||
* This sanitiser depends on clean.layers and clean.sources |
||||
* so it has to be run after those sanitisers have been run |
||||
*/ |
||||
function sanitize( raw, clean ){ |
||||
var messages = { errors: [], warnings: [] }; |
||||
|
||||
var possible_errors = []; |
||||
var at_least_one_valid_combination = false; |
||||
|
||||
if (clean.layers && clean.sources) { |
||||
clean.sources.forEach(function(source) { |
||||
var layers_for_source = type_mapping.layers_by_source[source]; |
||||
clean.layers.forEach(function(layer) { |
||||
if (_.includes(layers_for_source, layer)) { |
||||
at_least_one_valid_combination = true; |
||||
} else { |
||||
var message = 'You have specified both the `sources` and `layers` ' + |
||||
'parameters in a combination that will return no results: the ' + |
||||
source + ' source has nothing in the ' + layer + ' layer'; |
||||
possible_errors.push(message); |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
if (!at_least_one_valid_combination) { |
||||
messages.errors = possible_errors; |
||||
} |
||||
} |
||||
|
||||
return messages; |
||||
} |
||||
|
||||
module.exports = sanitize; |
@ -0,0 +1,115 @@
|
||||
var sanitize = require('../../../sanitiser/_sources_and_layers'); |
||||
|
||||
var type_mapping = require('../../../helper/type_mapping'); |
||||
|
||||
module.exports.tests = {}; |
||||
|
||||
module.exports.tests.inactive = function(test, common) { |
||||
test('no source or layer specified', function(t) { |
||||
var raw = {}; |
||||
var clean = {}; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 0, 'should return no errors'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('only layers specified', function(t) { |
||||
var raw = {}; |
||||
var clean = { layers: ['venue'] }; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 0, 'should return no errors'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('only sources specified', function(t) { |
||||
var raw = {}; |
||||
var clean = { sources: ['openstreetmap'] }; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 0, 'should return no errors'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.tests.no_errors = function(test, common) { |
||||
test('valid combination', function(t) { |
||||
var raw = {}; |
||||
var clean = { sources: ['openstreetmap'], layers: ['venue'] }; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 0, 'should return no errors'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('valid combination because of multiple sources', function(t) { |
||||
var raw = {}; |
||||
var clean = { sources: ['openstreetmap', 'openaddresses'], layers: ['venue'] }; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 0, 'should return no errors'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('valid combination because of multiple layers', function(t) { |
||||
var raw = {}; |
||||
var clean = { sources: ['openaddresses'], layers: ['address', 'country'] }; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 0, 'should return no errors'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.tests.invalid_combination = function(test, common) { |
||||
test('address layer with wof', function(t) { |
||||
var raw = {}; |
||||
var clean = { sources: ['whosonfirst'], layers: ['address'] }; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 1, 'should return an error'); |
||||
t.equal(messages.errors[0], 'You have specified both the `sources` and `layers` ' + |
||||
'parameters in a combination that will return no results: the whosonfirst source has nothing in the address layer'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('admin layers with osm', function(t) { |
||||
var raw = {}; |
||||
var clean = { sources: ['openstreetmap'], layers: ['country', 'locality'] }; |
||||
|
||||
var messages = sanitize(raw, clean); |
||||
|
||||
t.equal(messages.errors.length, 2, 'should return an error'); |
||||
t.equal(messages.errors[0], 'You have specified both the `sources` and `layers` ' + |
||||
'parameters in a combination that will return no results: the openstreetmap source has nothing in the country layer'); |
||||
t.equal(messages.errors[1], 'You have specified both the `sources` and `layers` ' + |
||||
'parameters in a combination that will return no results: the openstreetmap source has nothing in the locality layer'); |
||||
t.equal(messages.warnings.length, 0, 'should return no warnings'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.all = function (tape, common) { |
||||
function test(name, testFunction) { |
||||
return tape('SANTIZE _sources_and_layers ' + name, testFunction); |
||||
} |
||||
|
||||
for( var testCase in module.exports.tests ){ |
||||
module.exports.tests[testCase](test, common); |
||||
} |
||||
}; |
Loading…
Reference in new issue