Files
bower/test/resolve/resolvers/gitResolver.js
2013-04-23 00:57:08 +01:00

263 lines
10 KiB
JavaScript

var expect = require('expect.js');
var Q = require('q');
var GitResolver = require('../../../lib/resolve/resolvers/GitResolver');
describe('GitResolver', function () {
beforeEach(function () {
GitResolver.fetchRefs = function () {};
delete GitResolver._versions;
delete GitResolver._heads;
delete GitResolver._refs;
});
describe('hasNew', function () {
it('should return a promise');
it('should be true when the resolution type is different');
it('should be true when a different tag (higher/lower) for a range is available');
it('should be false when resolved to the same tag for a given range');
it('should be true when a different commit hash for a given branch is available');
it('should be false when resolved to the the same commit hash for a given branch');
it('should be false when targeting commit hashes');
it('should resolve to the master branch when the target is *');
});
describe('resolve', function () {
it('should return a promise');
it('should call the necessary functions by thee correct order');
});
describe('._findResolution', function () {
it('should return a promise');
});
describe('._cleanup', function () {
it('should return a promise');
it('should remove the .git folder from the temp dir');
});
describe('._savePkgMeta', function () {
it('should return a promise');
it('should save the resolution to the json to be used later by .hasNew');
});
describe('#fetchHeads', function () {
it('should return a promise');
it('should resolve to an empty object if no heads are found', function (next) {
GitResolver.fetchRefs = function () {
return Q.resolve([]);
};
GitResolver.fetchHeads('foo')
.then(function (heads) {
expect(heads).to.be.an('object');
expect(heads).to.eql({});
next();
})
.done();
});
it('should resolve to an object where keys are branches and values their commit hashes', function (next) {
GitResolver.fetchRefs = function () {
return Q.resolve([
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/master',
'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/heads/some-branch',
'foo refs/heads/invalid', // invalid
'cccccccccccccccccccccccccccccccccccccccc refs/heads/', // invalid
'dddddddddddddddddddddddddddddddddddddddd refs/heads', // invalid
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee refs/tags/some-tag',
'ffffffffffffffffffffffffffffffffffffffff refs/tags/0.1.1'
]);
};
GitResolver.fetchHeads('foo')
.then(function (heads) {
expect(heads).to.eql({
'master': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'some-branch': 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
});
next();
})
.done();
});
it('should cache the result for each source', function (next) {
GitResolver.fetchRefs = function (source) {
if (source === 'foo') {
return Q.resolve([
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/master',
'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/heads/some-branch'
]);
}
return Q.resolve([
'cccccccccccccccccccccccccccccccccccccccc refs/heads/master',
'dddddddddddddddddddddddddddddddddddddddd refs/heads/other-branch'
]);
};
GitResolver.fetchHeads('foo')
.then(function (heads) {
expect(heads).to.eql({
'master': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'some-branch': 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
});
return GitResolver.fetchHeads('bar');
})
.then(function (heads) {
expect(heads).to.eql({
'master': 'cccccccccccccccccccccccccccccccccccccccc',
'other-branch': 'dddddddddddddddddddddddddddddddddddddddd'
});
// Test for the cache
expect(GitResolver._heads).to.be.an('object');
expect(GitResolver._heads.foo).to.be.an('object');
expect(GitResolver._heads.bar).to.be.an('object');
// Manipulate the cache and check if it resolves for the cached ones
delete GitResolver._heads.foo.master;
delete GitResolver._heads.bar.master;
return GitResolver.fetchHeads('foo');
})
.then(function (heads) {
expect(heads).to.eql({
'some-branch': 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
});
return GitResolver.fetchHeads('bar');
})
.then(function (heads) {
expect(heads).to.eql({
'other-branch': 'dddddddddddddddddddddddddddddddddddddddd'
});
next();
})
.done();
});
});
describe('#fetchVersions', function () {
it('should return a promise');
it('should resolve to an empty array if no tags are found', function (next) {
GitResolver.fetchRefs = function () {
return Q.resolve([]);
};
GitResolver.fetchVersions('foo')
.then(function (versions) {
expect(versions).to.be.an('array');
expect(versions).to.eql([]);
next();
})
.done();
});
it('should resolve to an array of versions, ignoring invalid semver tags', function (next) {
GitResolver.fetchRefs = function () {
return Q.resolve([
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/master',
'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/heads/some-branch',
'cccccccccccccccccccccccccccccccccccccccc refs/tags/0.2.1',
'dddddddddddddddddddddddddddddddddddddddd refs/tags/0.1.0',
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee refs/tags/v0.1.1',
'foo refs/tags/invalid', // invalid
'ffffffffffffffffffffffffffffffffffffffff refs/tags/', // invalid
'abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/tags' // invalid
]);
};
GitResolver.fetchVersions('foo')
.then(function (versions) {
expect(versions).to.eql([
'0.2.1',
'0.1.1',
'0.1.0'
]);
next();
})
.done();
});
it('should order the versions according to the semver spec', function (next) {
GitResolver.fetchRefs = function () {
// TODO: Uncomment this out as soon as semver solves the issue with builds
// See: https://github.com/isaacs/node-semver/issues/16
return Q.resolve([
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/tags/0.1.0',
//'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/tags/0.1.1+build.2',
//'cccccccccccccccccccccccccccccccccccccccc refs/tags/0.1.1+build.1',
'dddddddddddddddddddddddddddddddddddddddd refs/tags/0.1.1-rc2',
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee refs/tags/0.1.1-rc0',
'ffffffffffffffffffffffffffffffffffffffff refs/tags/0.1.1',
'abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/tags/v0.2.1'
]);
};
GitResolver.fetchVersions('foo')
.then(function (versions) {
expect(versions).to.eql([
'0.2.1',
//'0.1.1+build.2',
//'0.1.1+build.1',
'0.1.1',
'0.1.1-rc2',
'0.1.1-rc0',
'0.1.0'
]);
next();
})
.done();
});
it('should cache the result for each source', function (next) {
GitResolver.fetchRefs = function (source) {
if (source === 'foo') {
return Q.resolve([
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/tags/0.2.1',
'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb refs/tags/0.1.0'
]);
}
return Q.resolve([
'cccccccccccccccccccccccccccccccccccccccc refs/tags/0.3.1',
'dddddddddddddddddddddddddddddddddddddddd refs/tags/0.3.0'
]);
};
GitResolver.fetchVersions('foo')
.then(function (versions) {
expect(versions).to.eql(['0.2.1', '0.1.0']);
return GitResolver.fetchVersions('bar');
})
.then(function (versions) {
expect(versions).to.eql(['0.3.1', '0.3.0']);
// Test for the cache
expect(GitResolver._versions).to.be.an('object');
expect(GitResolver._versions.foo).to.be.an('array');
expect(GitResolver._versions.bar).to.be.an('array');
// Manipulate the cache and check if it resolves for the cached ones
GitResolver._versions.foo.splice(1, 1);
GitResolver._versions.bar.splice(1, 1);
return GitResolver.fetchVersions('foo');
})
.then(function (versions) {
expect(versions).to.eql(['0.2.1']);
return GitResolver.fetchVersions('bar');
})
.then(function (versions) {
expect(versions).to.eql(['0.3.1']);
next();
})
.done();
});
});
});