@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
291 lines (248 loc) • 8.08 kB
JavaScript
var d3 = require('d3');
var angular = require('angular');
var expect = require('expect.js');
var ngMock = require('ngMock');
var _ = require('lodash');
var $ = require('jquery');
var fixtures = require('fixtures/fake_hierarchical_data');
var rowAgg = [
{ type: 'avg', schema: 'metric', params: { field: 'bytes' } },
{ type: 'terms', schema: 'split', params: { field: 'extension', rows: true }},
{ type: 'terms', schema: 'segment', params: { field: 'machine.os' }},
{ type: 'terms', schema: 'segment', params: { field: 'geo.src' }}
];
var colAgg = [
{ type: 'avg', schema: 'metric', params: { field: 'bytes' } },
{ type: 'terms', schema: 'split', params: { field: 'extension', row: false }},
{ type: 'terms', schema: 'segment', params: { field: 'machine.os' }},
{ type: 'terms', schema: 'segment', params: { field: 'geo.src' }}
];
var sliceAgg = [
{ type: 'avg', schema: 'metric', params: { field: 'bytes' } },
{ type: 'terms', schema: 'segment', params: { field: 'machine.os' }},
{ type: 'terms', schema: 'segment', params: { field: 'geo.src' }}
];
var aggArray = [
rowAgg,
colAgg,
sliceAgg
];
var names = [
'rows',
'columns',
'slices'
];
var sizes = [
0,
5,
15,
30,
60,
120
];
describe('No global chart settings', function () {
var visLibParams1 = {
el: '<div class=chart1></div>',
type: 'pie',
addLegend: true,
addTooltip: true
};
var visLibParams2 = {
el: '<div class=chart2></div>',
type: 'pie',
addLegend: true,
addTooltip: true
};
var chart1;
var chart2;
var Vis;
var indexPattern;
var buildHierarchicalData;
var data1;
var data2;
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private) {
chart1 = Private(require('fixtures/vislib/_vis_fixture'))(visLibParams1);
chart2 = Private(require('fixtures/vislib/_vis_fixture'))(visLibParams2);
Vis = Private(require('ui/Vis'));
indexPattern = Private(require('fixtures/stubbed_logstash_index_pattern'));
buildHierarchicalData = Private(require('ui/agg_response/hierarchical/build_hierarchical_data'));
var id1 = 1;
var id2 = 1;
var stubVis1 = new Vis(indexPattern, {
type: 'pie',
aggs: rowAgg
});
var stubVis2 = new Vis(indexPattern, {
type: 'pie',
aggs: colAgg
});
// We need to set the aggs to a known value.
_.each(stubVis1.aggs, function (agg) {
agg.id = 'agg_' + id1++;
});
_.each(stubVis2.aggs, function (agg) {
agg.id = 'agg_' + id2++;
});
data1 = buildHierarchicalData(stubVis1, fixtures.threeTermBuckets);
data2 = buildHierarchicalData(stubVis2, fixtures.threeTermBuckets);
chart1.render(data1);
chart2.render(data2);
}));
afterEach(function () {
chart1 = null;
chart2 = null;
});
it('should render chart titles for all charts', function () {
expect($(chart1.el).find('.y-axis-chart-title').length).to.be(1);
expect($(chart2.el).find('.x-axis-chart-title').length).to.be(1);
});
describe('_validatePieData method', function () {
var allZeros = [
{ slices: { children: [] } },
{ slices: { children: [] } },
{ slices: { children: [] } }
];
var someZeros = [
{ slices: { children: [{}] } },
{ slices: { children: [{}] } },
{ slices: { children: [] } }
];
var noZeros = [
{ slices: { children: [{}] } },
{ slices: { children: [{}] } },
{ slices: { children: [{}] } }
];
it('should throw an error when all charts contain zeros', function () {
expect(function () {
chart1.ChartClass.prototype._validatePieData(allZeros);
}).to.throwError();
});
it('should not throw an error when only some or no charts contain zeros', function () {
expect(function () {
chart1.ChartClass.prototype._validatePieData(someZeros);
}).to.not.throwError();
expect(function () {
chart1.ChartClass.prototype._validatePieData(noZeros);
}).to.not.throwError();
});
});
});
aggArray.forEach(function (dataAgg, i) {
describe('Vislib PieChart Class Test Suite for ' + names[i] + ' data', function () {
var visLibParams = {
type: 'pie',
addLegend: true,
addTooltip: true
};
var vis;
var Vis;
var indexPattern;
var buildHierarchicalData;
var data;
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private) {
vis = Private(require('fixtures/vislib/_vis_fixture'))(visLibParams);
Vis = Private(require('ui/Vis'));
indexPattern = Private(require('fixtures/stubbed_logstash_index_pattern'));
buildHierarchicalData = Private(require('ui/agg_response/hierarchical/build_hierarchical_data'));
var id = 1;
var stubVis = new Vis(indexPattern, {
type: 'pie',
aggs: dataAgg
});
// We need to set the aggs to a known value.
_.each(stubVis.aggs, function (agg) { agg.id = 'agg_' + id++; });
data = buildHierarchicalData(stubVis, fixtures.threeTermBuckets);
vis.render(data);
}));
afterEach(function () {
$(vis.el).remove();
vis = null;
});
describe('addPathEvents method', function () {
var path;
var d3selectedPath;
var onClick;
var onMouseOver;
beforeEach(function () {
vis.handler.charts.forEach(function (chart) {
path = $(chart.chartEl).find('path')[0];
d3selectedPath = d3.select(path)[0][0];
// d3 instance of click and hover
onClick = (!!d3selectedPath.__onclick);
onMouseOver = (!!d3selectedPath.__onmouseover);
});
});
it('should attach a click event', function () {
vis.handler.charts.forEach(function () {
expect(onClick).to.be(true);
});
});
it('should attach a hover event', function () {
vis.handler.charts.forEach(function () {
expect(onMouseOver).to.be(true);
});
});
});
describe('addPath method', function () {
var width;
var height;
var svg;
var slices;
beforeEach(ngMock.inject(function () {
vis.handler.charts.forEach(function (chart) {
width = $(chart.chartEl).width();
height = $(chart.chartEl).height();
svg = d3.select($(chart.chartEl).find('svg')[0]);
slices = chart.chartData.slices;
});
}));
it('should return an SVG object', function () {
vis.handler.charts.forEach(function (chart) {
expect(_.isObject(chart.addPath(width, height, svg, slices))).to.be(true);
});
});
it('should draw path elements', function () {
vis.handler.charts.forEach(function (chart) {
// test whether path elements are drawn
expect($(chart.chartEl).find('path').length).to.be.greaterThan(0);
});
});
});
describe('draw method', function () {
it('should return a function', function () {
vis.handler.charts.forEach(function (chart) {
expect(_.isFunction(chart.draw())).to.be(true);
});
});
});
sizes.forEach(function (size) {
describe('containerTooSmall error', function () {
it('should throw an error', function () {
// 20px is the minimum height and width
vis.handler.charts.forEach(function (chart) {
$(chart.chartEl).height(size);
$(chart.chartEl).width(size);
if (size < 20) {
expect(function () {
chart.render();
}).to.throwError();
}
});
});
it('should not throw an error', function () {
vis.handler.charts.forEach(function (chart) {
$(chart.chartEl).height(size);
$(chart.chartEl).width(size);
if (size > 20) {
expect(function () {
chart.render();
}).to.not.throwError();
}
});
});
});
});
});
});