Files
bower/test/core/resolvers/pluginResolverFactory.js
2018-03-28 19:28:43 +02:00

492 lines
17 KiB
JavaScript

var expect = require('expect.js');
var path = require('path');
var Logger = require('bower-logger');
var createError = require('../../../lib/util/createError');
var pluginResolverFactory = require('../../../lib/core/resolvers/pluginResolverFactory');
var defaultConfig = require('../../../lib/config');
var Q = require('q');
describe('pluginResolverFactory', function() {
var testPackage = path.resolve(__dirname, '../../assets/package-a');
var logger;
before(function() {
logger = new Logger();
});
afterEach(function() {
logger.removeAllListeners();
});
var mockPluginResolver = function resolver(bower) {
return {
match: function(source) {
return true;
},
locate: function(source) {
return source;
},
releases: function(source) {
return [
{ target: 'v1.0.0', version: '1.0.0' },
{ target: 'v1.0.1', version: '1.0.1' }
];
},
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: 'some/temp/path',
removeIgnores: true
};
}
};
};
function create(decEndpoint) {
if (typeof decEndpoint === 'string') {
decEndpoint = { source: decEndpoint };
}
var PluginResolver = pluginResolverFactory(
mockPluginResolver,
defaultConfig()
);
return new PluginResolver(decEndpoint);
}
describe('.constructor', function() {
it('should internally add decEndpoint', function() {
var resolver;
resolver = create('file://' + testPackage);
expect(typeof resolver._decEndpoint).to.equal('object');
expect(resolver._decEndpoint.source).to.equal(
'file://' + testPackage
);
});
it('should throw when invalid resolverFactory is provided', function() {
expect(function() {
pluginResolverFactory('not-a-function', defaultConfig());
}).to.throwException(
createError(
'Resolver has "string" type instead of "function" type.',
'ERESOLERAPI'
)
);
});
});
describe('.getEndpoint', function() {
it('should return endpoint', function() {
var resolver, endPoint;
resolver = create('file://' + testPackage);
endPoint = resolver.getEndpoint();
expect(endPoint).to.have.property('source');
expect(endPoint.source).to.equal('file://' + testPackage);
expect(endPoint).to.have.property('name');
expect(endPoint.name).to.equal('package-a');
expect(endPoint).to.have.property('target');
expect(endPoint.target).to.equal('*');
});
});
describe('.getSource', function() {
it('should return endpoint', function() {
var resolver, source;
resolver = create('file://' + testPackage);
source = resolver.getSource();
expect(source).to.equal('file://' + testPackage);
});
});
describe('.getTarget', function() {
it('should return target', function() {
var resolver, source;
resolver = create({
source: 'file://' + testPackage,
target: 'some-target'
});
source = resolver.getTarget();
expect(source).to.equal('some-target');
});
it('should return * when no target is specified', function() {
var resolver, source;
resolver = create('file://' + testPackage);
source = resolver.getTarget();
expect(source).to.equal('*');
});
});
describe('.getName', function() {
it('should return target', function() {});
});
describe('.getPkgMeta', function() {
it('should return package meta', function() {
var resolver, pkgMeta;
resolver = create('file://' + testPackage);
resolver._pkgMeta = { version: 'v1.0.1' };
pkgMeta = resolver.getPkgMeta();
console.log(pkgMeta);
expect(pkgMeta).to.have.property('version');
expect(pkgMeta.version).to.equal('v1.0.1');
});
});
describe('.isCacheable', function() {
it('should always return true', function() {
var resolver, isCacheable;
resolver = create('file://' + testPackage);
isCacheable = resolver.isCacheable();
expect(isCacheable).to.be.ok();
});
});
describe('.hasNew', function() {
it('should return existing hasNewPromise if its set', function() {
var resolver;
resolver = create('file://' + testPackage);
resolver.hasNewPromise = Q.fcall(function() {
return 'some-dummy-value';
});
resolver.hasNew().then(function(resolvedtestValue) {
expect(resolvedtestValue).to.be('some-dummy-value');
});
});
it('should return target', function() {});
});
describe('.resolve', function() {
it("should throw 'Resolver did not provide releases of package.'", function(next) {
var mockPluginResolverWithEmptyReleases = function resolver(bower) {
return {
match: function(source) {
return true;
},
releases: function(source) {
return null;
},
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: '/temp/path',
removeIgnores: true
};
}
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithEmptyReleases,
defaultConfig()
);
var path = 'file://' + testPackage;
var resolver = new PluginResolver(path);
resolver.resolve().catch(function(e) {
expect(e.message).to.equal(
'Resolver did not provide releases of package.'
);
next();
});
});
it("should throw 'No version found that was able to satisfy *.'", function(next) {
var mockPluginResolverWithNoMatchingTarget = function resolver(
bower
) {
return {
match: function(source) {
return true;
},
releases: function(source) {
return [];
},
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: '/temp/path',
removeIgnores: true
};
}
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithNoMatchingTarget,
defaultConfig()
);
var path = 'file://' + testPackage;
var resolver = new PluginResolver(path);
resolver.resolve().catch(function(e) {
expect(e.message).to.equal(
'No version found that was able to satisfy *'
);
expect(e.code).to.equal('ENORESTARGET');
next();
});
});
it("should throw 'Resolver does not accept version ranges'", function(next) {
var mockPluginResolverWithInvalidTarget = function resolver(bower) {
return {
match: function(source) {
return true;
},
releases: null,
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: '/temp/path',
removeIgnores: true
};
}
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithInvalidTarget,
defaultConfig()
);
var path = 'file://' + testPackage;
var resolver = new PluginResolver({
source: path,
target: '2.0.0'
});
resolver.resolve().catch(function(e) {
expect(e.message).to.equal(
'Resolver does not accept version ranges (2.0.0)'
);
next();
});
});
it('should throw \'Resolver does not implement the "fetch" method.\'', function(next) {
var mockPluginResolverWithoutFetch = function resolver(bower) {
return {
match: function(source) {
return true;
},
releases: function(source) {
return [
{ target: 'v1.0.0', version: '1.0.0' },
{ target: 'v1.0.1', version: '1.0.1' }
];
},
fetch: null
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithoutFetch,
defaultConfig()
);
var path = 'file://' + testPackage;
var resolver = new PluginResolver(path);
resolver.resolve().catch(function(e) {
expect(e.message).to.equal(
'Resolver does not implement the "fetch" method.'
);
next();
});
});
it("should throw 'Resolver did not provide path to extracted contents of package'", function(next) {
var mockPluginResolverWithoutTempPath = function resolver(bower) {
return {
match: function(source) {
return true;
},
releases: function(source) {
return [
{ target: 'v1.0.0', version: '1.0.0' },
{ target: 'v1.0.1', version: '1.0.1' }
];
},
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: null,
removeIgnores: true
};
}
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithoutTempPath,
defaultConfig()
);
var path = 'file://' + testPackage;
var resolver = new PluginResolver(path);
resolver.resolve().catch(function(e) {
expect(e.message).to.equal(
'Resolver did not provide path to extracted contents of package.'
);
next();
});
});
});
describe('.isTargetable', function() {
it('should accept mockPluginResolverWithReleasesFn', function() {
var PluginResolver = pluginResolverFactory(
mockPluginResolver,
defaultConfig()
);
expect(PluginResolver.isTargetable()).to.be.ok();
});
it('should reject mockPluginResolverWithoutReleasesFn', function() {
var mockPluginResolverWithoutReleasesFn = function resolver(bower) {
return {
match: function(source) {
return true;
},
locate: function(source) {
return source;
},
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: 'some/tmp/path',
removeIgnores: true
};
}
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithoutReleasesFn,
defaultConfig()
);
expect(PluginResolver.isTargetable()).to.not.be.ok();
});
});
describe('.clearRuntimeCache', function() {
it('', function() {
//Unable to test private variable `resolver`
});
});
describe('.match', function() {
it('should throw when plugin does not implement .match', function() {
var mockPluginResolverWithoutMatch = function resolver(bower) {
return {
releases: function(source) {
return [
{ target: 'v1.0.0', version: '1.0.0' },
{ target: 'v1.0.1', version: '1.0.1' }
];
},
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: 'some/temp/path',
removeIgnores: true
};
}
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithoutMatch,
defaultConfig()
);
var source = 'git://github.com/jquery/jquery.git';
expect(function() {
PluginResolver.match(source);
}).to.throwException(
createError(
'Resolver is missing "match"' + 'method.',
'ERESOLVERAPI'
)
);
});
it('should match given source', function() {
var PluginResolver = pluginResolverFactory(
mockPluginResolver,
defaultConfig()
);
var source = 'git://github.com/jquery/jquery.git';
PluginResolver.match(source).then(function(result) {
expect(result).to.be.ok();
});
});
});
describe('.locate', function() {
it('should return source when plugin does not implement .locate', function() {
var mockPluginResolverWithoutLocate = function resolver(bower) {
return {
match: function(source) {
return true;
},
releases: function(source) {
return [
{ target: 'v1.0.0', version: '1.0.0' },
{ target: 'v1.0.1', version: '1.0.1' }
];
},
fetch: function(endpoint, cached) {
if (cached && cached.version) {
return;
}
return {
tempPath: '/temp/path',
removeIgnores: true
};
}
};
};
var PluginResolver = pluginResolverFactory(
mockPluginResolverWithoutLocate,
defaultConfig()
);
var path = 'file://' + testPackage;
expect(PluginResolver.locate(path)).to.be(path);
});
it('should locate the source', function() {
var PluginResolver = pluginResolverFactory(
mockPluginResolver,
defaultConfig()
);
var source = 'jquery/jquery';
PluginResolver.locate(source).then(function(result) {
expect(result).to.be(source);
});
});
});
});