Skip to content
This repository has been archived by the owner on Jan 31, 2024. It is now read-only.

Commit

Permalink
Separate the task runner and the command line parser (#25)
Browse files Browse the repository at this point in the history
* remove conditionl require in runner

add tasks module to load all tasks, throw if task does not exist

* change task signatures and action handlers

- tasks get plugin, run, and an options object
- action handler controls what goes into each task
- taskRunner wrapper moves the command object to the first argument

* change test command signature

allow files to be passed in, and pass all options to test:server and test:browser

* simplify the task runner

* fix typo in unknownOptions

* expose the task runner as the module's main

this way tasks can be run programatically without going through a cli parser

* add tests for task runner

* remove file passing for testAll

* add serverTestPaths to the plugin config

useful for overriding the value via a config file

* [config] plugin.serverTestPaths -> plugin.serverTestPatterns
  • Loading branch information
w33ble authored and spalger committed Dec 16, 2016
1 parent 3bfc713 commit 82af4df
Show file tree
Hide file tree
Showing 12 changed files with 97 additions and 29 deletions.
35 changes: 30 additions & 5 deletions bin/plugin-helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ var run = require('../lib/run');
var docs = require('../lib/docs');
var enableCollectingUnknownOptions = require('../lib/enable_collecting_unknown_options');

function taskRunner(fn) {
return function actionWrapper() {
var args = [].slice.apply(arguments);
var command = args.pop();
fn.apply(null, [command].concat(args));
};
}

program
.version(pkg.version);

Expand All @@ -15,34 +23,51 @@ enableCollectingUnknownOptions(
.command('start')
.description('Start kibana and have it include this plugin')
.on('--help', docs('start'))
.action(run('start'))
.action(taskRunner(function (command) {
run('start', {
flags: command.unknownOptions
});
}))
);

program
.command('build')
.description('Build a distributable archive')
.on('--help', docs('build'))
.action(run('build'));
.action(taskRunner(function () {
run('build');
}));

program
.command('test')
.description('Run the server and browser tests')
.on('--help', docs('test/all'))
.action(run('test/all'));
.action(taskRunner(function (command, files) {
run('testAll');
}));

program
.command('test:browser')
.description('Run the browser tests in a real web browser')
.option('--dev', 'Enable dev mode, keeps the test server running')
.option('-p, --plugins <plugin-ids>', 'Manually specify which plugins\' test bundles to run')
.on('--help', docs('test/browser'))
.action(run('test/browser'));
.action(taskRunner(function (command) {
run('testBrowser', {
dev: Boolean(command.options.dev),
plugins: command.plugins,
});
}));

program
.command('test:server [files...]')
.description('Run the server tests using mocha')
.on('--help', docs('test/server'))
.action(run('test/server'));
.action(taskRunner(function (command, files) {
run('testServer', {
files: files
});
}));

program
.parse(process.argv);
2 changes: 1 addition & 1 deletion lib/enable_collecting_unknown_options.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module.exports = function enableCollectingUnknownOptions(command) {
command.allowUnknownOption();
command.parseOptions = function (argv) {
let opts = origParse.call(this, argv);
this.unkownOptions = opts.unknown;
this.unknownOptions = opts.unknown;
return opts;
};
};
1 change: 1 addition & 0 deletions lib/plugin_config.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ module.exports = function (root) {
return Object.assign({
root: root,
kibanaRoot: resolve(root, '../kibana'),
serverTestPatterns: ['server/**/__tests__/**/*.js'],
id: pkg.name,
pkg: pkg,
version: pkg.version,
Expand Down
15 changes: 6 additions & 9 deletions lib/run.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
var pluginConfig = require('./plugin_config');
var tasks = require('./tasks');

module.exports = function run(name) {
var action = require('../tasks/' + name);
return function () {
// call the action function with the plugin, then all
// renaining arguments from commander
var plugin = pluginConfig();
var args = [].slice.apply(arguments);
module.exports = function run(name, options) {
var action = tasks[name];
if (!action) throw new Error('Invalid task: "' + name + '"');

action.apply(null, [plugin, run].concat(args));
};
var plugin = pluginConfig();
action(plugin, run, options);
};
30 changes: 30 additions & 0 deletions lib/run.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*eslint-env jest*/

const testTask = jest.fn();
const plugin = { id: 'testPlugin' };

jest.mock('./plugin_config', () => () => plugin);
jest.mock('./tasks', () => {
return { testTask };
});
const run = require('./run');

describe('task runner', () => {
beforeEach(() => jest.resetAllMocks());

it('throw given an invalid task', function () {
const invalidTaskName = 'thisisnotavalidtasknameandneverwillbe';
const runner = () => run(invalidTaskName);

expect(runner).toThrow(/invalid task/i);
});

it('runs specified task with plugin and runner', function () {
run('testTask');

const args = testTask.mock.calls[0];
expect(testTask.mock.calls).toHaveLength(1);
expect(args[0]).toBe(plugin);
expect(args[1]).toBe(run);
});
});
13 changes: 13 additions & 0 deletions lib/tasks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
var buildTask = require('../tasks/build');
var startTask = require('../tasks/start');
var testAllTask = require('../tasks/test/all');
var testBrowserTask = require('../tasks/test/browser');
var testServerTask = require('../tasks/test/server');

module.exports = {
build: buildTask,
start: startTask,
testAll: testAllTask,
testBrowser: testBrowserTask,
testServer: testServerTask,
};
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "@elastic/plugin-helpers",
"version": "5.0.1-patch2",
"description": "Just some helpers for kibana plugin devs.",
"main": "bin/plugin-helpers.js",
"main": "lib/run.js",
"bin": {
"plugin-helpers": "bin/plugin-helpers.js"
},
Expand Down
1 change: 1 addition & 0 deletions tasks/build/build_action.spec.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/*eslint-env jest*/
const resolve = require('path').resolve;
const fs = require('fs');

Expand Down
8 changes: 4 additions & 4 deletions tasks/start/start_action.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
var execFileSync = require('child_process').execFileSync;

module.exports = function (plugin, run, command) {
command = command || {};
module.exports = function (plugin, run, options) {
options = options || {};

var cmd = (process.platform === 'win32') ? 'bin\\kibana.bat' : 'bin/kibana';
var args = ['--dev', '--plugin-path', plugin.root];

if (command.unkownOptions) {
args = args.concat(command.unkownOptions);
if (options.flags) {
args = args.concat(options.flags);
}

execFileSync(cmd, args, {
Expand Down
4 changes: 2 additions & 2 deletions tasks/test/all/test_all_action.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = function testAllAction(plugin, run) {
run('test/server')();
run('test/browser')();
run('testServer');
run('testBrowser');
};
10 changes: 5 additions & 5 deletions tasks/test/browser/test_browser_action.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
var execFileSync = require('child_process').execFileSync;

module.exports = function testBrowserAction(plugin, run, command) {
command = command || {};
module.exports = function testBrowserAction(plugin, run, options) {
options = options || {};

var kbnServerArgs = [
'--kbnServer.plugin-path=' + plugin.root
];

if (command.plugins) {
kbnServerArgs.push('--kbnServer.testsBundle.pluginId=' + command.plugins);
if (options.plugins) {
kbnServerArgs.push('--kbnServer.testsBundle.pluginId=' + options.plugins);
} else {
kbnServerArgs.push('--kbnServer.testsBundle.pluginId=' + plugin.id);
}

var cmd = 'npm';
var task = (command.dev) ? 'test:dev' : 'test:browser';
var task = (options.dev) ? 'test:dev' : 'test:browser';
var args = ['run', task, '--'].concat(kbnServerArgs);
execFileSync(cmd, args, {
cwd: plugin.kibanaRoot,
Expand Down
5 changes: 3 additions & 2 deletions tasks/test/server/test_server_action.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ var resolve = require('path').resolve;
var delimiter = require('path').delimiter;
var execFileSync = require('child_process').execFileSync;

module.exports = function (plugin, run, files) {
module.exports = function (plugin, run, options) {
var kibanaBins = resolve(plugin.kibanaRoot, 'node_modules/.bin');
var mochaSetupJs = resolve(plugin.kibanaRoot, 'test/mocha_setup.js');
options = options || {};

var cmd = 'mocha';
var testPaths = (files.length) ? files : 'server/**/__tests__/**/*.js';
var testPaths = (options.files && options.files.length) ? options.files : plugin.serverTestPatterns;
var args = ['--require', mochaSetupJs].concat(testPaths);
var path = `${kibanaBins}${delimiter}${process.env.PATH}`;

Expand Down

0 comments on commit 82af4df

Please sign in to comment.