var trimByGranularity = require('../../../middleware/trimByGranularityStructured')(); 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('all records with fallback.* matched_queries name should retain only venues when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'venue 1', _matched_queries: ['fallback.venue'] }, { name: 'venue 2', _matched_queries: ['fallback.venue'] }, { name: 'address 1', _matched_queries: ['fallback.address'] }, { name: 'street 1', _matched_queries: ['fallback.street'] }, { name: 'postalcode 1', _matched_queries: ['fallback.postalcode'] }, { name: 'neighbourhood 1', _matched_queries: ['fallback.neighbourhood'] }, { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'venue 1', _matched_queries: ['fallback.venue'] }, { name: 'venue 2', _matched_queries: ['fallback.venue'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only venue records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only streets when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'address 1', _matched_queries: ['fallback.address'] }, { name: 'address 2', _matched_queries: ['fallback.address'] }, { name: 'street 1', _matched_queries: ['fallback.street'] }, { name: 'postalcode 1', _matched_queries: ['fallback.postalcode'] }, { name: 'neighbourhood 1', _matched_queries: ['fallback.neighbourhood'] }, { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'address 1', _matched_queries: ['fallback.address'] }, { name: 'address 2', _matched_queries: ['fallback.address'] } ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only address records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only street when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'street 1', _matched_queries: ['fallback.street'] }, { name: 'street 2', _matched_queries: ['fallback.street'] }, { name: 'postalcode 1', _matched_queries: ['fallback.postalcode'] }, { name: 'neighbourhood 1', _matched_queries: ['fallback.neighbourhood'] }, { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'street 1', _matched_queries: ['fallback.street'] }, { name: 'street 2', _matched_queries: ['fallback.street'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only street records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only postalcodes when they are most granular', function(t) { var req = { clean: { parsed_text: { borough: 'borough value' } } }; var res = { data: [ { name: 'postalcode 1', _matched_queries: ['fallback.postalcode'] }, { name: 'postalcode 2', _matched_queries: ['fallback.postalcode'] }, { name: 'neighbourhood 1', _matched_queries: ['fallback.neighbourhood'] }, { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'borough 2', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'postalcode 1', _matched_queries: ['fallback.postalcode'] }, { name: 'postalcode 2', _matched_queries: ['fallback.postalcode'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only postalcode records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only neighbourhoods when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'neighbourhood 1', _matched_queries: ['fallback.neighbourhood'] }, { name: 'neighbourhood 2', _matched_queries: ['fallback.neighbourhood'] }, { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'neighbourhood 1', _matched_queries: ['fallback.neighbourhood'] }, { name: 'neighbourhood 2', _matched_queries: ['fallback.neighbourhood'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only neighbourhood records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only boroughs when they are most granular', function(t) { var req = { clean: { parsed_text: { borough: 'borough value' } } }; var res = { data: [ { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'borough 2', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'borough 2', _matched_queries: ['fallback.borough'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only borough records should be here'); t.end(); }); } testIt(); }); test('if req.parsed_text has city but not borough then borough and city results should be returned', function(t) { var req = { clean: { parsed_text: { city: 'city value' } } }; var res = { data: [ { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'borough 2', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'locality 2', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'borough 1', _matched_queries: ['fallback.borough'] }, { name: 'borough 2', _matched_queries: ['fallback.borough'] }, { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'locality 2', _matched_queries: ['fallback.locality'] } ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only borough/locality records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only localities when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'locality 2', _matched_queries: ['fallback.locality'] }, { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'locality 1', _matched_queries: ['fallback.locality'] }, { name: 'locality 2', _matched_queries: ['fallback.locality'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only locality records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only localadmins when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'localadmin 2', _matched_queries: ['fallback.localadmin'] }, { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'localadmin 1', _matched_queries: ['fallback.localadmin'] }, { name: 'localadmin 2', _matched_queries: ['fallback.localadmin'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only localadmin records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only counties when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'county 2', _matched_queries: ['fallback.county'] }, { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'county 1', _matched_queries: ['fallback.county'] }, { name: 'county 2', _matched_queries: ['fallback.county'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only county records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only macrocounties when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'macrocounty 2', _matched_queries: ['fallback.macrocounty'] }, { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'macrocounty 1', _matched_queries: ['fallback.macrocounty'] }, { name: 'macrocounty 2', _matched_queries: ['fallback.macrocounty'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only macrocounty records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only regions when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'region 2', _matched_queries: ['fallback.region'] }, { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'region 1', _matched_queries: ['fallback.region'] }, { name: 'region 2', _matched_queries: ['fallback.region'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only region records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only macroregions when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'macroregion 2', _matched_queries: ['fallback.macroregion'] }, { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'macroregion 1', _matched_queries: ['fallback.macroregion'] }, { name: 'macroregion 2', _matched_queries: ['fallback.macroregion'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only macroregion records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain countries over dependencies', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'country 2', _matched_queries: ['fallback.country'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'country 1', _matched_queries: ['fallback.country'] }, { name: 'country 2', _matched_queries: ['fallback.country'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only country records should be here'); t.end(); }); } testIt(); }); test('all records with fallback.* matched_queries name should retain only dependencies when they are most granular', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'dependency 2', _matched_queries: ['fallback.dependency'] }, { name: 'unknown', _matched_queries: ['fallback.unknown'] } ] }; var expected_data = [ { name: 'dependency 1', _matched_queries: ['fallback.dependency'] }, { name: 'dependency 2', _matched_queries: ['fallback.dependency'] }, ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'only dependency records should be here'); t.end(); }); } testIt(); }); test('presence of any non-fallback.* named queries should not trim', function(t) { var req = { clean: {} }; var res = { data: [ { name: 'region', _matched_queries: ['fallback.region'] }, { name: 'country', _matched_queries: ['fallback.country'] }, { name: 'result with non-named query' } ] }; var expected_data = [ { name: 'region', _matched_queries: ['fallback.region'] }, { name: 'country', _matched_queries: ['fallback.country'] }, { name: 'result with non-named query' } ]; function testIt() { trimByGranularity(req, res, function() { t.deepEquals(res.data, expected_data, 'all should results should have been retained'); 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); } };