pelias-geonames
Version:
Import pipleine to bring Geonames data into the Pelias Geocoder
248 lines (197 loc) • 7.4 kB
JavaScript
var tape = require('tape');
var Document = require('pelias-model').Document;
var peliasDocGenerator = require('../../lib/streams/peliasDocGenerator');
const proxyquire = require('proxyquire').noCallThru();
const stream_mock = require('stream-mock');
function test_stream(input, testedStream, callback) {
const reader = new stream_mock.ObjectReadableMock(input);
const writer = new stream_mock.ObjectWritableMock();
writer.on('error', (e) => callback(e));
writer.on('finish', () => callback(null, writer.data));
reader.pipe(testedStream).pipe(writer);
}
tape('peliasDocGenerator', function(test) {
test.test('basic data should should be returned as Document objects with only ' +
'name and centroid supplied', function(t) {
var input = {
_id: 12345,
name: 'Record Name',
latitude: 12.121212,
longitude: 21.212121
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Record Name')
.setCentroid({ lat: 12.121212, lon: 21.212121 });
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('record throwing exception on basic setup should push nothing to next', function(t) {
const logger = require('pelias-mock-logger')();
const docGenerator = proxyquire('../../lib/streams/peliasDocGenerator', {
'pelias-logger': logger
}).create();
const input = {
_id: 12345,
latitude: 12.121212,
longitude: 21.212121
};
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [], 'should not have passed anything thru');
t.ok(logger.isWarnMessage(/Failed to create a Document from.*/));
t.end();
});
});
test.test('fcode should be set when available and populate categories case-insensitively', function(t) {
var input = {
_id: 12345,
name: 'Record Name',
latitude: 12.121212,
longitude: 21.212121,
feature_code: 'rNgA'
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Record Name')
.setCentroid({ lat: 12.121212, lon: 21.212121 })
.setMeta('fcode', 'RNGA')
.setAddendum('geonames', { feature_code: 'RNGA' })
.addCategory('government:military')
.addCategory('government')
.addCategory('natural');
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('unsupported feature_code should set meta fcode but add no categories', function(t) {
var input = {
_id: 12345,
name: 'Record Name',
latitude: 12.121212,
longitude: 21.212121,
feature_code: 'Unsupported feature_code'
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Record Name')
.setCentroid({ lat: 12.121212, lon: 21.212121 })
.setMeta('fcode', 'UNSUPPORTED FEATURE_CODE')
.setAddendum('geonames', { feature_code: 'UNSUPPORTED FEATURE_CODE' });
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('population should be set when parseable as radix 10 integer', function(t) {
var input = {
_id: 12345,
name: 'Record Name',
latitude: 12.121212,
longitude: 21.212121,
population: '127'
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Record Name')
.setCentroid({ lat: 12.121212, lon: 21.212121 })
.setPopulation(127);
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('population should not be set when unparseable as radix 10 integer', function(t) {
var input = {
_id: 12345,
name: 'Record Name',
latitude: 12.121212,
longitude: 21.212121,
population: 'this isn\'t an integer'
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Record Name')
.setCentroid({ lat: 12.121212, lon: 21.212121 });
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('popularity should be set when mapping available', function(t) {
var input = {
_id: 12345,
name: 'Record Name',
latitude: 12.121212,
longitude: 21.212121,
feature_code: ' hsts '
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Record Name')
.setCentroid({ lat: 12.121212, lon: 21.212121 })
.setAddendum('geonames', { feature_code: 'HSTS' })
.addCategory('historic')
.setPopularity(5000);
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('add name aliases for forward slash delimited names', function(t) {
var input = {
_id: 12345,
name: ' / Something / Else/Two Words ',
latitude: 1,
longitude: 1
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Something')
.setNameAlias('default', 'Else')
.setNameAlias('default', 'Two Words')
.setCentroid({ lat: 1, lon: 1 });
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('add name aliases for comma delimited names', function(t) {
var input = {
_id: 12345,
name: ' , Something , Else,Two Words ',
latitude: 1,
longitude: 1
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Something')
.setNameAlias('default', 'Else')
.setNameAlias('default', 'Two Words')
.setCentroid({ lat: 1, lon: 1 });
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
test.test('add name aliases for hash delimited names', function(t) {
var input = {
_id: 12345,
name: ' # Something # Else#Two Words ',
latitude: 1,
longitude: 1
};
var expected = new Document( 'geonames', 'venue', 12345 )
.setName('default', 'Something')
.setNameAlias('default', 'Else')
.setNameAlias('default', 'Two Words')
.setCentroid({ lat: 1, lon: 1 });
var docGenerator = peliasDocGenerator.create();
test_stream([input], docGenerator, function(err, actual) {
t.deepEqual(actual, [expected], 'should have returned true');
t.end();
});
});
});