Skip to content

Commit

Permalink
Add tests for login command
Browse files Browse the repository at this point in the history
  • Loading branch information
sheerun committed Mar 30, 2015
1 parent 905c277 commit 1a7abfd
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 8 deletions.
14 changes: 7 additions & 7 deletions lib/commands/login.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ function login(logger, options, config) {

var promise;

options = options || {};

if (options.token) {
promise = Q.resolve({ token: options.token });
} else {
Expand All @@ -21,7 +23,7 @@ function login(logger, options, config) {
details: 'Note that you can manually force an interactive shell with --config.interactive'
}));

return logger;
return;
}

var questions = [
Expand Down Expand Up @@ -59,14 +61,12 @@ function login(logger, options, config) {
});
}

return promise
.fail(function (error) {
logger.error('login error', 'Could not authenticate');
})
.then(function (result) {
return promise.then(function (result) {
configstore.set('accessToken', result.token);

logger.emit('end', result);
return result;
}, function (error) {
logger.error('login error', 'Could not authenticate');
});
}

Expand Down
160 changes: 160 additions & 0 deletions test/commands/login.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
var expect = require('expect.js');
var helpers = require('../helpers');

var fakeGitHub = function (authenticate) {
function FakeGitHub() { }

var _authenticated = false;

FakeGitHub.prototype.authenticate = function (creds) {
if (creds.password === 'validpassword') {
_authenticated = true;
}
};

FakeGitHub.prototype.authorization = {
create: function (options, cb) {
if (_authenticated) {
cb(null, { token: 'faketoken' });
} else {
cb('Not authenticated');
}
}
};

return FakeGitHub;
};

var fakeConfigstore = function (set, get) {
function FakeConfigstore() { }

FakeConfigstore.prototype.set = set;
FakeConfigstore.prototype.get = get;

return FakeConfigstore;
};

var login = helpers.command('login');

var loginFactory = function (options) {
return helpers.command('login', {
'github': fakeGitHub(),
'configstore': fakeConfigstore(
options.set || function () { return true; },
options.get || function () { return true; }
)
});
};

describe('bower login', function () {

it('correctly reads arguments', function() {
expect(login.readOptions(['--token', 'foobar']))
.to.eql([{ token: 'foobar' }]);
});

it('fails if run in non-interactive shell without token passed', function () {
return helpers.run(login, []).fail(function(reason) {
expect(reason.message).to.be('Login requires an interactive shell');
expect(reason.code).to.be('ENOINT');
});
});

it('succeeds if run in non-interactive shell with token passed', function () {
return helpers.run(login, [{ token: 'foobar' }]);
});

it('succeeds if provided password is valid', function () {
var login = loginFactory({});

var logger = login({}, { interactive: true });

logger.once('prompt', function (prompt, answer) {
answer({
username: 'user',
password: 'validpassword'
});
});

return helpers.expectEvent(logger, 'end')
.spread(function(options) {
expect(options.token).to.be('faketoken');
});
});

it('fails if provided password is invalid', function () {
var login = loginFactory({});

var logger = login({}, { interactive: true });

logger.once('prompt', function (prompt, answer) {
answer({
username: 'user',
password: 'invalidpassword'
});
});

return helpers.expectEvent(logger, 'log').spread(function (log) {
expect(log.level).to.be('error');
expect(log.id).to.be('login error');
expect(log.message).to.be('Could not authenticate');
});
});

it('uses username stored in config as default username', function () {
var login = loginFactory({
get: function (key) {
if (key === 'username') {
return 'savedusername';
}
}
});

var logger = login({}, { interactive: true });

return helpers.expectEvent(logger, 'prompt')
.spread(function (prompt, answer) {
expect(prompt[0].default).to.be('savedusername');
});
});

it('saves username in config', function (done) {
var login = loginFactory({
set: function (key, value) {
if(key === 'username') {
expect(value).to.be('user');
done();
}
}
});

var logger = login({}, { interactive: true });

logger.once('prompt', function (prompt, answer) {
answer({
username: 'user',
password: 'validpassword'
});
});
});

it('saves received token in accessToken config', function (done) {
var login = loginFactory({
set: function (key, value) {
if(key === 'accessToken') {
expect(value).to.be('faketoken');
done();
}
}
});

var logger = login({}, { interactive: true });

logger.once('prompt', function (prompt, answer) {
answer({
username: 'user',
password: 'validpassword'
});
});
});
});
2 changes: 1 addition & 1 deletion test/commands/unregister.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ var fakeRepositoryFactory = function () {

var unregister = helpers.command('unregister');

var unregisterFactory = function (canonicalDir, pkgMeta) {
var unregisterFactory = function () {
return helpers.command('unregister', {
'../core/PackageRepository': fakeRepositoryFactory()
});
Expand Down

0 comments on commit 1a7abfd

Please sign in to comment.