bricks-cli
Version:
Command line tool for developing ambitious ember.js apps
502 lines (382 loc) • 16 kB
JavaScript
;
var assert = require('../../helpers/assert');
var stub = require('../../helpers/stub').stub;
var MockUI = require('../../helpers/mock-ui');
var MockAnalytics = require('../../helpers/mock-analytics');
var CLI = require('../../../lib/cli/cli');
var ui;
var analytics;
var commands;
var argv;
var isWithinProject;
// helper to similate running the CLI
function ember(args) {
return new CLI({
ui: ui,
analytics: analytics,
testing: true
}).run({
tasks: {},
commands: commands,
cliArgs: args || [],
project: {
isEmberCLIProject: function() { // similate being inside or outside of a project
return isWithinProject;
}
}
});
}
function stubValidateAndRun(name) {
commands[name] = require('../../../lib/commands/' + name);
return stub(commands[name].prototype, 'validateAndRun');
}
function stubRun(name) {
commands[name] = require('../../../lib/commands/' + name);
return stub(commands[name].prototype, 'run');
}
beforeEach(function() {
ui = new MockUI();
analytics = new MockAnalytics();
argv = [];
commands = { };
isWithinProject = true;
});
afterEach(function() {
for(var key in commands) {
if (!commands.hasOwnProperty(key)) { continue; }
if (commands[key].prototype.validateAndRun.restore) {
commands[key].prototype.validateAndRun.restore();
}
if (commands[key].prototype.run.restore) {
commands[key].prototype.run.restore();
}
}
delete process.env.EMBER_ENV;
commands = argv = ui = undefined;
});
function assertVersion(string, message) {
assert(/version:\s\d+\.\d+\.\d+/.test(string), message ||
('expected version, got: ' + string));
}
describe('Unit: CLI', function() {
it('exists', function() {
assert(CLI);
});
it('ember', function() {
var help = stubValidateAndRun('help');
return ember().then(function() {
assert.equal(help.called, 1, 'expected help to be called once');
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra output');
});
});
describe('help', function(){
['--help', '-h'].forEach(function(command){
it('ember ' + command, function() {
var help = stubValidateAndRun('help');
return ember([command]).then(function() {
assert.equal(help.called, 1, 'expected help to be called once');
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra output');
});
});
it('ember new ' + command, function() {
var help = stubValidateAndRun('help');
var newCommand = stubValidateAndRun('new');
return ember(['new', command]).then(function() {
assert.equal(help.called, 1, 'expected help to be called once');
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra output');
assert.equal(newCommand.called, 0, 'expected the new command to never be called');
});
});
});
});
['--version', '-v'].forEach(function(command){
it('ember ' + command, function() {
var version = stubValidateAndRun('version');
return ember([command]).then(function() {
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra output');
assert.equal(version.called, 1, 'expected version to be called once');
});
});
});
describe('server', function() {
['server','s'].forEach(function(command) {
it('expects version in UI output', function() {
var server = stubRun('serve');
return ember([command]).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.deepEqual(output.length, 1, 'expected no extra of output');
});
});
it('ember ' + command + ' --port 9999', function() {
var server = stubRun('serve');
return ember([command, '--port', '9999']).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.port, 9999, 'expected port 9999, was ' + options.port);
});
});
it('ember ' + command + ' --host localhost', function() {
var server = stubRun('serve');
return ember(['server', '--host', 'localhost']).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.host, 'localhost', 'correct localhost');
});
});
it('ember ' + command + ' --port 9292 --host localhost', function() {
var server = stubRun('serve');
return ember([command, '--port', '9292', '--host', 'localhost']).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.host, 'localhost', 'correct localhost');
assert.equal(options.port, '9292', 'correct localhost');
});
});
it('ember ' + command + ' --proxy http://localhost:3000/', function() {
var server = stubRun('serve');
return ember([command, '--proxy', 'http://localhost:3000/']).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.proxy, 'http://localhost:3000/', 'correct proxy url');
});
});
it('ember ' + command + ' --watcher events', function() {
var server = stubRun('serve');
return ember([command, '--watcher', 'events']).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.watcher, 'events', 'correct watcher type');
});
});
it('ember ' + command + ' --watcher polling', function() {
var server = stubRun('serve');
return ember([command, '--watcher', 'polling']).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.watcher, 'polling', 'correct watcher type');
});
});
it('ember ' + command, function() {
var server = stubRun('serve');
return ember([command]).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.watcher, 'events', 'correct watcher type');
});
});
['production', 'development', 'foo'].forEach(function(env) {
it('ember ' + command + ' --environment ' + env, function() {
var server = stubRun('serve');
return ember([command, '--environment', env]).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
var options = server.calledWith[0][0];
assert.equal(options.environment, env, 'correct environment');
});
});
});
['development', 'foo'].forEach(function(env) {
it('ember ' + command + ' --environment ' + env, function() {
var server = stubRun('serve');
process.env.EMBER_ENV='production';
return ember([command, '--environment', env]).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
assert.equal(process.env.EMBER_ENV, 'production', 'uses EMBER_ENV over environment');
});
});
});
['production', 'development', 'foo'].forEach(function(env) {
it('EMBER_ENV=' + env + ' ember ' + command, function() {
var server = stubRun('serve');
process.env.EMBER_ENV=env;
return ember([command]).then(function() {
assert.equal(server.called, 1, 'expected the server command to be run');
assert.equal(process.env.EMBER_ENV, env, 'correct environment');
});
});
});
});
});
describe('generate', function() {
['generate', 'g'].forEach(function(command) {
it('ember ' + command + ' foo bar baz', function() {
var generate = stubRun('generate');
return ember([command, 'foo', 'bar', 'baz']).then(function() {
assert.equal(generate.called, 1, 'expected the generate command to be run');
var args = generate.calledWith[0][1];
assert.deepEqual(args, ['foo', 'bar', 'baz']);
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra of output');
});
});
});
});
describe('init', function() {
['init', 'i'].forEach(function(command) {
it('ember ' + command, function() {
var init = stubValidateAndRun('init');
return ember([command]).then(function() {
assert.equal(init.called, 1, 'expected the init command to be run');
});
});
it('ember ' + command + ' <app-name>', function() {
var init = stubRun('init');
return ember([command, 'my-blog']).then(function() {
var args = init.calledWith[0][1];
assert.equal(init.called, 1, 'expected the init command to be run');
assert.deepEqual(args, ['my-blog'], 'expect first arg to be the app name');
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra of output');
});
});
});
});
describe('new', function() {
it('ember new', function() {
isWithinProject = false;
var newCommand = stubRun('new');
return ember(['new']).then(function() {
assert.equal(newCommand.called, 1, 'expected the new command to be run');
});
});
it('ember new MyApp', function() {
isWithinProject = false;
var newCommand = stubRun('new');
return ember(['new', 'MyApp']).then(function() {
assert.equal(newCommand.called, 1, 'expected the new command to be run');
var args = newCommand.calledWith[0][1];
assert.deepEqual(args, ['MyApp']);
});
});
});
describe('update', function() {
it('ember update', function() {
var update = stubRun('update');
return ember(['update']).then(function() {
assert.equal(update.called, 1, 'expected the update command to be run');
});
});
});
describe('build', function() {
it('ember build', function() {
var build = stubRun('build');
return ember(['build']).then(function() {
assert.equal(build.called, 1, 'expected the build command to be run');
var options = build.calledWith[0][0];
assert.equal(options.watch, false, 'expected the default watch flag to be false');
});
});
it('ember build --watch', function() {
var build = stubRun('build');
return ember(['build', '--watch']).then(function() {
var options = build.calledWith[0][0];
assert.equal(options.watch, true, 'expected the watch flag to be true');
});
});
['production', 'development', 'baz'].forEach(function(env){
it('ember build --environment ' + env, function() {
var build = stubRun('build');
return ember(['build', '--environment', env]).then(function() {
assert.equal(build.called, 1, 'expected the build command to be run');
var options = build.calledWith[0][0];
assert.equal(options.environment, env, 'correct environment');
});
});
});
['development', 'baz'].forEach(function(env){
it('EMBER_ENV=production ember build --environment ' + env, function() {
var build = stubRun('build');
process.env.EMBER_ENV = 'production';
return ember(['build', '--environment', env]).then(function() {
assert.equal(build.called, 1, 'expected the build command to be run');
assert.equal(process.env.EMBER_ENV, 'production', 'uses EMBER_ENV over environment');
});
});
});
['production', 'development', 'baz'].forEach(function(env){
it('EMBER_ENV=' + env + ' ember build ', function() {
var build = stubRun('build');
process.env.EMBER_ENV=env;
return ember(['build']).then(function() {
assert.equal(build.called, 1, 'expected the build command to be run');
assert.equal(process.env.EMBER_ENV, env, 'correct environment');
});
});
});
});
it('ember <valid command>', function() {
var help = stubValidateAndRun('help');
var serve = stubValidateAndRun('serve');
return ember(['serve']).then(function() {
assert.equal(help.called, 0, 'expected the help command NOT to be run');
assert.equal(serve.called, 1, 'expected the serve command to be run');
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra output');
});
});
it.skip('ember <valid command with args>', function() {
var help = stubValidateAndRun('help');
var serve = stubValidateAndRun('serve');
return ember(['serve', 'lorem', 'ipsum', 'dolor', '--flag1=one']).then(function() {
var args= serve.calledWith[0][0].cliArgs;
assert.equal(help.called, 0, 'expected the help command NOT to be run');
assert.equal(serve.called, 1, 'expected the foo command to be run');
assert.deepEqual(args, ['serve', 'lorem', 'ipsum', 'dolor'], 'expects correct arguments');
assert.equal(serve.calledWith[0].length, 2, 'expect foo to receive a total of 4 args');
var output = ui.output.trim().split('\n');
assertVersion(output[0]);
assert.equal(output.length, 1, 'expected no extra output');
});
});
it('ember <invalid command>', function() {
var help = stubValidateAndRun('help');
return ember(['unknownCommand']).then(function() {
var output = ui.output.trim().split('\n');
assert(/The specified command .*unknownCommand.* is invalid/.test(output[1]), 'expected an invalid command message');
assert.equal(help.called, 0, 'expected the help command to be run');
});
});
describe.skip('default options config file', function() {
it('reads default options from .ember-cli file', function() {
var defaults = ['--output', process.cwd()];
var build = stubValidateAndRun('build');
return ember(['build'], defaults).then(function() {
var options = build.calledWith[0][1].cliOptions;
assert.equal(options.output, process.cwd());
});
});
});
describe.skip('analytics tracking', function() {
var track;
beforeEach(function() {
stubValidateAndRun(['build']);
});
it('tracks the command that was run', function() {
return ember(['build']).then(function() {
assert.ok(track.called);
assert.equal(track.calledWith[0][1], 'ember');
assert.equal(track.calledWith[0][2], 'build');
});
});
it('tracks given options as JSON string', function() {
return ember(['build', 'production', '--output', '/blah']).then(function() {
var args = JSON.parse(track.calledWith[1][0]);
assert.ok(track.called);
assert.equal(args[0], 'production');
assert.equal(args[1].output, '/blah');
});
});
});
});