mirror of https://github.com/pelias/api.git
Stephen Hess
9 years ago
2 changed files with 296 additions and 0 deletions
@ -0,0 +1,42 @@ |
|||||||
|
var _ = require('lodash'); |
||||||
|
|
||||||
|
// layers in increasing order of granularity
|
||||||
|
var layers = [ |
||||||
|
['venue'], |
||||||
|
['address'], |
||||||
|
['neighbourhood'], |
||||||
|
['locality', 'localadmin'], |
||||||
|
['county', 'macrocounty'], |
||||||
|
['region', 'macroregion'], |
||||||
|
['country'] |
||||||
|
]; |
||||||
|
|
||||||
|
function hasRecordsAtLayers(results, layers) { |
||||||
|
return _.some(results, function(result) { |
||||||
|
return layers.indexOf(result.layer) !== -1; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function retainRecordsAtLayers(results, layers) { |
||||||
|
return _.filter(results, function(result) { |
||||||
|
return layers.indexOf(result.layer) !== -1; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function setup() { |
||||||
|
return function trim(req, res, next) { |
||||||
|
if (_.isUndefined(req.clean)) { |
||||||
|
return next(); |
||||||
|
} |
||||||
|
|
||||||
|
layers.forEach(function(layer) { |
||||||
|
if (hasRecordsAtLayers(res.data, layer )) { |
||||||
|
res.data = retainRecordsAtLayers(res.data, layer); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
next(); |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = setup; |
@ -0,0 +1,254 @@ |
|||||||
|
var trimByGranularity = require('../../../middleware/trimByGranularity')(); |
||||||
|
|
||||||
|
module.exports.tests = {}; |
||||||
|
|
||||||
|
module.exports.tests.trimByGranularity = function(test, common) { |
||||||
|
test('empty res and req should not throw exception', function(t) { |
||||||
|
function testIt() { |
||||||
|
trimByGranularity({}, {}, function() {}); |
||||||
|
} |
||||||
|
|
||||||
|
t.doesNotThrow(testIt, 'an exception should not have been thrown'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
test('when venue records are most granular, only they should be retained', function(t) { |
||||||
|
var req = { clean: {} }; |
||||||
|
|
||||||
|
var res = { |
||||||
|
data: [ |
||||||
|
{ name: 'venue 1', layer: 'venue' }, |
||||||
|
{ name: 'venue 2', layer: 'venue' }, |
||||||
|
{ name: 'address 1', layer: 'address' }, |
||||||
|
{ name: 'neighbourhood 1', layer: 'neighbourhood' }, |
||||||
|
{ name: 'locality 1', layer: 'locality' }, |
||||||
|
{ name: 'localadmin 1', layer: 'localadmin' }, |
||||||
|
{ name: 'county 1', layer: 'county' }, |
||||||
|
{ name: 'macrocounty 1', layer: 'macrocounty' }, |
||||||
|
{ name: 'region 1', layer: 'region' }, |
||||||
|
{ name: 'macroregion 1', layer: 'macroregion' }, |
||||||
|
{ name: 'country 1', layer: 'country' } |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
var expected_data = [ |
||||||
|
{ name: 'venue 1', layer: 'venue' }, |
||||||
|
{ name: 'venue 2', layer: 'venue' }, |
||||||
|
]; |
||||||
|
|
||||||
|
function testIt() { |
||||||
|
trimByGranularity(req, res, function() { |
||||||
|
t.deepEquals(res.data, expected_data, 'only venue records should be here'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
testIt(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('when address records are most granular, only they should be retained', function(t) { |
||||||
|
var req = { clean: {} }; |
||||||
|
|
||||||
|
var res = { |
||||||
|
data: [ |
||||||
|
{ name: 'address 1', layer: 'address' }, |
||||||
|
{ name: 'address 2', layer: 'address' }, |
||||||
|
{ name: 'neighbourhood 1', layer: 'neighbourhood' }, |
||||||
|
{ name: 'locality 1', layer: 'locality' }, |
||||||
|
{ name: 'localadmin 1', layer: 'localadmin' }, |
||||||
|
{ name: 'county 1', layer: 'county' }, |
||||||
|
{ name: 'macrocounty 1', layer: 'macrocounty' }, |
||||||
|
{ name: 'region 1', layer: 'region' }, |
||||||
|
{ name: 'macroregion 1', layer: 'macroregion' }, |
||||||
|
{ name: 'country 1', layer: 'country' }, |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
var expected_data = [ |
||||||
|
{ name: 'address 1', layer: 'address' }, |
||||||
|
{ name: 'address 2', layer: 'address' } |
||||||
|
]; |
||||||
|
|
||||||
|
function testIt() { |
||||||
|
trimByGranularity(req, res, function() { |
||||||
|
t.deepEquals(res.data, expected_data, 'only address records should be here'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
testIt(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('when neighbourhood records are most granular, only they should be retained', function(t) { |
||||||
|
var req = { clean: {} }; |
||||||
|
|
||||||
|
var res = { |
||||||
|
data: [ |
||||||
|
{ name: 'neighbourhood 1', layer: 'neighbourhood' }, |
||||||
|
{ name: 'neighbourhood 2', layer: 'neighbourhood' }, |
||||||
|
{ name: 'locality 1', layer: 'locality' }, |
||||||
|
{ name: 'locality 2', layer: 'locality' }, |
||||||
|
{ name: 'localadmin 1', layer: 'localadmin' }, |
||||||
|
{ name: 'localadmin 2', layer: 'localadmin' }, |
||||||
|
{ name: 'county 1', layer: 'county' }, |
||||||
|
{ name: 'macrocounty 1', layer: 'macrocounty' }, |
||||||
|
{ name: 'region 1', layer: 'region' }, |
||||||
|
{ name: 'macroregion 1', layer: 'macroregion' }, |
||||||
|
{ name: 'country 1', layer: 'country' } |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
var expected_data = [ |
||||||
|
{ name: 'neighbourhood 1', layer: 'neighbourhood' }, |
||||||
|
{ name: 'neighbourhood 2', layer: 'neighbourhood' } |
||||||
|
]; |
||||||
|
|
||||||
|
function testIt() { |
||||||
|
trimByGranularity(req, res, function() { |
||||||
|
t.deepEquals(res.data, expected_data, 'only neighbourhood records should be here'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
testIt(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('when locality/localadmin records are most granular, only they should be retained', function(t) { |
||||||
|
var req = { clean: {} }; |
||||||
|
|
||||||
|
var res = { |
||||||
|
data: [ |
||||||
|
{ name: 'locality 1', layer: 'locality' }, |
||||||
|
{ name: 'locality 2', layer: 'locality' }, |
||||||
|
{ name: 'localadmin 1', layer: 'localadmin' }, |
||||||
|
{ name: 'localadmin 2', layer: 'localadmin' }, |
||||||
|
{ name: 'county 1', layer: 'county' }, |
||||||
|
{ name: 'macrocounty 1', layer: 'macrocounty' }, |
||||||
|
{ name: 'region 1', layer: 'region' }, |
||||||
|
{ name: 'macroregion 1', layer: 'macroregion' }, |
||||||
|
{ name: 'country 1', layer: 'country' }, |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
var expected_data = [ |
||||||
|
{ name: 'locality 1', layer: 'locality' }, |
||||||
|
{ name: 'locality 2', layer: 'locality' }, |
||||||
|
{ name: 'localadmin 1', layer: 'localadmin' }, |
||||||
|
{ name: 'localadmin 2', layer: 'localadmin' } |
||||||
|
]; |
||||||
|
|
||||||
|
function testIt() { |
||||||
|
trimByGranularity(req, res, function() { |
||||||
|
t.deepEquals(res.data, expected_data, 'only locality/localadmin records should be here'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
testIt(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('when county/macrocounty records are most granular, only they should be retained', function(t) { |
||||||
|
var req = { clean: {} }; |
||||||
|
|
||||||
|
var res = { |
||||||
|
data: [ |
||||||
|
{ name: 'county 1', layer: 'county' }, |
||||||
|
{ name: 'county 2', layer: 'county' }, |
||||||
|
{ name: 'macrocounty 1', layer: 'macrocounty' }, |
||||||
|
{ name: 'macrocounty 2', layer: 'macrocounty' }, |
||||||
|
{ name: 'region 1', layer: 'region' }, |
||||||
|
{ name: 'macroregion 1', layer: 'macroregion' }, |
||||||
|
{ name: 'country 1', layer: 'country' }, |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
var expected_data = [ |
||||||
|
{ name: 'county 1', layer: 'county' }, |
||||||
|
{ name: 'county 2', layer: 'county' }, |
||||||
|
{ name: 'macrocounty 1', layer: 'macrocounty' }, |
||||||
|
{ name: 'macrocounty 2', layer: 'macrocounty' }, |
||||||
|
]; |
||||||
|
|
||||||
|
function testIt() { |
||||||
|
trimByGranularity(req, res, function() { |
||||||
|
t.deepEquals(res.data, expected_data, 'only county/macrocounty records should be here'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
testIt(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('when region/macroregion records are most granular, only they should be retained', function(t) { |
||||||
|
var req = { clean: {} }; |
||||||
|
|
||||||
|
var res = { |
||||||
|
data: [ |
||||||
|
{ name: 'region 1', layer: 'region' }, |
||||||
|
{ name: 'region 2', layer: 'region' }, |
||||||
|
{ name: 'macroregion 1', layer: 'macroregion' }, |
||||||
|
{ name: 'macroregion 2', layer: 'macroregion' }, |
||||||
|
{ name: 'country 1', layer: 'country' }, |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
var expected_data = [ |
||||||
|
{ name: 'region 1', layer: 'region' }, |
||||||
|
{ name: 'region 2', layer: 'region' }, |
||||||
|
{ name: 'macroregion 1', layer: 'macroregion' }, |
||||||
|
{ name: 'macroregion 2', layer: 'macroregion' } |
||||||
|
]; |
||||||
|
|
||||||
|
function testIt() { |
||||||
|
trimByGranularity(req, res, function() { |
||||||
|
t.deepEquals(res.data, expected_data, 'only region/macroregion records should be here'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
testIt(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('when country records are most granular, only they should be retained', function(t) { |
||||||
|
var req = { clean: {} }; |
||||||
|
|
||||||
|
var res = { |
||||||
|
data: [ |
||||||
|
{ name: 'country 1', layer: 'country' }, |
||||||
|
{ name: 'country 2', layer: 'country' } |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
var expected_data = [ |
||||||
|
{ name: 'country 1', layer: 'country' }, |
||||||
|
{ name: 'country 2', layer: 'country' } |
||||||
|
]; |
||||||
|
|
||||||
|
function testIt() { |
||||||
|
trimByGranularity(req, res, function() { |
||||||
|
t.deepEquals(res.data, expected_data, 'only country records should be here'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
testIt(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
module.exports.all = function (tape, common) { |
||||||
|
function test(name, testFunction) { |
||||||
|
return tape('[middleware] trimByGranularity: ' + name, testFunction); |
||||||
|
} |
||||||
|
|
||||||
|
for( var testCase in module.exports.tests ){ |
||||||
|
module.exports.tests[testCase](test, common); |
||||||
|
} |
||||||
|
}; |
Loading…
Reference in new issue