kibana-with-account
Version:
kibana-with-account is develop based kibana project
382 lines (321 loc) • 13.4 kB
JavaScript
describe('ResponseWriter class', function () {
var _ = require('lodash');
var sinon = require('auto-release-sinon');
var expect = require('expect.js');
var ngMock = require('ngMock');
var Vis;
var Table;
var Buckets;
var Private;
var TableGroup;
var getColumns;
var indexPattern;
var ResponseWriter;
function defineSetup(stubGetColumns) {
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function ($injector) {
Private = $injector.get('Private');
if (stubGetColumns) {
getColumns = sinon.stub();
Private.stub(require('ui/agg_response/tabify/_get_columns'), getColumns);
}
ResponseWriter = Private(require('ui/agg_response/tabify/_response_writer'));
TableGroup = Private(require('ui/agg_response/tabify/_table_group'));
Buckets = Private(require('ui/agg_response/tabify/_buckets'));
Table = Private(require('ui/agg_response/tabify/_table'));
Vis = Private(require('ui/Vis'));
indexPattern = Private(require('fixtures/stubbed_logstash_index_pattern'));
}));
}
describe('Constructor', function () {
defineSetup(true);
it('gets the columns for the vis', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis);
expect(getColumns).to.have.property('callCount', 1);
expect(getColumns.firstCall.args[0]).to.be(vis);
});
it('collects the aggConfigs from each column in aggStack', function () {
var aggs = [
{ type: 'date_histogram', schema: 'segment', params: { field: '@timestamp' } },
{ type: 'terms', schema: 'segment', params: { field: 'extension' } },
{ type: 'avg', schema: 'metric', params: { field: '@timestamp' } }
];
getColumns.returns(aggs.map(function (agg) {
return { aggConfig: agg };
}));
var vis = new Vis(indexPattern, {
type: 'histogram',
aggs: aggs
});
var writer = new ResponseWriter(vis);
expect(writer.aggStack).to.be.an('array');
expect(writer.aggStack).to.have.length(aggs.length);
writer.aggStack.forEach(function (agg, i) {
expect(agg).to.be(aggs[i]);
});
});
it('sets canSplit=true by default', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis);
expect(writer).to.have.property('canSplit', true);
});
it('sets canSplit=false when config says to', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis, { canSplit: false });
expect(writer).to.have.property('canSplit', false);
});
describe('sets partialRows', function () {
it('to the value of the config if set', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var partial = Boolean(Math.round(Math.random()));
var writer = new ResponseWriter(vis, { partialRows: partial });
expect(writer).to.have.property('partialRows', partial);
});
it('to the value of vis.isHierarchical if no config', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var hierarchical = Boolean(Math.round(Math.random()));
sinon.stub(vis, 'isHierarchical').returns(hierarchical);
var writer = new ResponseWriter(vis, {});
expect(writer).to.have.property('partialRows', hierarchical);
});
});
it('starts off with a root TableGroup', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis);
expect(writer.root).to.be.a(TableGroup);
expect(writer.splitStack).to.be.an('array');
expect(writer.splitStack).to.have.length(1);
expect(writer.splitStack[0]).to.be(writer.root);
});
});
describe('', function () {
defineSetup();
describe('#response()', function () {
it('returns the root TableGroup if splitting', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis);
expect(writer.response()).to.be(writer.root);
});
it('returns the first table if not splitting', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis, { canSplit: false });
var table = writer._table();
expect(writer.response()).to.be(table);
});
it('adds columns to all of the tables', function () {
var vis = new Vis(indexPattern, {
type: 'histogram',
aggs: [
{ type: 'terms', params: { field: '_type' }, schema: 'split' },
{ type: 'count', schema: 'metric' }
]
});
var buckets = new Buckets({ buckets: [ { key: 'nginx' }, { key: 'apache' } ] });
var writer = new ResponseWriter(vis);
var tables = [];
writer.split(vis.aggs[0], buckets, function () {
writer.cell(vis.aggs[1], 100, function () {
tables.push(writer.row());
});
});
tables.forEach(function (table) {
expect(table.columns == null).to.be(true);
});
var resp = writer.response();
expect(resp).to.be.a(TableGroup);
expect(resp.tables).to.have.length(2);
var nginx = resp.tables.shift();
expect(nginx).to.have.property('aggConfig', vis.aggs[0]);
expect(nginx).to.have.property('key', 'nginx');
expect(nginx.tables).to.have.length(1);
nginx.tables.forEach(function (table) {
expect(_.contains(tables, table)).to.be(true);
});
var apache = resp.tables.shift();
expect(apache).to.have.property('aggConfig', vis.aggs[0]);
expect(apache).to.have.property('key', 'apache');
expect(apache.tables).to.have.length(1);
apache.tables.forEach(function (table) {
expect(_.contains(tables, table)).to.be(true);
});
tables.forEach(function (table) {
expect(table.columns).to.be.an('array');
expect(table.columns).to.have.length(1);
expect(table.columns[0].aggConfig.type.name).to.be('count');
});
});
});
describe('#split()', function () {
it('with break if the user has specified that splitting is to be disabled', function () {
var vis = new Vis(indexPattern, {
type: 'histogram',
aggs: [
{ type: 'terms', schema: 'split', params: { field: '_type' } },
{ type: 'count', schema: 'metric' }
]
});
var agg = vis.aggs.bySchemaName.split[0];
var buckets = new Buckets({ buckets: [ { key: 'apache' } ]});
var writer = new ResponseWriter(vis, { canSplit: false });
expect(function () {
writer.split(agg, buckets, _.noop);
}).to.throwException(/splitting is disabled/);
});
it('forks the acrStack and rewrites the parents', function () {
var vis = new Vis(indexPattern, {
type: 'histogram',
aggs: [
{ type: 'terms', params: { field: 'extension' }, schema: 'segment' },
{ type: 'terms', params: { field: '_type' }, schema: 'split' },
{ type: 'terms', params: { field: 'machine.os' }, schema: 'segment' },
{ type: 'count', schema: 'metric' }
]
});
var writer = new ResponseWriter(vis, { asAggConfigResults: true });
var extensions = new Buckets({ buckets: [ { key: 'jpg' }, { key: 'png' } ] });
var types = new Buckets({ buckets: [ { key: 'nginx' }, { key: 'apache' } ] });
var os = new Buckets({ buckets: [ { key: 'window' }, { key: 'osx' } ] });
extensions.forEach(function (b, extension) {
writer.cell(vis.aggs[0], extension, function () {
writer.split(vis.aggs[1], types, function () {
os.forEach(function (b, os) {
writer.cell(vis.aggs[2], os, function () {
writer.cell(vis.aggs[3], 200, function () {
writer.row();
});
});
});
});
});
});
var tables = _.flattenDeep(_.pluck(writer.response().tables, 'tables'));
expect(tables.length).to.be(types.length);
// collect the far left acr from each table
var leftAcrs = _.pluck(tables, 'rows[0][0]');
leftAcrs.forEach(function (acr, i, acrs) {
expect(acr.aggConfig).to.be(vis.aggs[0]);
expect(acr.$parent.aggConfig).to.be(vis.aggs[1]);
expect(acr.$parent.$parent).to.be(void 0);
// for all but the last acr, compare to the next
if (i + 1 >= acrs.length) return;
var acr2 = leftAcrs[i + 1];
expect(acr.key).to.be(acr2.key);
expect(acr.value).to.be(acr2.value);
expect(acr.aggConfig).to.be(acr2.aggConfig);
expect(acr.$parent).to.not.be(acr2.$parent);
});
});
});
describe('#cell()', function () {
it('logs a cell in the ResponseWriters row buffer, calls the block arg, then removes the value from the buffer',
function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis);
expect(writer.rowBuffer).to.have.length(0);
writer.cell({}, 500, function () {
expect(writer.rowBuffer).to.have.length(1);
expect(writer.rowBuffer[0]).to.be(500);
});
expect(writer.rowBuffer).to.have.length(0);
});
});
describe('#row()', function () {
it('writes the ResponseWriters internal rowBuffer into a table', function () {
var vis = new Vis(indexPattern, { type: 'histogram', aggs: [] });
var writer = new ResponseWriter(vis);
var table = writer._table();
writer.cell({}, 1, function () {
writer.cell({}, 2, function () {
writer.cell({}, 3, function () {
writer.row();
});
});
});
expect(table.rows).to.have.length(1);
expect(table.rows[0]).to.eql([1, 2, 3]);
});
it('always writes to the table group at the top of the split stack', function () {
var vis = new Vis(indexPattern, {
type: 'histogram',
aggs: [
{ type: 'terms', schema: 'split', params: { field: '_type' } },
{ type: 'terms', schema: 'split', params: { field: 'extension' } },
{ type: 'terms', schema: 'split', params: { field: 'machine.os' } },
{ type: 'count', schema: 'metric' }
]
});
var splits = vis.aggs.bySchemaName.split;
var type = splits[0];
var typeBuckets = new Buckets({ buckets: [ { key: 'nginx' }, { key: 'apache' } ] });
var ext = splits[1];
var extBuckets = new Buckets({ buckets: [ { key: 'jpg' }, { key: 'png' } ] });
var os = splits[2];
var osBuckets = new Buckets({ buckets: [ { key: 'windows' }, { key: 'mac' } ] });
var count = vis.aggs[3];
var writer = new ResponseWriter(vis);
writer.split(type, typeBuckets, function () {
writer.split(ext, extBuckets, function () {
writer.split(os, osBuckets, function (bucket, key) {
writer.cell(count, key === 'windows' ? 1 : 2, function () {
writer.row();
});
});
});
});
var resp = writer.response();
var sum = 0;
var tables = 0;
(function recurse(t) {
if (t.tables) {
// table group
t.tables.forEach(function (tt) {
recurse(tt);
});
} else {
tables += 1;
// table
t.rows.forEach(function (row) {
row.forEach(function (cell) {
sum += cell;
});
});
}
}(resp));
expect(tables).to.be(8);
expect(sum).to.be(12);
});
it('writes partial rows for hierarchical vis', function () {
var vis = new Vis(indexPattern, {
type: 'pie',
aggs: [
{ type: 'terms', schema: 'segment', params: { field: '_type' }},
{ type: 'count', schema: 'metric' }
]
});
var writer = new ResponseWriter(vis);
var table = writer._table();
writer.cell(vis.aggs[0], 'apache', function () {
writer.row();
});
expect(table.rows).to.have.length(1);
expect(table.rows[0]).to.eql(['apache', '']);
});
it('skips partial rows for non-hierarchical vis', function () {
var vis = new Vis(indexPattern, {
type: 'histogram',
aggs: [
{ type: 'terms', schema: 'segment', params: { field: '_type' }},
{ type: 'count', schema: 'metric' }
]
});
var writer = new ResponseWriter(vis);
var table = writer._table();
writer.cell(vis.aggs[0], 'apache', function () {
writer.row();
});
expect(table.rows).to.have.length(0);
});
});
});
});