@spalger/kibana
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
195 lines (159 loc) • 6.16 kB
JavaScript
var angular = require('angular');
var expect = require('expect.js');
var ngMock = require('ngMock');
var _ = require('lodash');
var $ = require('jquery');
var L = require('leaflet');
var sinon = require('auto-release-sinon');
var geoJsonData = require('fixtures/vislib/mock_data/geohash/_geo_json');
// // Data
// var dataArray = [
// ['geojson', require('fixtures/vislib/mock_data/geohash/_geo_json')],
// ['columns', require('fixtures/vislib/mock_data/geohash/_columns')],
// ['rows', require('fixtures/vislib/mock_data/geohash/_rows')],
// ];
// // TODO: Test the specific behavior of each these
// var mapTypes = [
// 'Scaled Circle Markers',
// 'Shaded Circle Markers',
// 'Shaded Geohash Grid',
// 'Heatmap'
// ];
describe('TileMap Map Tests', function () {
this.timeout(0);
var $mockMapEl = $('<div>');
var TileMapMap;
var leafletStubs = {};
var leafletMocks = {};
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private) {
// mock parts of leaflet
leafletMocks.tileLayer = { on: sinon.stub() };
leafletMocks.map = { on: sinon.stub() };
leafletStubs.tileLayer = sinon.stub(L, 'tileLayer', _.constant(leafletMocks.tileLayer));
leafletStubs.map = sinon.stub(L, 'map', _.constant(leafletMocks.map));
TileMapMap = Private(require('ui/vislib/visualizations/_map'));
}));
describe('instantiation', function () {
var map;
var createStub;
beforeEach(function () {
createStub = sinon.stub(TileMapMap.prototype, '_createMap', _.noop);
map = new TileMapMap($mockMapEl, geoJsonData, {});
});
it('should create the map', function () {
expect(createStub.callCount).to.equal(1);
});
it('should add zoom controls', function () {
var mapOptions = createStub.firstCall.args[0];
expect(mapOptions).to.be.an('object');
if (mapOptions.zoomControl) expect(mapOptions.zoomControl).to.be.ok();
else expect(mapOptions.zoomControl).to.be(undefined);
});
});
describe('createMap', function () {
var map;
var mapStubs;
beforeEach(function () {
mapStubs = {
destroy: sinon.stub(Map.prototype, 'destroy'),
attachEvents: sinon.stub(Map.prototype, '_attachEvents'),
addMarkers: sinon.stub(Map.prototype, '_addMarkers'),
};
map = new Map($mockMapEl, geoJsonData, {});
});
it('should create the create leaflet objects', function () {
expect(leafletStubs.tileLayer.callCount).to.equal(1);
expect(leafletStubs.map.callCount).to.equal(1);
var callArgs = leafletStubs.map.firstCall.args;
var mapOptions = callArgs[1];
expect(callArgs[0]).to.be($mockMapEl.get(0));
expect(mapOptions).to.have.property('zoom');
expect(mapOptions).to.have.property('center');
});
it('should attach events and add markers', function () {
expect(mapStubs.attachEvents.callCount).to.equal(1);
expect(mapStubs.addMarkers.callCount).to.equal(1);
});
it('should call destroy only if a map exists', function () {
expect(mapStubs.destroy.callCount).to.equal(0);
map._createMap({});
expect(mapStubs.destroy.callCount).to.equal(1);
});
});
describe('attachEvents', function () {
var map;
beforeEach(function () {
sinon.stub(Map.prototype, '_createMap', function () {
this._tileLayer = leafletMocks.tileLayer;
this.map = leafletMocks.map;
this._attachEvents();
});
map = new Map($mockMapEl, geoJsonData, {});
});
it('should attach interaction events', function () {
var expectedTileEvents = ['tileload'];
var expectedMapEvents = ['draw:created', 'moveend', 'zoomend', 'unload'];
var matchedEvents = {
tiles: 0,
maps: 0,
};
_.times(leafletMocks.tileLayer.on.callCount, function (index) {
var ev = leafletMocks.tileLayer.on.getCall(index).args[0];
if (_.includes(expectedTileEvents, ev)) matchedEvents.tiles++;
});
expect(matchedEvents.tiles).to.equal(expectedTileEvents.length);
_.times(leafletMocks.map.on.callCount, function (index) {
var ev = leafletMocks.map.on.getCall(index).args[0];
if (_.includes(expectedMapEvents, ev)) matchedEvents.maps++;
});
expect(matchedEvents.maps).to.equal(expectedMapEvents.length);
});
});
describe('addMarkers', function () {
var map;
var createStub;
beforeEach(function () {
sinon.stub(Map.prototype, '_createMap');
createStub = sinon.stub(Map.prototype, '_createMarkers', _.constant({ addLegend: _.noop }));
map = new Map($mockMapEl, geoJsonData, {});
});
it('should pass the map options to the marker', function () {
map._addMarkers();
var args = createStub.firstCall.args[0];
expect(args).to.have.property('tooltipFormatter');
expect(args).to.have.property('valueFormatter');
expect(args).to.have.property('attr');
});
it('should destroy existing markers', function () {
var destroyStub = sinon.stub();
map._markers = { destroy: destroyStub };
map._addMarkers();
expect(destroyStub.callCount).to.be(1);
});
});
describe('getDataRectangles', function () {
var map;
beforeEach(function () {
sinon.stub(Map.prototype, '_createMap');
map = new Map($mockMapEl, geoJsonData, {});
});
it('should return an empty array if no data', function () {
map = new Map($mockMapEl, {}, {});
var rects = map._getDataRectangles();
expect(rects).to.have.length(0);
});
it('should return an array of arrays of rectangles', function () {
var rects = map._getDataRectangles();
_.times(5, function () {
var index = _.random(rects.length - 1);
var rect = rects[index];
var featureRect = geoJsonData.geoJson.features[index].properties.rectangle;
expect(rect.length).to.equal(featureRect.length);
// should swap the array
var checkIndex = _.random(rect.length - 1);
expect(rect[checkIndex]).to.eql(featureRect[checkIndex]);
});
});
});
});