ionic
Version:
A tool for creating and developing Ionic Framework mobile apps.
182 lines (152 loc) • 6.51 kB
JavaScript
;
var Q = require('q');
var optimist = require('optimist');
var prompt = require('prompt');
var rewire = require('rewire');
var login = rewire('../../lib/ionic/login');
var IonicAppLib = require('ionic-app-lib');
var log = IonicAppLib.logging.logger;
var appLibLogin = IonicAppLib.login;
describe('login command', function() {
describe('command settings', function() {
it('should have a title', function() {
expect(login.title).toBeDefined();
expect(login.title).not.toBeNull();
expect(login.title.length).toBeGreaterThan(0);
});
});
describe('run function', function() {
it('should call the login function', function() {
var processArguments = ['node', 'ionic', 'login'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
var loginSpy = jasmine.createSpy('loginSpy');
var revertLoginSpy = login.__set__('login', loginSpy);
// Expect failure
login.run(null, argv);
expect(loginSpy).toHaveBeenCalledWith(argv);
revertLoginSpy();
});
});
describe('login function', function() {
it('should use argv email and password first.', function(done) {
var processArguments = ['node', 'ionic', 'login', '--email', 'josh@ionic.io', '--password', 'asdf1234'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
var jar = { jar: 'contents' };
spyOn(log, 'info');
spyOn(login, 'promptForLogin');
spyOn(appLibLogin, 'requestLogIn').andReturn(Q(jar));
login.login(argv).then(function(results) {
expect(results).toEqual(jar);
expect(login.promptForLogin).not.toHaveBeenCalled();
expect(appLibLogin.requestLogIn).toHaveBeenCalledWith('josh@ionic.io', 'asdf1234', true);
done();
});
});
it('should use argv e and p second.', function(done) {
var processArguments = ['node', 'ionic', 'login', '--e', 'josh@ionic.io', '--p', 'asdf1234'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
var jar = { jar: 'contents' };
spyOn(log, 'info');
spyOn(login, 'promptForLogin');
spyOn(appLibLogin, 'requestLogIn').andReturn(Q(jar));
login.login(argv).then(function(results) {
expect(results).toEqual(jar);
expect(login.promptForLogin).not.toHaveBeenCalled();
expect(appLibLogin.requestLogIn).toHaveBeenCalledWith('josh@ionic.io', 'asdf1234', true);
done();
});
});
it('should use environment variables last.', function(done) {
var processArguments = ['node', 'ionic', 'login'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
process.env.IONIC_EMAIL = 'josh@ionic.io';
process.env.IONIC_PASSWORD = 'asdf1234';
var jar = { jar: 'contents' };
spyOn(log, 'info');
spyOn(login, 'promptForLogin');
spyOn(appLibLogin, 'requestLogIn').andReturn(Q(jar));
login.login(argv).then(function(results) {
expect(results).toEqual(jar);
expect(login.promptForLogin).not.toHaveBeenCalled();
expect(appLibLogin.requestLogIn).toHaveBeenCalledWith('josh@ionic.io', 'asdf1234', true);
done();
});
delete process.env.IONIC_EMAIL;
delete process.env.IONIC_PASSWORD;
});
it('should prompt to ask for email and password when not available', function(done) {
var processArguments = ['node', 'ionic', 'login'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
var jar = { jar: 'contents' };
spyOn(log, 'info');
var promptForLoginSpy = jasmine.createSpy('promptForLoginSpy');
promptForLoginSpy.andReturn(Q({
email: 'josh@ionic.io',
password: 'asdf1234'
}));
var revertPromptForLoginSpy = login.__set__('promptForLogin', promptForLoginSpy);
spyOn(appLibLogin, 'requestLogIn').andReturn(Q(jar));
login.login(argv).then(function(results) {
expect(results).toEqual(jar);
expect(promptForLoginSpy).toHaveBeenCalledWith(argv);
expect(appLibLogin.requestLogIn).toHaveBeenCalledWith('josh@ionic.io', 'asdf1234', true);
revertPromptForLoginSpy();
done();
});
});
it('should display the error on a failed log in attempt', function(done) {
var processArguments = ['node', 'ionic', 'login', '--email', 'josh@ionic.io', '--password', 'asdf1234'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
var error = 'Email or Password incorrect. Please visit';
spyOn(log, 'error');
spyOn(login, 'promptForLogin');
spyOn(appLibLogin, 'requestLogIn').andReturn(Q.reject(error));
login.login(argv).then(function() {
expect(log.error).toHaveBeenCalledWith(error);
done();
});
});
});
describe('promptForLogin function', function() {
it('should ask for email and password and return a promise', function(done) {
var processArguments = ['node', 'ionic', 'login'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
spyOn(log, 'info');
spyOn(prompt, 'start');
spyOn(prompt, 'get').andCallFake(function(schema, callback) {
callback(null, { email: 'josh@ionic.io', password: 'asdf1234' });
});
var promptForLogin = login.__get__('promptForLogin');
promptForLogin(argv).then(function(results) {
expect(prompt.get).toHaveBeenCalled();
expect(results.email).toEqual('josh@ionic.io');
expect(results.password).toEqual('asdf1234');
done();
});
});
it('should ask for email and password and eject an error if error', function(done) {
var processArguments = ['node', 'ionic', 'login'];
var rawCliArguments = processArguments.slice(2);
var argv = optimist(rawCliArguments).argv;
var error = 'error logging in';
spyOn(log, 'info');
spyOn(prompt, 'start');
spyOn(prompt, 'get').andCallFake(function(schema, callback) {
callback(error);
});
var promptForLogin = login.__get__('promptForLogin');
promptForLogin(argv).catch(function(error) {
expect(prompt.get).toHaveBeenCalled();
expect(error).toEqual(error);
done();
});
});
});
});