Skip to content

Commit

Permalink
Add tests for unregister command
Browse files Browse the repository at this point in the history
  • Loading branch information
sheerun committed Mar 7, 2015
1 parent b72cef1 commit b425175
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 52 deletions.
13 changes: 5 additions & 8 deletions lib/commands/login.js
Expand Up @@ -17,11 +17,10 @@ function login(logger, options, config) {
} else {
// This command requires interactive to be enabled
if (!config.interactive) {
process.nextTick(function () {

This comment has been minimized.

Copy link
@samccone

samccone Mar 9, 2015

Member

ah you have just dropped it 📦

logger.emit('error', createError('Login requires an interactive shell', 'ENOINT', {
details: 'Note that you can manually force an interactive shell with --config.interactive'
}));
});
logger.emit('error', createError('Login requires an interactive shell', 'ENOINT', {
details: 'Note that you can manually force an interactive shell with --config.interactive'
}));

return logger;
}

Expand Down Expand Up @@ -60,7 +59,7 @@ function login(logger, options, config) {
});
}

promise
return promise
.fail(function (error) {
logger.error('login error', 'Could not authenticate');
})
Expand All @@ -69,8 +68,6 @@ function login(logger, options, config) {

logger.emit('end', result);
});

return logger;
}

// -------------------
Expand Down
78 changes: 34 additions & 44 deletions lib/commands/unregister.js
Expand Up @@ -30,55 +30,45 @@ function unregister(logger, name, config) {

repository = new PackageRepository(config, logger);

process.nextTick(function () {
tracker.track('unregister');
tracker.track('unregister');

if (!config.accessToken) {
return logger.emit('error',
createError('Use "bower login" with collaborator credentials', 'EFORBIDDEN')
);
if (!config.accessToken) {
return logger.emit('error',
createError('Use "bower login" with collaborator credentials', 'EFORBIDDEN')
);
}

return Q.resolve()
.then(function () {
// If non interactive or user forced, bypass confirmation
if (!config.interactive || force) {
return true;
}

Q.resolve()
.then(function () {
// If non interactive or user forced, bypass confirmation
if (!config.interactive || force) {
return true;
}

// Confirm if the user really wants to unregister
logger.warn('confirm unregister', 'You are about to remove component "' + chalk.cyan.underline(name) + '" from the bower registry (' + chalk.cyan.underline(config.registry.register) + '). It is generally considered bad behavior to remove versions of a library that others are depending on.');
return Q.nfcall(logger.prompt.bind(logger), {
type: 'confirm',
message: 'Are you really sure?',
default: false
});
})
.then(function (result) {
// If user response was negative, abort
if (!result) {
return;
}

// Register
registryClient = repository.getRegistryClient();

logger.action('unregister', name, {
name: name
});

return Q.nfcall(registryClient.unregister.bind(registryClient), name);
})
.done(function (result) {
tracker.track('unregistered');
logger.info('Package unregistered', name);
logger.emit('end', result);
}, function (error) {
logger.emit('error', error);
return Q.nfcall(logger.prompt.bind(logger), {
type: 'confirm',
message: 'You are about to remove component "' + chalk.cyan.underline(name) + '" from the bower registry (' + chalk.cyan.underline(config.registry.register) + '). It is generally considered bad behavior to remove versions of a library that others are depending on. Are you really sure?',
default: false
});
});
})
.then(function (result) {
// If user response was negative, abort
if (!result) {
return;
}

return logger;
registryClient = repository.getRegistryClient();

logger.action('unregister', name, { name: name });

return Q.nfcall(registryClient.unregister.bind(registryClient), name);
})
.then(function (result) {
tracker.track('unregistered');
logger.info('Package unregistered', name);

return result;
});
}

// -------------------
Expand Down
79 changes: 79 additions & 0 deletions test/commands/unregister.js
@@ -0,0 +1,79 @@
var expect = require('expect.js');
var helpers = require('../helpers');

var fakeRepositoryFactory = function () {
function FakeRepository() { }

FakeRepository.prototype.getRegistryClient = function() {
return {
unregister: function (name, cb) {
cb(null, { name: name });
}
};
};

return FakeRepository;
};

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

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

describe('bower unregister', function () {

it('correctly reads arguments', function() {
expect(unregister.readOptions(['jquery']))
.to.eql(['jquery']);
});

it('errors if name is not provided', function () {
return helpers.run(unregister).fail(function(reason) {
expect(reason.message).to.be('Usage: bower unregister <name> <url>');
expect(reason.code).to.be('EINVFORMAT');
});
});

it('should call registry client with name', function () {
var unregister = unregisterFactory();

return helpers.run(unregister, ['some-name'])
.spread(function(result) {
expect(result).to.eql({
// Result from register action on stub
name: 'some-name'
});
});
});

it('should confirm in interactive mode', function () {
var register = unregisterFactory();

var promise = helpers.run(register,
['some-name', {
interactive: true,
registry: { register: 'http://localhost' }
}]
);

return helpers.expectEvent(promise.logger, 'confirm')
.spread(function(e) {
expect(e.type).to.be('confirm');
expect(e.message).to.be('You are about to remove component "some-name" from the bower registry (http://localhost). It is generally considered bad behavior to remove versions of a library that others are depending on. Are you really sure?');
expect(e.default).to.be(false);
});
});

it('should skip confirming when forcing', function () {
var register = unregisterFactory();

return helpers.run(register,
['some-name',
{ interactive: true, force: true }
]
);
});
});

0 comments on commit b425175

Please sign in to comment.