@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
143 lines (122 loc) • 4.57 kB
JavaScript
describe('IndexPattern#flattenHit()', function () {
var _ = require('lodash');
var expect = require('expect.js');
var ngMock = require('ngMock');
var flattenHit;
var config;
var hit;
var flat;
beforeEach(ngMock.module('kibana'));
beforeEach(ngMock.inject(function (Private, $injector) {
var indexPattern = {
fields: {
byName: {
'message': { type: 'string' },
'geo.coordinates': { type: 'geo_point' },
'geo.dest': { type: 'string' },
'geo.src': { type: 'string' },
'bytes': { type: 'number' },
'@timestamp': { type: 'date' },
'team': { type: 'nested' },
'team.name': { type: 'string' },
'team.role': { type: 'string' },
'user': { type: 'conflict' },
'user.name': { type: 'string' },
'user.id': { type: 'conflict' },
'delta': { type: 'number', scripted: true }
}
}
};
flattenHit = Private(require('ui/index_patterns/_flatten_hit'))(indexPattern).uncached;
config = $injector.get('config');
hit = {
_source: {
message: 'Hello World',
geo: {
coordinates: { lat: 33.4500, lon: 112.0667 },
dest: 'US',
src: 'IN'
},
bytes: 10039103,
'@timestamp': (new Date()).toString(),
tags: [{ text: 'foo' }, { text: 'bar' }],
groups: ['loners'],
noMapping: true,
team: [
{ name: 'foo', role: 'leader' },
{ name: 'bar', role: 'follower' },
{ name: 'baz', role: 'party boy' },
],
user: { name: 'smith', id: 123 }
},
fields: {
delta: [42],
random: [0.12345]
}
};
flat = flattenHit(hit);
}));
it('flattens keys as far down as the mapping goes', function () {
expect(flat).to.have.property('geo.coordinates', hit._source.geo.coordinates);
expect(flat).to.not.have.property('geo.coordinates.lat');
expect(flat).to.not.have.property('geo.coordinates.lon');
expect(flat).to.have.property('geo.dest', 'US');
expect(flat).to.have.property('geo.src', 'IN');
expect(flat).to.have.property('@timestamp', hit._source['@timestamp']);
expect(flat).to.have.property('message', 'Hello World');
expect(flat).to.have.property('bytes', 10039103);
});
it('flattens keys not in the mapping', function () {
expect(flat).to.have.property('noMapping', true);
expect(flat).to.have.property('groups');
expect(flat.groups).to.eql(['loners']);
});
it('flattens conflicting types in the mapping', function () {
expect(flat).to.not.have.property('user');
expect(flat).to.have.property('user.name', hit._source.user.name);
expect(flat).to.have.property('user.id', hit._source.user.id);
});
it('preserves objects in arrays', function () {
expect(flat).to.have.property('tags', hit._source.tags);
});
it('does not enter into nested fields', function () {
expect(flat).to.have.property('team', hit._source.team);
expect(flat).to.not.have.property('team.name');
expect(flat).to.not.have.property('team.role');
expect(flat).to.not.have.property('team[0]');
expect(flat).to.not.have.property('team.0');
});
it('unwraps script fields', function () {
expect(flat).to.have.property('delta', 42);
});
it('assumes that all fields are "computed fields"', function () {
expect(flat).to.have.property('random', 0.12345);
});
it('ignores fields that start with an _ and are not in the metaFields', function () {
config.set('metaFields', ['_metaKey']);
hit.fields._notMetaKey = [100];
flat = flattenHit(hit);
expect(flat).to.not.have.property('_notMetaKey');
});
it('includes underscore-prefixed keys that are in the metaFields', function () {
config.set('metaFields', ['_metaKey']);
hit.fields._metaKey = [100];
flat = flattenHit(hit);
expect(flat).to.have.property('_metaKey', 100);
});
it('adapts to changes in the metaFields', function () {
hit.fields._metaKey = [100];
config.set('metaFields', ['_metaKey']);
flat = flattenHit(hit);
expect(flat).to.have.property('_metaKey', 100);
config.set('metaFields', []);
flat = flattenHit(hit);
expect(flat).to.not.have.property('_metaKey');
});
it('handles fields that are not arrays, like _timestamp', function () {
hit.fields._metaKey = 20000;
config.set('metaFields', ['_metaKey']);
flat = flattenHit(hit);
expect(flat).to.have.property('_metaKey', 20000);
});
});