go-jsbox-location
Version:
A location addon for jsbox
297 lines (262 loc) • 10.1 kB
JavaScript
var assert = require('assert');
var _ = require('lodash');
var fixtures = require('../../fixtures');
var vumigo = require('vumigo_v02');
var JsonApi = vumigo.http.api.JsonApi;
var test_utils = vumigo.test_utils;
var location = require('../../../lib');
var providers = location.providers;
var Provider = providers.utils.Provider;
var AddressResult = providers.utils.AddressResult;
var OpenStreetMap = providers.openstreetmap.OpenStreetMap;
var assert_address_result = location.test_utils.assert_address_result;
describe('OpenStreetMap', function() {
it('should extend Provider', function() {
var osm = new OpenStreetMap();
assert(osm instanceof Provider);
});
describe('.init()', function() {
it('should create a JsonApi', function() {
var osm = new OpenStreetMap();
var dummy_im = {};
assert.strictEqual(osm.http, null);
osm.init(dummy_im);
assert(osm.http instanceof JsonApi);
});
});
describe('extract_address_label', function() {
it('the default should return display_name', function() {
var osm = new OpenStreetMap();
var label = osm.extract_address_label({
display_name: 'the label',
other: 'something entirely different',
});
assert.strictEqual(label, 'the label');
});
it('should be overrideable', function() {
var osm = new OpenStreetMap({
extract_address_label: function(r) {
return r.custom_label;
},
});
var label = osm.extract_address_label({
display_name: 'the ordinary label',
custom_label: 'customised label',
});
assert.strictEqual(label, 'customised label');
});
});
describe('extract_address_data', function() {
it('the default should return display name as formatted_address', function() {
var osm = new OpenStreetMap();
var data = osm.extract_address_data({
display_name: 'the address',
other: 'something entirely different',
});
assert.deepEqual(data, {formatted_address: 'the address'});
});
it('should be overrideable', function() {
var osm = new OpenStreetMap({
extract_address_data: function(r) {
return {custom: r.custom_data};
},
});
var data = osm.extract_address_data({
display_name: 'the address',
custom_data: 'customised data',
});
assert.deepEqual(data, {custom: 'customised data'});
});
});
describe('extract_address', function() {
it('should have a default', function() {
var osm = new OpenStreetMap();
var addr = osm.extract_address({
display_name: 'the address',
extraneous_field: 'extraneous value',
});
assert(addr instanceof AddressResult);
assert.strictEqual(addr.label, 'the address');
assert.deepEqual(addr.data, {formatted_address: 'the address'});
});
describe('should respect overrides of', function() {
it('extract_address_label', function() {
var osm = new OpenStreetMap({
extract_address_label: function(r) {
return r.override;
},
});
var addr = osm.extract_address({
display_name: 'the address',
override: 'max override',
});
assert.strictEqual(addr.label, 'max override');
});
it('extract_address_data', function() {
var osm = new OpenStreetMap({
extract_address_data: function(r) {
return {custom: r.snowflake};
},
});
var addr = osm.extract_address({
display_name: 'the address',
snowflake: 'unique',
});
assert.deepEqual(addr.data, {custom: 'unique'});
});
});
});
describe('.api_params()', function() {
var default_query = 'generic query';
function api_params(opts, query) {
var osm = new OpenStreetMap(opts);
return osm.api_params(query || default_query);
}
function assert_params(params, expected) {
expected = _.defaults(expected, {
key: null,
format: 'json',
q: default_query,
addressdetails: 1,
bounded: 1,
limit: 30,
viewbox: "-180.0,90.0,180.0,-90.0",
});
assert.deepEqual(params, expected);
}
it('should set the query text', function() {
var params = api_params(null, 'my search');
assert_params(params, {
q: 'my search',
});
});
it('should set the format to json', function() {
var params = api_params();
assert_params(params, {
format: 'json',
});
});
it('should request address details', function() {
var params = api_params();
assert_params(params, {
addressdetails: 1,
});
});
it('should set the default address limit', function() {
var params = api_params();
assert_params(params, {
limit: 30,
});
});
it('should set a custom address limit', function() {
var params = api_params({address_limit: 5});
assert_params(params, {
limit: 5,
});
});
it('should set the default boundedness', function() {
var params = api_params();
assert_params(params, {
bounded: 1,
});
});
it('should set a custom boundedness', function() {
var params = api_params({hard_boundary: 1});
assert_params(params, {
bounded: 0,
});
});
it('should set the default viewbox', function() {
var params = api_params();
assert_params(params, {
viewbox: '-180.0,90.0,180.0,-90.0',
});
});
it('should set a custom viewbox', function() {
var params = api_params({
bounding_box: ["-20.0", "75.0", "65.0", "-50.0"]
});
assert_params(params, {
viewbox: '-20.0,75.0,65.0,-50.0',
});
});
it('should set the api key', function() {
var params = api_params({
api_key: 'testapikey',
});
assert_params(params, {
key: 'testapikey',
});
});
});
describe('.search()', function() {
var im;
beforeEach(function() {
return test_utils.make_im()
.then(function(dummy_im) {
im = dummy_im;
fixtures.openstreetmap().forEach(im.api.http.fixtures.add);
});
});
it('should return a promise with a list of AddressResults', function() {
var osm = new OpenStreetMap({
api_key: 'testapikey',
});
osm.init(im);
return osm.search('Foe Street')
.then(function(results) {
assert_address_result(
results[0], [
'Foe Street, Cape Town Ward 57, Cape Town ',
'Subcouncil 15, Cape Town, City of Cape Town, ',
'Western Cape, 7925, RSA'
].join(''));
assert_address_result(
results[1], [
'Foe Street, Amesbury, Essex County, ',
'Massachusetts, 01913, United States of America',
].join(''));
assert_address_result(
results[2], [
'Foe Street, Wolfeboro, Carroll County, ',
'New Hampshire, 03894, United States of America',
].join(''));
assert.strictEqual(results.length, 3);
});
});
it('should use the custom api_url if one is given', function() {
var osm = new OpenStreetMap({
api_key: 'testapikey',
api_url: 'http://example.com/nominatim/v1/search.php',
});
osm.init(im);
return osm.search('Moon')
.then(function(results) {
assert_address_result(results[0], "Lake Serenity, The Moon");
assert.strictEqual(results.length, 1);
});
});
describe('should return a promise with an empty list if', function() {
it('the response has no data', function() {
var osm = new OpenStreetMap({
api_key: 'testapikey',
});
osm.init(im);
return osm.search("no_data")
.then(function(results) {
assert.deepEqual(results, []);
});
});
it('the response data is empty', function() {
var osm = new OpenStreetMap({
api_key: 'testapikey',
});
osm.init(im);
return osm.search("empty_data")
.then(function(results) {
assert.deepEqual(results, []);
});
});
});
});
});