mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
[ui] add tests for replaceInjectedVars()
This commit is contained in:
parent
33aa9def6e
commit
44714533e2
5 changed files with 143 additions and 0 deletions
|
@ -193,6 +193,7 @@
|
|||
"image-diff": "1.6.0",
|
||||
"intern": "3.2.3",
|
||||
"istanbul-instrumenter-loader": "0.1.3",
|
||||
"jsdom": "9.8.3",
|
||||
"karma": "1.2.0",
|
||||
"karma-chrome-launcher": "0.2.0",
|
||||
"karma-coverage": "0.5.1",
|
||||
|
|
13
src/ui/__tests__/fixtures/test_app/index.js
Normal file
13
src/ui/__tests__/fixtures/test_app/index.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
module.exports = kibana => new kibana.Plugin({
|
||||
uiExports: {
|
||||
app: {
|
||||
name: 'test_app',
|
||||
main: 'plugins/test_app/index.js',
|
||||
injectVars() {
|
||||
return {
|
||||
from_test_app: true
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
4
src/ui/__tests__/fixtures/test_app/package.json
Normal file
4
src/ui/__tests__/fixtures/test_app/package.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"name": "test_app",
|
||||
"version": "kibana"
|
||||
}
|
0
src/ui/__tests__/fixtures/test_app/public/index.js
Normal file
0
src/ui/__tests__/fixtures/test_app/public/index.js
Normal file
125
src/ui/__tests__/ui_exports_replace_injected_vars.js
Normal file
125
src/ui/__tests__/ui_exports_replace_injected_vars.js
Normal file
|
@ -0,0 +1,125 @@
|
|||
import { resolve } from 'path';
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import expect from 'expect.js';
|
||||
import sinon from 'sinon';
|
||||
import jsdom from 'jsdom';
|
||||
import { noop } from 'lodash';
|
||||
|
||||
import KbnServer from '../../server/kbn_server';
|
||||
|
||||
const getInjectedVarsFromResponse = (resp) => {
|
||||
const document = jsdom.jsdom(resp.payload);
|
||||
const data = document.querySelector('kbn-initial-state').getAttribute('data');
|
||||
return JSON.parse(data).vars;
|
||||
};
|
||||
|
||||
const injectReplacer = (kbnServer, replacer) => {
|
||||
// normally the replacer would be defined in a plugin's uiExports,
|
||||
// but that requires stubbing out an entire plugin directory for
|
||||
// each test, so we fake it and jam the replacer into uiExports
|
||||
kbnServer.uiExports.injectedVarsReplacers.push(replacer);
|
||||
};
|
||||
|
||||
describe('UiExports', function () {
|
||||
describe('#replaceInjectedVars', function () {
|
||||
this.slow(2000);
|
||||
this.timeout(10000);
|
||||
|
||||
let kbnServer;
|
||||
beforeEach(async () => {
|
||||
kbnServer = new KbnServer({
|
||||
server: { port: 0 }, // pick a random open port
|
||||
logging: { silent: true }, // no logs
|
||||
optimize: { enabled: false },
|
||||
uiSettings: { enabled: false },
|
||||
plugins: {
|
||||
paths: [resolve(__dirname, './fixtures/test_app')] // inject an app so we can hit /app/{id}
|
||||
},
|
||||
});
|
||||
|
||||
await kbnServer.ready();
|
||||
kbnServer.status.get('ui settings').state = 'green';
|
||||
kbnServer.server.decorate('server', 'uiSettings', () => {
|
||||
return { getDefaults: noop };
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await kbnServer.close();
|
||||
kbnServer = null;
|
||||
});
|
||||
|
||||
it('allows sync replacing of injected vars', async () => {
|
||||
injectReplacer(kbnServer, () => ({ a: 1 }));
|
||||
|
||||
const resp = await kbnServer.inject('/app/test_app');
|
||||
const injectedVars = getInjectedVarsFromResponse(resp);
|
||||
|
||||
expect(injectedVars).to.eql({ a: 1 });
|
||||
});
|
||||
|
||||
it('allows async replacing of injected vars', async () => {
|
||||
const asyncThing = () => delay(100).return('world');
|
||||
|
||||
injectReplacer(kbnServer, async () => {
|
||||
return {
|
||||
hello: await asyncThing()
|
||||
};
|
||||
});
|
||||
|
||||
const resp = await kbnServer.inject('/app/test_app');
|
||||
const injectedVars = getInjectedVarsFromResponse(resp);
|
||||
|
||||
expect(injectedVars).to.eql({
|
||||
hello: 'world'
|
||||
});
|
||||
});
|
||||
|
||||
it('passes originalInjectedVars, request, and server to replacer', async () => {
|
||||
const stub = sinon.stub();
|
||||
injectReplacer(kbnServer, () => ({ foo: 'bar' }));
|
||||
injectReplacer(kbnServer, stub);
|
||||
|
||||
await kbnServer.inject('/app/test_app');
|
||||
|
||||
sinon.assert.calledOnce(stub);
|
||||
expect(stub.firstCall.args[0]).to.eql({ foo: 'bar' }); // originalInjectedVars
|
||||
expect(stub.firstCall.args[1]).to.have.property('path', '/app/test_app'); // request
|
||||
expect(stub.firstCall.args[1]).to.have.property('server', kbnServer.server); // request
|
||||
expect(stub.firstCall.args[2]).to.be(kbnServer.server);
|
||||
});
|
||||
|
||||
it('calls the methods sequentially', async () => {
|
||||
injectReplacer(kbnServer, () => ({ name: '' }));
|
||||
injectReplacer(kbnServer, orig => ({ name: orig.name + 's' }));
|
||||
injectReplacer(kbnServer, orig => ({ name: orig.name + 'a' }));
|
||||
injectReplacer(kbnServer, orig => ({ name: orig.name + 'm' }));
|
||||
|
||||
const resp = await kbnServer.inject('/app/test_app');
|
||||
const injectedVars = getInjectedVarsFromResponse(resp);
|
||||
|
||||
expect(injectedVars).to.eql({ name: 'sam' });
|
||||
});
|
||||
|
||||
it('propogates errors thrown in replacers', async () => {
|
||||
injectReplacer(kbnServer, async () => {
|
||||
await delay(100);
|
||||
throw new Error('replacer failed');
|
||||
});
|
||||
|
||||
const resp = await kbnServer.inject('/app/test_app');
|
||||
expect(resp).to.have.property('statusCode', 500);
|
||||
});
|
||||
|
||||
it('starts off with the injected vars for the app merged with the default injected vars', async () => {
|
||||
const stub = sinon.stub();
|
||||
injectReplacer(kbnServer, stub);
|
||||
kbnServer.uiExports.defaultInjectedVars.from_defaults = true;
|
||||
|
||||
const resp = await kbnServer.inject('/app/test_app');
|
||||
sinon.assert.calledOnce(stub);
|
||||
expect(stub.firstCall.args[0]).to.eql({ from_defaults: true, from_test_app: true });
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue