UNPKG

@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

223 lines (185 loc) 6.69 kB
var _ = require('lodash'); var expect = require('expect.js'); var src = require('requirefrom')('src'); var fromRoot = src('utils/fromRoot'); var KbnServer = src('server/KbnServer'); var validateRequest = require('../validate'); describe('plugins/elasticsearch', function () { var kbnServer; var server; var config; before(function () { kbnServer = new KbnServer({ server: { autoListen: false }, plugins: { scanDirs: [ fromRoot('src/plugins') ] }, logging: { quiet: true }, optimize: { enabled: false } }); return kbnServer.ready() .then(function () { server = kbnServer.server; config = kbnServer.config; }); }); after(function () { kbnServer.close(); }); describe('lib/validate', function () { function del(path, body, valid) { run('delEte', path, body, valid); run('delete', path, body, valid); } function send(path, body, valid) { run('POST', path, body, valid); run('post', path, body, valid); run('PUT', path, body, valid); run('put', path, body, valid); } function run(method, path, body, valid) { if (typeof body === 'boolean') { valid = body; body = null; } if (_.isArray(body)) body = body.map(JSON.stringify).join('\n') + '\n'; if (_.isObject(body)) body = JSON.stringify(body); var pass = false; try { validateRequest(server, { method: method.toLowerCase(), path: path, payload: body }); pass = true; } catch (e) {} // eslint-disable-line no-empty if (pass !== Boolean(valid)) { var msg = 'Expected ' + method + ' ' + path + ' ' + (body ? 'with body ' : '') + 'to ' + (!valid ? 'not ' : '') + 'validate'; if (body) { msg += ' – ' + body; } throw new Error(msg); } } describe('index management', function () { it('allows creating kibana index', function () { send('/' + config.get('kibana.index'), true); }); it('allows deleting the kibana index', function () { del('/' + config.get('kibana.index'), true); }); it('blocks creating a non-kibana index', function () { send('/app-index', false); }); it('blocks deleting a non-kibana indices', function () { del('/app-data', false); }); }); describe('doc management', function () { it('allows indexing to the kibana index', function () { send('/' + config.get('kibana.index'), true); send('/' + config.get('kibana.index') + '/index-patterns', true); send('/' + config.get('kibana.index') + '/index-patterns/pattern-id', true); }); it('allows deleting kibana documents', function () { del('/' + config.get('kibana.index') + '/index-patterns', true); del('/' + config.get('kibana.index') + '/index-patterns/pattern-id', true); }); }); describe('allows any destructive non-bulk requests against kibana index', function () { it('refresh', function () { send('/' + config.get('kibana.index') + '/_refresh', true); }); it('delete', function () { del('/' + config.get('kibana.index') + '/pasta/lasagna', true); }); }); describe('assorted methods that are non-destructive', function () { it('validate', function () { run('GET', '/_search?search_type=count', true); run('GET', '/index/type/id', true); run('GET', '/index/type/_mapping/field/field1', true); run('GET', '/_aliases', true); run('GET', '/_nodes/', true); run('HEAD', '/', true); run('HEAD', '/' + config.get('kibana.index'), true); run('HEAD', '/other-index', true); run('GET', '/_cluster/health', true); run('POST', '/' + config.get('kibana.index') + '/__notRealIndex__/_validate/query?q=foo:bar', true); run('POST', '/_validate', true); run('POST', '/_search', true); }); }); describe('bulk indexing', function () { it('valid', function () { send('/_bulk', [ { create: { _index: config.get('kibana.index'), _type: 'index-pattern' } }, { fields: [] }, { create: { _index: config.get('kibana.index'), _type: 'vis' } }, { aggs: [] } ], true); send('/' + config.get('kibana.index') + '/_bulk', [ // implicit index { create: { _type: 'index-pattern' } }, { fields: [] }, // explicit index { create: { _index: config.get('kibana.index'), _type: 'vis' } }, { aggs: [] } ], true); }); it('rejects bulks including even one other index', function () { send('/' + config.get('kibana.index') + '/_bulk', [ // implicit index { create: { _type: 'index-pattern' } }, { fields: [] }, // explicit index { create: { _index: 'app-data', _type: 'vis' } }, { aggs: [] } ], false); }); it('rejects malformed bulk bodies', function () { send('/_bulk', '{}\n{ "_index": "john" }\n', false); send('/_bulk', '{}\n{}\n', false); send('/_bulk', '{ "field": "value" }', false); send('/_bulk', '{ "field": "v', false); }); }); describe('msearch', function () { it('requires a bulk-formatted body', function () { send('/_msearch', false); send('/_msearch', '{}', false); send('/_msearch', '{}\n{}\n', true); send('/_msearch', '{}\n{}\n{}\n', false); }); it('allows searching any index', function () { send('/app-index/_msearch', [ {}, { query: { match_all: {} } } ], true); send('/app-index/data-type/_msearch', [ {}, { query: { match_all: {} } } ], true); send('/_msearch', [ { _index: 'app-index', _type: 'data-type' }, { query: { match_all: {} } }, { _index: 'IT-index', _type: 'logs' }, { query: { match_all: {} } }, { _index: 'L33t', _type: '?' }, { query: { match_all: {} } }, ], true); }); }); describe('mget', function () { it('requires a valid json body', function () { send('/_mget', false); send('/_mget', '{}', true); send('/_mget', '{}\n{}\n', false); }); it('allows reading from any index', function () { send('/app-index/_mget', { docs: { match_all: {} } }, true); send('/app-index/data-type/_mget', { docs: [ {} ] }, true); }); }); }); });