|
|
|
const generateQuery = require('../../../query/address_search_using_ids');
|
|
|
|
const _ = require('lodash');
|
|
|
|
const proxyquire = require('proxyquire').noCallThru();
|
|
|
|
const mock_logger = require('pelias-mock-logger');
|
|
|
|
const MockQuery = require('./MockQuery');
|
|
|
|
|
|
|
|
module.exports.tests = {};
|
|
|
|
|
|
|
|
module.exports.tests.interface = (test, common) => {
|
|
|
|
test('valid interface', (t) => {
|
|
|
|
t.ok(_.isFunction(generateQuery));
|
|
|
|
t.end();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
// helper for canned views
|
|
|
|
const views = {
|
|
|
|
focus_only_function: () => 'focus_only_function',
|
|
|
|
boundary_country: 'boundary_country view',
|
|
|
|
boundary_circle: 'boundary_circle view',
|
|
|
|
boundary_rect: 'boundary_rect view',
|
|
|
|
sources: 'sources view'
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.tests.base_query = (test, common) => {
|
|
|
|
test('basic', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const res = {
|
|
|
|
data: []
|
|
|
|
};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.equals(generatedQuery.type, 'fallback');
|
|
|
|
|
|
|
|
t.equals(generatedQuery.body.vs.var('input:housenumber').toString(), 'housenumber value');
|
|
|
|
t.equals(generatedQuery.body.vs.var('input:street').toString(), 'street value');
|
|
|
|
t.notOk(generatedQuery.body.vs.isset('sources'));
|
|
|
|
t.equals(generatedQuery.body.vs.var('size').toString(), 20);
|
|
|
|
|
|
|
|
t.deepEquals(generatedQuery.body.score_functions, [
|
|
|
|
'focus_only_function'
|
|
|
|
]);
|
|
|
|
|
|
|
|
t.deepEquals(generatedQuery.body.filter_functions, [
|
|
|
|
'boundary_country view',
|
|
|
|
'boundary_circle view',
|
|
|
|
'boundary_rect view',
|
|
|
|
'sources view'
|
|
|
|
]);
|
|
|
|
|
|
|
|
t.deepEquals(logger.getInfoMessages(), ['[query:address_search_using_ids] [parser:libpostal]']);
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.tests.other_parameters = (test, common) => {
|
|
|
|
test('explicit size set', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
},
|
|
|
|
querySize: 'querySize value'
|
|
|
|
};
|
|
|
|
const res = {
|
|
|
|
data: []
|
|
|
|
};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.equals(generatedQuery.body.vs.var('size').toString(), 'querySize value');
|
|
|
|
t.deepEquals(logger.getInfoMessages(), ['[query:address_search_using_ids] [parser:libpostal] [param:querySize]']);
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
test('explicit sources set', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
},
|
|
|
|
sources: ['source 1', 'source 2']
|
|
|
|
};
|
|
|
|
const res = {
|
|
|
|
data: []
|
|
|
|
};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.deepEquals(generatedQuery.body.vs.var('sources').toString(), ['source 1', 'source 2']);
|
|
|
|
t.deepEquals(logger.getInfoMessages(), ['[query:address_search_using_ids] [parser:libpostal] [param:sources]']);
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.tests.granularity_bands = (test, common) => {
|
|
|
|
test('neighbourhood/borough/locality/localadmin granularity band', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const res = {
|
|
|
|
data: [
|
|
|
|
{
|
|
|
|
layer: 'neighbourhood',
|
|
|
|
source_id: 1
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'borough',
|
|
|
|
source_id: 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'locality',
|
|
|
|
source_id: 3
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'localadmin',
|
|
|
|
source_id: 4
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'county',
|
|
|
|
source_id: 5
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'macrocounty',
|
|
|
|
source_id: 6
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'region',
|
|
|
|
source_id: 7
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'macroregion',
|
|
|
|
source_id: 8
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'dependency',
|
|
|
|
source_id: 9
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'country',
|
|
|
|
source_id: 10
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'neighbourhood',
|
|
|
|
source_id: 11
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'borough',
|
|
|
|
source_id: 12
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'locality',
|
|
|
|
source_id: 13
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'localadmin',
|
|
|
|
source_id: 14
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'county',
|
|
|
|
source_id: 15
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'macrocounty',
|
|
|
|
source_id: 16
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'region',
|
|
|
|
source_id: 17
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'macroregion',
|
|
|
|
source_id: 18
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'dependency',
|
|
|
|
source_id: 19
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'country',
|
|
|
|
source_id: 20
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), {
|
|
|
|
neighbourhood: [1, 11],
|
|
|
|
borough: [2, 12],
|
|
|
|
locality: [3, 13],
|
|
|
|
localadmin: [4, 14],
|
|
|
|
region: [7, 17],
|
|
|
|
macroregion: [8, 18],
|
|
|
|
dependency: [9, 19],
|
|
|
|
country: [10, 20]
|
|
|
|
});
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
});
|
|
|
|
|
|
|
|
test('only band members with ids should be passed', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const res = {
|
|
|
|
data: [
|
|
|
|
{
|
|
|
|
layer: 'neighbourhood',
|
|
|
|
source_id: 1
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), {
|
|
|
|
neighbourhood: [1],
|
|
|
|
borough: [],
|
|
|
|
locality: [],
|
|
|
|
localadmin: [],
|
|
|
|
region: [],
|
|
|
|
macroregion: [],
|
|
|
|
dependency: [],
|
|
|
|
country: []
|
|
|
|
});
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
});
|
|
|
|
|
|
|
|
test('county/macrocounty granularity band', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const res = {
|
|
|
|
data: [
|
|
|
|
{
|
|
|
|
layer: 'county',
|
|
|
|
source_id: 1
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'macrocounty',
|
|
|
|
source_id: 2
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'county',
|
|
|
|
source_id: 4
|
|
|
|
},
|
|
|
|
{
|
|
|
|
layer: 'macrocounty',
|
|
|
|
source_id: 5
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), {
|
|
|
|
county: [1, 4],
|
|
|
|
macrocounty: [2, 5]
|
|
|
|
});
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
});
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.tests.boundary_filters = (test, common) => {
|
|
|
|
test('boundary.country available should add to query', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
},
|
|
|
|
'boundary.country': 'boundary.country value'
|
|
|
|
};
|
|
|
|
const res = {};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:country').toString(), 'boundary.country value');
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
test('focus.point.lat/lon w/both numbers should add to query', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
},
|
|
|
|
'focus.point.lat': 12.121212,
|
|
|
|
'focus.point.lon': 21.212121
|
|
|
|
};
|
|
|
|
const res = {};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.equals(generatedQuery.body.vs.var('focus:point:lat').toString(), 12.121212);
|
|
|
|
t.equals(generatedQuery.body.vs.var('focus:point:lon').toString(), 21.212121);
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
test('boundary.rect with all numbers should add to query', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
},
|
|
|
|
'boundary.rect.min_lat': 12.121212,
|
|
|
|
'boundary.rect.max_lat': 13.131313,
|
|
|
|
'boundary.rect.min_lon': 21.212121,
|
|
|
|
'boundary.rect.max_lon': 31.313131
|
|
|
|
};
|
|
|
|
const res = {};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:rect:top').toString(), 13.131313);
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:rect:right').toString(), 31.313131);
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:rect:bottom').toString(), 12.121212);
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:rect:left').toString(), 21.212121);
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
test('boundary circle without radius should set radius to default', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
},
|
|
|
|
'boundary.circle.lat': 12.121212,
|
|
|
|
'boundary.circle.lon': 21.212121
|
|
|
|
};
|
|
|
|
const res = {};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lat').toString(), 12.121212);
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lon').toString(), 21.212121);
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:circle:radius').toString(), '50km');
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
test('boundary circle with radius set radius to that value rounded', (t) => {
|
|
|
|
const logger = mock_logger();
|
|
|
|
|
|
|
|
const clean = {
|
|
|
|
parsed_text: {
|
|
|
|
number: 'housenumber value',
|
|
|
|
street: 'street value'
|
|
|
|
},
|
|
|
|
'boundary.circle.lat': 12.121212,
|
|
|
|
'boundary.circle.lon': 21.212121,
|
|
|
|
'boundary.circle.radius': 17.6
|
|
|
|
};
|
|
|
|
const res = {};
|
|
|
|
|
|
|
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', {
|
|
|
|
'pelias-logger': logger,
|
|
|
|
'pelias-query': {
|
|
|
|
layout: {
|
|
|
|
AddressesUsingIdsQuery: MockQuery
|
|
|
|
},
|
|
|
|
view: views,
|
|
|
|
Vars: require('pelias-query').Vars
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const generatedQuery = generateQuery(clean, res);
|
|
|
|
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lat').toString(), 12.121212);
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lon').toString(), 21.212121);
|
|
|
|
t.equals(generatedQuery.body.vs.var('boundary:circle:radius').toString(), '18km');
|
|
|
|
|
|
|
|
t.end();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports.all = (tape, common) => {
|
|
|
|
function test(name, testFunction) {
|
|
|
|
return tape(`address_search_using_ids query ${name}`, testFunction);
|
|
|
|
}
|
|
|
|
|
|
|
|
for( var testCase in module.exports.tests ){
|
|
|
|
module.exports.tests[testCase](test, common);
|
|
|
|
}
|
|
|
|
};
|