kibana-with-account
Version:
kibana-with-account is develop based kibana project
180 lines (152 loc) • 6.38 kB
JavaScript
var _ = require('lodash');
var expect = require('expect.js');
var ngMock = require('ngMock');
describe('GeoJson Agg Response Converter', function () {
var vis;
var tabify;
var convert;
var esResponse;
var aggs;
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private) {
var Vis = Private(require('ui/Vis'));
var indexPattern = Private(require('fixtures/stubbed_logstash_index_pattern'));
esResponse = Private(require('fixtures/agg_resp/geohash_grid'));
tabify = Private(require('ui/agg_response/tabify/tabify'));
convert = Private(require('ui/agg_response/geo_json/geo_json'));
vis = new Vis(indexPattern, {
type: 'tile_map',
aggs: [
{ schema: 'metric', type: 'avg', params: { field: 'bytes' } },
{ schema: 'split', type: 'terms', params: { field: '@tags' } },
{ schema: 'segment', type: 'geohash_grid', params: { field: 'geo.coordinates', precision: 3 } }
],
params: {
isDesaturated: true,
mapType: 'Scaled%20Circle%20Markers'
}
});
aggs = {
metric: vis.aggs[0],
split: vis.aggs[1],
geo: vis.aggs[2]
};
}));
[ { asAggConfigResults: true }, { asAggConfigResults: false } ].forEach(function (tableOpts) {
function makeTable() {
return _.sample(_.sample(tabify(vis, esResponse, tableOpts).tables).tables);
}
function makeSingleChart(table) {
return convert(vis, table || makeTable(), tableOpts);
}
function makeGeoJson() {
return makeSingleChart().geoJson;
}
describe('with table ' + JSON.stringify(tableOpts), function () {
it('outputs a chart', function () {
var table = makeTable();
var chart = makeSingleChart(table);
expect(chart).to.only.have.keys(
'title',
'tooltipFormatter',
'valueFormatter',
'geohashGridAgg',
'geoJson'
);
expect(chart.title).to.be(table.title());
expect(chart.tooltipFormatter).to.be.a('function');
expect(chart.valueFormatter).to.be(aggs.metric.fieldFormatter());
expect(chart.geohashGridAgg).to.be(aggs.geo);
expect(chart.geoJson).to.be.an('object');
});
it('outputs geohash points as features in a feature collection', function () {
var table = makeTable();
var chart = makeSingleChart(table);
var geoJson = chart.geoJson;
expect(geoJson.type).to.be('FeatureCollection');
expect(geoJson.features).to.be.an('array');
expect(geoJson.features).to.have.length(table.rows.length);
});
it('exports a bunch of properties about the geo hash grid', function () {
var geoJson = makeGeoJson();
var props = geoJson.properties;
// props
expect(props).to.be.an('object');
expect(props).to.have.keys('min', 'max');
// props.min
expect(props.min).to.be.a('number');
expect(props.min).to.be.greaterThan(0);
// props.max
expect(props.max).to.be.a('number');
expect(props.max).to.be.greaterThan(0);
});
describe('properties', function () {
describe('includes one feature per row in the table', function () {
this.timeout(60000);
var table;
var chart;
var geoColI;
var metricColI;
before(function () {
table = makeTable();
chart = makeSingleChart(table);
geoColI = _.findIndex(table.columns, { aggConfig: aggs.geo });
metricColI = _.findIndex(table.columns, { aggConfig: aggs.metric });
});
it('should be geoJson format', function () {
table.rows.forEach(function (row, i) {
var feature = chart.geoJson.features[i];
expect(feature).to.have.property('geometry');
expect(feature.geometry).to.be.an('object');
expect(feature).to.have.property('properties');
expect(feature.properties).to.be.an('object');
});
});
it('should have valid geometry data', function () {
table.rows.forEach(function (row, i) {
var geometry = chart.geoJson.features[i].geometry;
expect(geometry.type).to.be('Point');
expect(geometry).to.have.property('coordinates');
expect(geometry.coordinates).to.be.an('array');
expect(geometry.coordinates).to.have.length(2);
expect(geometry.coordinates[0]).to.be.a('number');
expect(geometry.coordinates[1]).to.be.a('number');
});
});
it('should have value properties data', function () {
table.rows.forEach(function (row, i) {
var props = chart.geoJson.features[i].properties;
var keys = ['value', 'geohash', 'aggConfigResult', 'rectangle', 'center'];
expect(props).to.be.an('object');
expect(props).to.only.have.keys(keys);
expect(props.geohash).to.be.a('string');
if (props.value != null) expect(props.value).to.be.a('number');
});
});
it('should use latLng in properties and lngLat in geometry', function () {
table.rows.forEach(function (row, i) {
var geometry = chart.geoJson.features[i].geometry;
var props = chart.geoJson.features[i].properties;
expect(props.center).to.eql(geometry.coordinates.slice(0).reverse());
});
});
it('should handle both AggConfig and non-AggConfig results', function () {
table.rows.forEach(function (row, i) {
var props = chart.geoJson.features[i].properties;
if (tableOpts.asAggConfigResults) {
expect(props.aggConfigResult).to.be(row[metricColI]);
expect(props.value).to.be(row[metricColI].value);
expect(props.geohash).to.be(row[geoColI].value);
} else {
expect(props.aggConfigResult).to.be(null);
expect(props.value).to.be(row[metricColI]);
expect(props.geohash).to.be(row[geoColI]);
}
});
});
});
});
});
});
describe('geoJson tooltip formatter', function () {});
});