bricks-cli
Version:
Command line tool for developing ambitious ember.js apps
176 lines (139 loc) • 6.54 kB
JavaScript
var path = require('path');
var nock = require('nock');
var fs = require('graceful-fs');
var expect = require('expect.js');
var Logger = require('bower-logger');
var GitRemoteResolver = require('../../../lib/core/resolvers/GitRemoteResolver');
var GitHubResolver = require('../../../lib/core/resolvers/GitHubResolver');
var defaultConfig = require('../../../lib/config');
describe('GitHub', function () {
var logger;
var testPackage = path.resolve(__dirname, '../../assets/package-a');
before(function () {
logger = new Logger();
});
beforeEach(function () {
// Turn off strict ssl because it gives problems with nock
defaultConfig.strictSsl = false;
});
afterEach(function () {
// Clean nocks
nock.cleanAll();
logger.removeAllListeners();
// Enable strict ssl back again
defaultConfig.strictSsl = true;
});
function create(decEndpoint, config) {
if (typeof decEndpoint === 'string') {
decEndpoint = { source: decEndpoint };
}
return new GitHubResolver(decEndpoint, config || defaultConfig, logger);
}
describe('.constructor', function () {
it.skip('should throw an error on invalid GitHub URLs');
it('should ensure .git in the source', function () {
var resolver;
resolver = create('git://github.com/twitter/bower');
expect(resolver.getSource()).to.equal('git://github.com/twitter/bower.git');
resolver = create('git://github.com/twitter/bower.git');
expect(resolver.getSource()).to.equal('git://github.com/twitter/bower.git');
resolver = create('git://github.com/twitter/bower.git/');
expect(resolver.getSource()).to.equal('git://github.com/twitter/bower.git');
});
});
describe('.resolve', function () {
it('should download and extract the .tar.gz archive from GitHub.com', function (next) {
var resolver;
nock('https://github.com')
.get('/IndigoUnited/events-emitter/archive/0.1.0.tar.gz')
.replyWithFile(200, path.resolve(__dirname, '../../assets/package-tar.tar.gz'));
resolver = create({ source: 'git://github.com/IndigoUnited/events-emitter.git', target: '0.1.0' });
resolver.resolve()
.then(function (dir) {
expect(fs.existsSync(path.join(dir, 'foo.js'))).to.be(true);
expect(fs.existsSync(path.join(dir, '.bower.json'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'bar.js'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'package-tar.tar.gz'))).to.be(false);
expect(fs.existsSync(path.join(dir, 'package-tar.tar'))).to.be(false);
next();
})
.done();
});
it('should retry using the GitRemoteResolver mechanism if download failed', function (next) {
var resolver;
var retried;
nock('https://github.com')
.get('/IndigoUnited/events-emitter/archive/0.1.0.tar.gz')
.reply(200, 'this is not a valid tar');
logger.on('log', function (entry) {
if (entry.level === 'warn' && entry.id === 'retry') {
retried = true;
}
});
resolver = create({ source: 'git://github.com/IndigoUnited/events-emitter.git', target: '0.1.0' });
// Monkey patch source to file://
resolver._source = 'file://' + testPackage;
resolver.resolve()
.then(function (dir) {
expect(retried).to.be(true);
expect(fs.existsSync(path.join(dir, 'foo'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'bar'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'baz'))).to.be(true);
next();
})
.done();
});
it('should retry using the GitRemoteResolver mechanism if extraction failed', function (next) {
var resolver;
var retried;
nock('https://github.com')
.get('/IndigoUnited/events-emitter/archive/0.1.0.tar.gz')
.reply(500);
logger.on('log', function (entry) {
if (entry.level === 'warn' && entry.id === 'retry') {
retried = true;
}
});
resolver = create({ source: 'git://github.com/IndigoUnited/events-emitter.git', target: '0.1.0' });
// Monkey patch source to file://
resolver._source = 'file://' + testPackage;
resolver.resolve()
.then(function (dir) {
expect(retried).to.be(true);
expect(fs.existsSync(path.join(dir, 'foo'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'bar'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'baz'))).to.be(true);
next();
})
.done();
});
it('should fallback to the GitRemoteResolver mechanism if resolution is not a tag', function (next) {
var resolver = create({ source: 'git://github.com/foo/bar.git', target: '2af02ac6ddeaac1c2f4bead8d6287ce54269c039' });
var originalCheckout = GitRemoteResolver.prototype._checkout;
var called;
GitRemoteResolver.prototype._checkout = function () {
called = true;
return originalCheckout.apply(this, arguments);
};
// Monkey patch source to file://
resolver._source = 'file://' + testPackage;
resolver.resolve()
.then(function (dir) {
expect(fs.existsSync(path.join(dir, 'foo'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'bar'))).to.be(true);
expect(fs.existsSync(path.join(dir, 'baz'))).to.be(true);
expect(called).to.be(true);
next();
})
.fin(function () {
GitRemoteResolver.prototype._checkout = originalCheckout;
})
.done();
});
it.skip('it should error out if the status code is not within 200-299');
it.skip('should report progress if it takes too long to download');
});
describe('._savePkgMeta', function () {
it.skip('should guess the homepage if not already set');
});
});