mirror of https://github.com/pelias/api.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
694 lines
16 KiB
694 lines
16 KiB
const geojsonify = require('../../../helper/geojsonify'); |
|
|
|
const proxyquire = require('proxyquire').noCallThru(); |
|
|
|
module.exports.tests = {}; |
|
|
|
module.exports.tests.interface = function(test, common) { |
|
test('valid interface', function(t) { |
|
t.equal(typeof geojsonify, 'function', 'geojsonify is a function'); |
|
t.equal(geojsonify.length, 2, 'accepts x arguments'); |
|
t.end(); |
|
}); |
|
}; |
|
|
|
// ref: https://github.com/pelias/pelias/issues/84 |
|
module.exports.tests.earth = function(test, common) { |
|
test('earth', function(t) { |
|
var earth = [{ |
|
'_type': 'geoname', |
|
'_id': '6295630', |
|
'source': 'whosonfirst', |
|
'layer': 'continent', |
|
'name': { |
|
'default': 'Earth' |
|
}, |
|
'center_point': { |
|
'lon': 0, |
|
'lat': 0 |
|
} |
|
}]; |
|
|
|
t.doesNotThrow(function(){ |
|
geojsonify( {}, earth ); |
|
}); |
|
t.end(); |
|
}); |
|
|
|
}; |
|
|
|
module.exports.tests.all = (test, common) => { |
|
test('bounding_box should be calculated using points when avaiable', t => { |
|
const input = [ |
|
{ |
|
_id: 'id 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
layer: 'layer 1', |
|
name: { |
|
default: 'name 1', |
|
}, |
|
center_point: { |
|
lat: 12.121212, |
|
lon: 21.212121 |
|
} |
|
}, |
|
{ |
|
_id: 'id 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
layer: 'layer 2', |
|
name: { |
|
default: 'name 2', |
|
}, |
|
center_point: { |
|
lat: 13.131313, |
|
lon: 31.313131 |
|
} |
|
} |
|
]; |
|
|
|
const geojsonify = proxyquire('../../../helper/geojsonify', { |
|
'./geojsonify_place_details': (params, source, dst) => { |
|
if (source._id === 'id 1') { |
|
return { |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
}; |
|
} else if (source._id === 'id 2') { |
|
return { |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
}; |
|
} |
|
|
|
} |
|
}); |
|
|
|
const actual = geojsonify({}, input); |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [ |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 21.212121, 12.121212 ] |
|
}, |
|
properties: { |
|
id: 'id 1', |
|
gid: 'source 1:layer 1:id 1', |
|
layer: 'layer 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
name: 'name 1', |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
} |
|
}, |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 31.313131, 13.131313 ] |
|
}, |
|
properties: { |
|
id: 'id 2', |
|
gid: 'source 2:layer 2:id 2', |
|
layer: 'layer 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
name: 'name 2', |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
} |
|
} |
|
], |
|
bbox: [21.212121, 12.121212, 31.313131, 13.131313] |
|
}; |
|
|
|
t.deepEquals(actual, expected); |
|
t.end(); |
|
|
|
}); |
|
|
|
test('bounding_box should be calculated using polygons when avaiable', t => { |
|
const input = [ |
|
{ |
|
_id: 'id 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
layer: 'layer 1', |
|
name: { |
|
default: 'name 1', |
|
}, |
|
bounding_box: { |
|
min_lon: 1, |
|
min_lat: 1, |
|
max_lon: 2, |
|
max_lat: 2 |
|
}, |
|
center_point: { |
|
lat: 12.121212, |
|
lon: 21.212121 |
|
} |
|
}, |
|
{ |
|
_id: 'id 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
layer: 'layer 2', |
|
name: { |
|
default: 'name 2', |
|
}, |
|
bounding_box: { |
|
min_lon: -3, |
|
min_lat: -3, |
|
max_lon: -1, |
|
max_lat: -1 |
|
}, |
|
center_point: { |
|
lat: 13.131313, |
|
lon: 31.313131 |
|
} |
|
} |
|
]; |
|
|
|
const geojsonify = proxyquire('../../../helper/geojsonify', { |
|
'./geojsonify_place_details': (params, source, dst) => { |
|
if (source._id === 'id 1') { |
|
return { |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
}; |
|
} else if (source._id === 'id 2') { |
|
return { |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
}; |
|
} |
|
|
|
} |
|
}); |
|
|
|
const actual = geojsonify({}, input); |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [ |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 21.212121, 12.121212 ] |
|
}, |
|
properties: { |
|
id: 'id 1', |
|
gid: 'source 1:layer 1:id 1', |
|
layer: 'layer 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
name: 'name 1', |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
}, |
|
bbox: [ 1, 1, 2, 2 ] |
|
}, |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 31.313131, 13.131313 ] |
|
}, |
|
properties: { |
|
id: 'id 2', |
|
gid: 'source 2:layer 2:id 2', |
|
layer: 'layer 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
name: 'name 2', |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
}, |
|
bbox: [ -3, -3, -1, -1 ] |
|
} |
|
], |
|
bbox: [ -3, -3, 2, 2 ] |
|
}; |
|
|
|
t.deepEquals(actual, expected); |
|
t.end(); |
|
|
|
}); |
|
|
|
test('bounding_box should be calculated using polygons AND points when avaiable', t => { |
|
const input = [ |
|
{ |
|
_id: 'id 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
layer: 'layer 1', |
|
name: { |
|
default: 'name 1', |
|
}, |
|
center_point: { |
|
lat: 12.121212, |
|
lon: 21.212121 |
|
} |
|
}, |
|
{ |
|
_id: 'id 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
layer: 'layer 2', |
|
name: { |
|
default: 'name 2', |
|
}, |
|
bounding_box: { |
|
min_lon: -3, |
|
min_lat: -3, |
|
max_lon: -1, |
|
max_lat: -1 |
|
}, |
|
center_point: { |
|
lat: 13.131313, |
|
lon: 31.313131 |
|
} |
|
} |
|
]; |
|
|
|
const geojsonify = proxyquire('../../../helper/geojsonify', { |
|
'./geojsonify_place_details': (params, source, dst) => { |
|
if (source._id === 'id 1') { |
|
return { |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
}; |
|
} else if (source._id === 'id 2') { |
|
return { |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
}; |
|
} |
|
|
|
} |
|
}); |
|
|
|
const actual = geojsonify({}, input); |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [ |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 21.212121, 12.121212 ] |
|
}, |
|
properties: { |
|
id: 'id 1', |
|
gid: 'source 1:layer 1:id 1', |
|
layer: 'layer 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
name: 'name 1', |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
} |
|
}, |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 31.313131, 13.131313 ] |
|
}, |
|
properties: { |
|
id: 'id 2', |
|
gid: 'source 2:layer 2:id 2', |
|
layer: 'layer 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
name: 'name 2', |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
}, |
|
bbox: [ -3, -3, -1, -1 ] |
|
} |
|
], |
|
bbox: [ -3, -3, 21.212121, 12.121212 ] |
|
}; |
|
|
|
t.deepEquals(actual, expected); |
|
t.end(); |
|
|
|
}); |
|
|
|
}; |
|
|
|
module.exports.tests.non_optimal_conditions = (test, common) => { |
|
test('null/undefined places should log warnings and be ignored', t => { |
|
const logger = require('pelias-mock-logger')(); |
|
|
|
const input = [ |
|
null, |
|
undefined, |
|
{ |
|
_id: 'id 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
layer: 'layer 1', |
|
name: { |
|
default: 'name 1', |
|
}, |
|
center_point: { |
|
lat: 12.121212, |
|
lon: 21.212121 |
|
} |
|
} |
|
]; |
|
|
|
const geojsonify = proxyquire('../../../helper/geojsonify', { |
|
'./geojsonify_place_details': (params, source, dst) => { |
|
if (source._id === 'id 1') { |
|
return { |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
}; |
|
} |
|
}, |
|
'pelias-logger': logger |
|
}); |
|
|
|
const actual = geojsonify({}, input); |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [ |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 21.212121, 12.121212 ] |
|
}, |
|
properties: { |
|
id: 'id 1', |
|
gid: 'source 1:layer 1:id 1', |
|
layer: 'layer 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
name: 'name 1', |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
} |
|
} |
|
], |
|
bbox: [21.212121, 12.121212, 21.212121, 12.121212] |
|
}; |
|
|
|
t.deepEquals(actual, expected); |
|
t.ok(logger.isWarnMessage('No doc or center_point property')); |
|
t.end(); |
|
|
|
}); |
|
|
|
test('places w/o center_point should log warnings and be ignored', t => { |
|
const logger = require('pelias-mock-logger')(); |
|
|
|
const input = [ |
|
{ |
|
_id: 'id 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
layer: 'layer 1', |
|
name: { |
|
default: 'name 1', |
|
} |
|
}, |
|
{ |
|
_id: 'id 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
layer: 'layer 2', |
|
name: { |
|
default: 'name 2', |
|
}, |
|
center_point: { |
|
lat: 13.131313, |
|
lon: 31.313131 |
|
} |
|
} |
|
]; |
|
|
|
const geojsonify = proxyquire('../../../helper/geojsonify', { |
|
'./geojsonify_place_details': (params, source, dst) => { |
|
if (source._id === 'id 2') { |
|
return { |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
}; |
|
} |
|
}, |
|
'pelias-logger': logger |
|
}); |
|
|
|
const actual = geojsonify({}, input); |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [ |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 31.313131, 13.131313 ] |
|
}, |
|
properties: { |
|
id: 'id 2', |
|
gid: 'source 2:layer 2:id 2', |
|
layer: 'layer 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
name: 'name 2', |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
} |
|
} |
|
], |
|
bbox: [31.313131, 13.131313, 31.313131, 13.131313] |
|
}; |
|
|
|
t.deepEquals(actual, expected); |
|
t.ok(logger.isWarnMessage('No doc or center_point property')); |
|
t.end(); |
|
|
|
}); |
|
|
|
test('places w/o names should log warnings and be ignored', t => { |
|
const logger = require('pelias-mock-logger')(); |
|
|
|
const input = [ |
|
{ |
|
_id: 'id 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
layer: 'layer 1', |
|
center_point: { |
|
lat: 12.121212, |
|
lon: 21.212121 |
|
} |
|
}, |
|
{ |
|
_id: 'id 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
layer: 'layer 2', |
|
name: {}, |
|
center_point: { |
|
lat: 13.131313, |
|
lon: 31.313131 |
|
} |
|
}, |
|
{ |
|
_id: 'id 3', |
|
source: 'source 3', |
|
source_id: 'source_id 3', |
|
layer: 'layer 3', |
|
name: { |
|
default: 'name 3', |
|
}, |
|
center_point: { |
|
lat: 14.141414, |
|
lon: 41.414141 |
|
} |
|
} |
|
]; |
|
|
|
const geojsonify = proxyquire('../../../helper/geojsonify', { |
|
'./geojsonify_place_details': (params, source, dst) => { |
|
if (source._id === 'id 1') { |
|
return { |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
}; |
|
} else if (source._id === 'id 2') { |
|
return { |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
}; |
|
} else if (source._id === 'id 3') { |
|
return { |
|
property5: 'property 5', |
|
property6: 'property 6' |
|
}; |
|
|
|
} |
|
}, |
|
'pelias-logger': logger |
|
}); |
|
|
|
const actual = geojsonify({}, input); |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [ |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 21.212121, 12.121212 ] |
|
}, |
|
properties: { |
|
id: 'id 1', |
|
gid: 'source 1:layer 1:id 1', |
|
layer: 'layer 1', |
|
source: 'source 1', |
|
source_id: 'source_id 1', |
|
property1: 'property 1', |
|
property2: 'property 2' |
|
} |
|
}, |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 31.313131, 13.131313 ] |
|
}, |
|
properties: { |
|
id: 'id 2', |
|
gid: 'source 2:layer 2:id 2', |
|
layer: 'layer 2', |
|
source: 'source 2', |
|
source_id: 'source_id 2', |
|
property3: 'property 3', |
|
property4: 'property 4' |
|
} |
|
}, |
|
{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 41.414141, 14.141414 ] |
|
}, |
|
properties: { |
|
id: 'id 3', |
|
gid: 'source 3:layer 3:id 3', |
|
layer: 'layer 3', |
|
source: 'source 3', |
|
source_id: 'source_id 3', |
|
name: 'name 3', |
|
property5: 'property 5', |
|
property6: 'property 6' |
|
} |
|
} |
|
], |
|
bbox: [21.212121, 12.121212, 41.414141, 14.141414] |
|
}; |
|
|
|
t.deepEquals(actual, expected); |
|
t.ok(logger.isWarnMessage('doc source 1:layer 1:id 1 does not contain name.default')); |
|
t.ok(logger.isWarnMessage('doc source 2:layer 2:id 2 does not contain name.default')); |
|
t.end(); |
|
|
|
}); |
|
|
|
test('no points', t => { |
|
const logger = require('pelias-mock-logger')(); |
|
|
|
const input = []; |
|
|
|
const geojsonify = proxyquire('../../../helper/geojsonify', { |
|
'./geojsonify_place_details': (params, source, dst) => { |
|
t.fail('should not have bee called'); |
|
}, |
|
'pelias-logger': logger |
|
}); |
|
|
|
const actual = geojsonify({}, input); |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [] |
|
}; |
|
|
|
t.deepEquals(actual, expected); |
|
t.end(); |
|
|
|
}); |
|
|
|
}; |
|
|
|
// ensure that if elasticsearch returns an array of values for name.default |
|
// .. that we handle this case and select the first element for the label. |
|
module.exports.tests.nameAliases = function(test, common) { |
|
test('name aliases', function(t) { |
|
var aliases = [{ |
|
'_type': 'example', |
|
'_id': '1', |
|
'source': 'example', |
|
'layer': 'example', |
|
'name': { |
|
'default': ['Example1', 'Example2'] // note the array |
|
}, |
|
'center_point': { |
|
'lon': 0, |
|
'lat': 0 |
|
} |
|
}]; |
|
|
|
const expected = { |
|
type: 'FeatureCollection', |
|
features: [{ |
|
type: 'Feature', |
|
geometry: { |
|
type: 'Point', |
|
coordinates: [ 0, 0 ] |
|
}, |
|
properties: { |
|
id: '1', |
|
gid: 'example:example:1', |
|
layer: 'example', |
|
source: 'example', |
|
source_id: undefined, |
|
name: 'Example1' |
|
} |
|
}], |
|
bbox: [ 0, 0, 0, 0 ] |
|
}; |
|
|
|
var actual = geojsonify( {}, aliases ); |
|
t.deepEquals(actual, expected); |
|
t.end(); |
|
}); |
|
|
|
}; |
|
|
|
module.exports.all = (tape, common) => { |
|
function test(name, testFunction) { |
|
return tape(`geojsonify: ${name}`, testFunction); |
|
} |
|
|
|
for( var testCase in module.exports.tests ){ |
|
module.exports.tests[testCase](test, common); |
|
} |
|
};
|
|
|