datahub/test/view.map.test.js
Rufus Pollock df935091fd [#244,view/map][m]: support for customizing rendering of map features in all ways supported by Leaflet - fixes #244.
* This automatically provides support for things like custom markers via
  pointToLayer etc

* Also a significant bugfix for a bug that surfaced when using different marker
  (like the CircleMarker) - and which took ~30m to track down. Bug was that the
  call to zoom (or, more specifically, call to getBounds) occurred before
  features were added to the map and getBounds for some objects (such as
  circles) requires map to exit (so you can do a projection!)
2012-10-23 00:19:59 +01:00

248 lines
5.8 KiB
JavaScript

(function ($) {
module("View - Map");
var GeoJSONFixture = {
getDataset: function() {
var fields = [
{id: 'id'},
{id: 'x'},
{id: 'y'},
{id: 'z'},
{id: 'geom'}
];
var records = [
{id: 0, x: 1, y: 2, z: 3, geom: '{"type":"Point","coordinates":[13.40,52.35]}'},
{id: 1, x: 2, y: 4, z: 6, geom: {type:"Point",coordinates:[13.40,52.35]}},
{id: 2, x: 3, y: 6, z: 9, geom: {type:"LineString",coordinates:[[100.0, 0.0],[101.0, 1.0]]}}
];
var dataset = new recline.Model.Dataset({
records: records,
fields: fields
});
return dataset;
}
};
test('basics', function () {
var dataset = Fixture.getDataset();
var view = new recline.View.Map({
model: dataset
});
$('.fixtures').append(view.el);
view.render();
assertPresent('.editor-field-type', view.elSidebar);
// Check that the Leaflet map was set up
assertPresent('.leaflet-container',view.el);
ok(view.map instanceof L.Map);
ok(view.features instanceof L.GeoJSON);
view.remove();
});
test('_setupGeometryField', function () {
var dataset = Fixture.getDataset();
var view = new recline.View.Map({
model: dataset
});
view.render();
var exp = {
geomField: null,
lonField: 'lon',
latField: 'lat',
autoZoom: true,
cluster: false
};
deepEqual(view.state.toJSON(), exp);
deepEqual(view.menu.state.toJSON(), exp);
});
test('Lat/Lon geom fields', function () {
var dataset = Fixture.getDataset();
var view = new recline.View.Map({
model: dataset
});
$('.fixtures').append(view.el);
view.render();
// Not really needed but fire query to test that resetting works!
dataset.query();
// Check that all markers were created
equal(_getFeaturesCount(view.features),6);
// Delete a record
view.model.records.remove(view.model.records.get('1'));
equal(_getFeaturesCount(view.features),5);
// Add a new one
view.model.records.add({id: 7, x: 7, y: 14, z: 21, country: 'KX', label: 'seventh', lat:13.23, lon:23.56}),
equal(_getFeaturesCount(view.features),6);
view.remove();
});
test('GeoJSON geom field', function () {
var dataset = GeoJSONFixture.getDataset();
var view = new recline.View.Map({
model: dataset
});
$('.fixtures').append(view.el);
view.render();
// Check that all features were created
equal(_getFeaturesCount(view.features),3);
// Delete a record
view.model.records.remove(view.model.records.get('2'));
equal(_getFeaturesCount(view.features),2);
// Add it back
view.model.records.add({id: 2, x: 3, y: 6, z: 9, geom: {type:"LineString",coordinates:[[100.0, 0.0],[101.0, 1.0]]}}),
equal(_getFeaturesCount(view.features),3);
view.remove();
});
test('_getGeometryFromRecord non-GeoJSON', function () {
var test = [
[{ lon: 47, lat: 53}, [47,53]],
["53.3,47.32", [47.32, 53.3]],
["53.3, 47.32", [47.32, 53.3]],
["(53.3,47.32)", [47.32, 53.3]],
[[53.3,47.32], [53.3, 47.32]]
];
var view = new recline.View.Map({
model: new recline.Model.Dataset({
records: [{a: 1}]
}),
state: {
geomField: 'location'
}
});
_.each(test, function(item) {
var record = new recline.Model.Record({location: item[0]});
var out = view._getGeometryFromRecord(record);
deepEqual(out.coordinates, item[1]);
});
});
test('many markers', function () {
var data = [];
for (var i = 0; i<1000; i++) {
data.push({ id: i, lon: 13+3*i, lat: 52+i/10});
}
var fields = [
{id: 'id'},
{id: 'lat'},
{id: 'lon'}
];
var dataset = new recline.Model.Dataset({records: data, fields: fields});
var view = new recline.View.Map({
model: dataset
});
$('.fixtures').append(view.el);
view.render();
dataset.query();
equal(view.state.get('cluster'), true);
view.remove();
});
test('Popup', function () {
var dataset = GeoJSONFixture.getDataset();
var view = new recline.View.Map({
model: dataset
});
$('.fixtures').append(view.el);
view.render();
var marker = view.el.find('.leaflet-marker-icon').first();
assertPresent(marker);
_.values(view.features._layers)[0].fire('click');
var popup = view.el.find('.leaflet-popup-content');
assertPresent(popup);
var text = popup.text();
ok((text.indexOf('geom') === -1))
_.each(view.model.fields.toJSON(),function(field){
if (field.id != 'geom'){
ok((text.indexOf(field.id) !== -1))
}
});
view.remove();
});
test('Popup - Custom', function () {
var dataset = GeoJSONFixture.getDataset();
var view = new recline.View.Map({
model: dataset
});
$('.fixtures').append(view.el);
view.infobox = function(record) {
var html = Mustache.render('<h3>{{x}}</h3>y: {{y}}', record.toJSON());
return html;
};
view.render();
var marker = view.el.find('.leaflet-marker-icon').first();
_.values(view.features._layers)[0].fire('click');
var popup = view.el.find('.leaflet-popup-content');
assertPresent(popup);
var text = popup.html();
ok((text.indexOf('<h3>1</h3>y: 2') != -1))
view.remove();
});
test('geoJsonLayerOptions', function () {
var dataset = GeoJSONFixture.getDataset();
var view = new recline.View.Map({
model: dataset
});
$('.fixtures').append(view.el);
view.geoJsonLayerOptions.point
view.geoJsonLayerOptions.pointToLayer = function(feature, latlng) {
var marker = new L.CircleMarker(latlng, { radius: 8 } );
marker.bindPopup(feature.properties.popupContent);
return marker;
}
view.render();
// TODO: test it somehow?
expect(0);
view.remove();
});
test('MapMenu', function () {
var dataset = Fixture.getDataset();
var controls = new recline.View.MapMenu({
model: dataset,
state: {}
});
assertPresent('.editor-field-type', controls.el);
});
var _getFeaturesCount = function(features){
var cnt = 0;
_.each(features._layers, function(layer) {
cnt++;
});
return cnt;
}
})(this.jQuery);