From 26a5a7590b919680d6d2a7443f9ad62a9a76777a Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Thu, 25 Sep 2014 17:40:13 +0100 Subject: [PATCH] refactor geojsonify --- controller/suggest.js | 44 +----------------- helper/geojsonify.js | 45 +++++++++++++++++++ test/unit/helper/geojsonify.js | 82 ++++++++++++++++++++++++++++++++++ test/unit/run.js | 3 +- 4 files changed, 131 insertions(+), 43 deletions(-) create mode 100644 helper/geojsonify.js create mode 100644 test/unit/helper/geojsonify.js diff --git a/controller/suggest.js b/controller/suggest.js index dbd2b506..36c3cc98 100644 --- a/controller/suggest.js +++ b/controller/suggest.js @@ -1,5 +1,5 @@ -var GeoJSON = require('geojson'); +var geojsonify = require('../helper/geojsonify').suggest; function setup( backend, query ){ @@ -29,7 +29,7 @@ function setup( backend, query ){ } // convert docs to geojson - var geojson = geoJsonifyDocs( docs ); + var geojson = geojsonify( docs ); // response envelope geojson.date = new Date().getTime(); @@ -43,44 +43,4 @@ function setup( backend, query ){ return controller; } -function geoJsonifyDocs( docs ){ - - // emit a warning if the doc format is invalid - // @note: if you see this error, fix it ASAP! - function warning(){ - console.error( 'error: invalid doc', __filename ); - return false; // remove offending doc from results - } - - // flatten & expand data for geojson conversion - var geodata = docs.map( function( doc ){ - - // something went very wrong - if( !doc || !doc.payload ) return warning(); - - // split payload id string in to geojson properties - if( 'string' !== typeof doc.payload.id ) return warning(); - var idParts = doc.payload.id.split('/'); - doc.type = idParts[0]; - doc.id = idParts[1]; - - // split payload geo string in to geojson properties - if( 'string' !== typeof doc.payload.geo ) return warning(); - var geoParts = doc.payload.geo.split(','); - doc.lat = parseFloat( geoParts[1] ); - doc.lng = parseFloat( geoParts[0] ); - - // remove payload from doc - delete doc.payload; - return doc; - - // filter-out invalid entries - }).filter( function( doc ){ - return doc; - }); - - // convert to geojson - return GeoJSON.parse( geodata, { Point: ['lat', 'lng'] } ); -} - module.exports = setup; \ No newline at end of file diff --git a/helper/geojsonify.js b/helper/geojsonify.js new file mode 100644 index 00000000..1154fd8a --- /dev/null +++ b/helper/geojsonify.js @@ -0,0 +1,45 @@ + +var GeoJSON = require('geojson'); + +function suggest( docs ){ + + // emit a warning if the doc format is invalid + // @note: if you see this error, fix it ASAP! + function warning(){ + console.error( 'error: invalid doc', __filename ); + return false; // remove offending doc from results + } + + // flatten & expand data for geojson conversion + var geodata = docs.map( function( doc ){ + + // something went very wrong + if( !doc || !doc.payload ) return warning(); + + // split payload id string in to geojson properties + if( 'string' !== typeof doc.payload.id ) return warning(); + var idParts = doc.payload.id.split('/'); + doc.type = idParts[0]; + doc.id = idParts[1]; + + // split payload geo string in to geojson properties + if( 'string' !== typeof doc.payload.geo ) return warning(); + var geoParts = doc.payload.geo.split(','); + doc.lat = parseFloat( geoParts[1] ); + doc.lng = parseFloat( geoParts[0] ); + + // remove payload from doc + delete doc.payload; + return doc; + + // filter-out invalid entries + }).filter( function( doc ){ + return doc; + }); + + // convert to geojson + return GeoJSON.parse( geodata, { Point: ['lat', 'lng'] } ); + +} + +module.exports.suggest = suggest; \ No newline at end of file diff --git a/test/unit/helper/geojsonify.js b/test/unit/helper/geojsonify.js new file mode 100644 index 00000000..5a3c66d1 --- /dev/null +++ b/test/unit/helper/geojsonify.js @@ -0,0 +1,82 @@ + +var geojsonify = require('../../../helper/geojsonify'); + +module.exports.tests = {}; + +module.exports.tests.interface = function(test, common) { + test('valid interface .suggest()', function(t) { + t.equal(typeof geojsonify.suggest, 'function', 'suggest is a function'); + t.equal(geojsonify.suggest.length, 1, 'accepts x arguments'); + t.end(); + }); +}; + +module.exports.tests.suggest = function(test, common) { + + var input = [{ + bingo1: 'bango1', + payload: { + id: 'foo1/bar1', + geo: '100,-10.5' + } + },{ + bingo2: 'bango2', + payload: { + id: 'foo2/bar2', + geo: '10,-1.5' + } + }]; + + var expected = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 100, + -10.5 + ] + }, + "properties": { + "bingo1": "bango1", + "type": "foo1", + "id": "bar1" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 10, + -1.5 + ] + }, + "properties": { + "bingo2": "bango2", + "type": "foo2", + "id": "bar2" + } + } + ] + }; + + test('geojsonify.suggest()', function(t) { + var json = geojsonify.suggest( input ); + t.deepEqual(json, expected, 'all docs mapped'); + t.end(); + }); +}; + +module.exports.all = function (tape, common) { + + function test(name, testFunction) { + return tape('geojsonify: ' + name, testFunction); + } + + for( var testCase in module.exports.tests ){ + module.exports.tests[testCase](test, common); + } +}; \ No newline at end of file diff --git a/test/unit/run.js b/test/unit/run.js index 9946a402..96e9c95a 100644 --- a/test/unit/run.js +++ b/test/unit/run.js @@ -10,7 +10,8 @@ var tests = [ require('./query/indeces'), require('./query/suggest'), require('./query/search'), - require('./query/reverse') + require('./query/reverse'), + require('./helper/geojsonify') ]; tests.map(function(t) {