fire-up
Version:
Fire Up! is a dependency injection container designed specifically for node.js with a powerful but sleek API.
1,334 lines (1,084 loc) • 45.3 kB
JavaScript
;
describe('Regarding injection, FireUp', function () {
var path = require('path');
var BPromise = require('bluebird');
var fireUpLib = require('../../lib/index.js');
var _ = require('lodash');
it('should load instance modules with no dependencies', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
'../fixtures/modules/instantiation/factoryAdapters/instance.js',
{
implements: 'dependentOn/instance',
inject: 'instantiation/factoryAdapters/instance',
factory: function (instance) {
return instance;
}
}
]
});
BPromise.resolve()
.then(function () {
return fireUp('instantiation/factoryAdapters/instance');
})
.then(function (instance) {
expect(instance).toEqual({ me: 'instantiation/factoryAdapters/instance' });
})
.then(function () {
return fireUp('dependentOn/instance');
})
.then(function (instance) {
expect(instance).toEqual({ me: 'instantiation/factoryAdapters/instance' });
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should load modules with direct (not cascading) dependencies', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
'../fixtures/modules/interfaces/**/*.js',
'!../fixtures/modules/interfaces/conflicts/*.js',
'../fixtures/modules/injection/direct/*.js',
{
implements: 'injection/direct/singleDependencyAsString/customModule',
inject: 'interfaces/unnested/singleAsString',
factory: function (singleAsString) {
return [singleAsString];
}
},
'../fixtures/modules/instantiation/factoryAdapters/*.js'
]
});
var folderInjection = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/injection/direct/'));
var folderInterfaces = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/interfaces/'));
BPromise.resolve()
.then(function () {
return fireUp('injection/direct/noDependencies');
})
.then(function (instance) {
expect(instance).toEqual(path.join(folderInjection, 'noDependencies.js'));
})
.then(function () {
return fireUp('injection/direct/singleDependencyAsString');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folderInterfaces, 'unnested/singleAsString.js')]);
})
.then(function () {
return fireUp('injection/direct/singleDependencyAsString/customModule');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folderInterfaces, 'unnested/singleAsString.js')]);
})
.then(function () {
return fireUp('injection/direct/singleDependencyAsList');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folderInterfaces, 'unnested/singleAsList.js')]);
})
.then(function () {
return fireUp('injection/direct/injectBaseInterfaces');
})
.then(function (instance) {
expect(instance).toEqual([
path.join(folderInterfaces, 'unnested/singleAsList.js'),
path.join(folderInterfaces, 'unnested/multiple.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseInterface1.js'),
path.join(folderInterfaces, 'nested/baseInterface2.js'),
path.join(folderInterfaces, 'nested/subSubInterfaceWithoutBase.js')
]);
})
.then(function () {
return fireUp('injection/direct/injectSubInterfaces');
})
.then(function (instance) {
expect(instance).toEqual([
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/subInterface1.js'),
path.join(folderInterfaces, 'nested/subInterface2.js'),
path.join(folderInterfaces, 'nested/subInterfaceWithoutBase1.js'),
path.join(folderInterfaces, 'nested/subSubInterfaceWithoutBase.js'),
path.join(folderInterfaces, 'nested/subSubInterfaceWithoutBase.js')
]);
})
.then(function () {
return fireUp('injection/direct/takesStaticArgs(staticArg)');
})
.then(function (instance) {
expect(instance).toEqual([
path.join(folderInterfaces, 'unnested/singleAsList.js'),
'staticArg'
]);
})
.then(function () {
return fireUp('instantiation/factoryAdapters/constructorWithDependencies');
})
.then(function (instance) {
expect(instance.getMe()).toEqual([
'instantiation/factoryAdapters/constructorWithDependencies',
'instantiation/factoryAdapters/constructor',
'instantiation/factoryAdapters/constructorMultiple'
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should load modules with cascading dependencies', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
'../fixtures/modules/interfaces/**/*.js',
'!../fixtures/modules/interfaces/conflicts/*.js',
'../fixtures/modules/injection/direct/*.js',
'../fixtures/modules/injection/cascading/*.js',
{
implements: 'injection/direct/singleDependencyAsString/customModule',
inject: 'interfaces/unnested/singleAsString',
factory: function (singleAsString) {
return [singleAsString];
}
}
]
});
var folderInjection = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/injection/direct/'));
var folderInterfaces = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/interfaces/'));
fireUp('injection/cascading/injectAllDirect')
.then(function (instance) {
expect(instance).toEqual([
path.join(folderInjection, 'noDependencies.js'),
[path.join(folderInterfaces, 'unnested/singleAsString.js')],
[path.join(folderInterfaces, 'unnested/singleAsString.js')],
[path.join(folderInterfaces, 'unnested/singleAsList.js')],
[
path.join(folderInterfaces, 'unnested/singleAsList.js'),
path.join(folderInterfaces, 'unnested/multiple.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseInterface1.js'),
path.join(folderInterfaces, 'nested/baseInterface2.js'),
path.join(folderInterfaces, 'nested/subSubInterfaceWithoutBase.js')
],
[
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/baseAndSubInterface.js'),
path.join(folderInterfaces, 'nested/subInterface1.js'),
path.join(folderInterfaces, 'nested/subInterface2.js'),
path.join(folderInterfaces, 'nested/subInterfaceWithoutBase1.js'),
path.join(folderInterfaces, 'nested/subSubInterfaceWithoutBase.js'),
path.join(folderInterfaces, 'nested/subSubInterfaceWithoutBase.js')
],
[
path.join(folderInterfaces, 'unnested/singleAsList.js'),
43
]
]);
done();
})
.catch(function (e) {
done(e);
});
});
it('should load modules with static arguments', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
'../fixtures/modules/instantiation/staticargs/*.js',
{
implements: 'instantiation/staticargs/takesStaticArgs/customModule',
type: fireUpLib.constants.MODULE_TYPE_MULTIPLE_INSTANCES,
factory: function (arg1, arg2, arg3, arg4) {
return [arg1, arg2, arg3, arg4];
}
},
'../fixtures/modules/instantiation/factoryAdapters/*.js'
]
});
BPromise.resolve()
.then(function () {
return fireUp('instantiation/staticargs/takesStaticArgs(a string, false, 1, 1.5)');
})
.then(function (instance) {
expect(instance).toEqual(['a string', false, 1, 1.5]);
})
.then(function () {
return fireUp('instantiation/staticargs/takesStaticArgs/customModule(a string, false, 1, 1.5)');
})
.then(function (instance) {
expect(instance).toEqual(['a string', false, 1, 1.5]);
})
.then(function () {
return fireUp('instantiation/staticargs/injectWithStaticArgs');
})
.then(function (instance) {
expect(instance).toEqual(['string', true, 0, 0.5]);
})
.then(function () {
return fireUp('instantiation/factoryAdapters/constructorMultipleStaticArg(42)');
})
.then(function (instance) {
expect(instance.staticArg).toBe(42);
})
.then(function () {
return fireUp('instantiation/factoryAdapters/constructorDateMultiple(2014, 6, 23, 20, 22, 30, 101)');
})
.then(function (instance) {
expect(instance.toISOString()).toEqual((new Date(2014, 6, 23, 20, 22, 30, 101)).toISOString());
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 1', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
'../fixtures/modules/instantiation/type/*.js',
{
implements: 'instantiation/type/singleton/customModule',
type: fireUpLib.constants.MODULE_TYPE_SINGLETON,
counter: 0,
factory: function () { this.counter += 1; return this.counter; }
}
],
bustRequireCache: true
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/singleton/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'singleton.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/singleton/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'singleton.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/singleton/interface2');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'singleton.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/multiInstances/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'multiInstances.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/multiInstances/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'multiInstances.js'), 2]);
})
.then(function () {
return fireUp('instantiation/type/multiInstances/interface2');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'multiInstances.js'), 3]);
})
.then(function () {
return fireUp('instantiation/type/singleton/customModule');
})
.then(function (instance) {
expect(instance).toEqual(1);
})
.then(function () {
return fireUp('instantiation/type/singleton/customModule');
})
.then(function (instance) {
expect(instance).toEqual(1);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 2', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/injectAllTypes');
})
.then(function (instance) {
expect(instance).toEqual([
[path.join(folder, 'singleton.js'), 2],
[path.join(folder, 'singleton.js'), 2],
[path.join(folder, 'singleton.js'), 2],
[path.join(folder, 'multiInstances.js'), 4],
[path.join(folder, 'multiInstances.js'), 5],
[path.join(folder, 'multiInstances.js'), 6]
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 3', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/singletonAsync/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'singletonAsync.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/singletonAsync/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'singletonAsync.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/singletonAsync/interface2');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'singletonAsync.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/multiInstancesAsync/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'multiInstancesAsync.js'), 1]);
})
.then(function () {
return fireUp('instantiation/type/multiInstancesAsync/interface1');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'multiInstancesAsync.js'), 2]);
})
.then(function () {
return fireUp('instantiation/type/multiInstancesAsync/interface2');
})
.then(function (instance) {
expect(instance).toEqual([path.join(folder, 'multiInstancesAsync.js'), 3]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 4', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/injectAllTypesAsync');
})
.then(function (instance) {
expect(instance).toEqual([
[path.join(folder, 'singletonAsync.js'), 2],
[path.join(folder, 'singletonAsync.js'), 2],
[path.join(folder, 'singletonAsync.js'), 2],
[path.join(folder, 'multiInstancesAsync.js'), 4],
[path.join(folder, 'multiInstancesAsync.js'), 5],
[path.join(folder, 'multiInstancesAsync.js'), 6]
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 5', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/injectAllTypesMixed');
})
.then(function (instance) {
expect(instance).toEqual([
[path.join(folder, 'singletonAsync.js'), 3],
[path.join(folder, 'singleton.js'), 3],
[path.join(folder, 'singletonAsync.js'), 3],
[path.join(folder, 'multiInstancesAsync.js'), 7],
[path.join(folder, 'multiInstances.js'), 7],
[path.join(folder, 'multiInstancesAsync.js'), 8]
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 6', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/injectAllTypesMixedCascading');
})
.then(function (instance) {
expect(instance).toEqual([
[path.join(folder, 'singletonAsync.js'), 4],
[path.join(folder, 'singleton.js'), 4],
[path.join(folder, 'multiInstancesAsync.js'), 9],
[path.join(folder, 'multiInstances.js'), 8],
[
[path.join(folder, 'singletonAsync.js'), 4],
[path.join(folder, 'singleton.js'), 4],
[path.join(folder, 'singletonAsync.js'), 4],
[path.join(folder, 'multiInstancesAsync.js'), 10],
[path.join(folder, 'multiInstances.js'), 9],
[path.join(folder, 'multiInstancesAsync.js'), 11]
],
[
[path.join(folder, 'singleton.js'), 4],
[path.join(folder, 'singleton.js'), 4],
[path.join(folder, 'singleton.js'), 4],
[path.join(folder, 'multiInstances.js'), 10],
[path.join(folder, 'multiInstances.js'), 11],
[path.join(folder, 'multiInstances.js'), 12]
],
[
[path.join(folder, 'singletonAsync.js'), 4],
[path.join(folder, 'singletonAsync.js'), 4],
[path.join(folder, 'singletonAsync.js'), 4],
[path.join(folder, 'multiInstancesAsync.js'), 12],
[path.join(folder, 'multiInstancesAsync.js'), 13],
[path.join(folder, 'multiInstancesAsync.js'), 14]
],
[path.join(folder, 'singletonAsync.js'), 4],
[path.join(folder, 'singleton.js'), 4],
[path.join(folder, 'multiInstancesAsync.js'), 15],
[path.join(folder, 'multiInstances.js'), 13]
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 7', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/injectAndFireUp');
})
.then(function (instance) {
expect(instance).toEqual([
[path.join(folder, 'singleton.js'), 5],
[path.join(folder, 'singleton.js'), 5],
[path.join(folder, 'multiInstances.js'), 14],
[path.join(folder, 'multiInstances.js'), 15]
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 8', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/injectAllTypesTwiceSync');
})
.then(function (instance) {
expect(instance).toEqual([
[
[path.join(folder, 'singleton.js'), 6],
[path.join(folder, 'singleton.js'), 6],
[path.join(folder, 'singleton.js'), 6],
[path.join(folder, 'multiInstances.js'), 16],
[path.join(folder, 'multiInstances.js'), 17],
[path.join(folder, 'multiInstances.js'), 18]
],
[
[path.join(folder, 'singleton.js'), 6],
[path.join(folder, 'singleton.js'), 6],
[path.join(folder, 'singleton.js'), 6],
[path.join(folder, 'multiInstances.js'), 19],
[path.join(folder, 'multiInstances.js'), 20],
[path.join(folder, 'multiInstances.js'), 21]
]
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should initialize modules according to their type 9', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/type/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/type/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/type/injectSingletonsWithDependencyTwiceSync');
})
.then(function (instance) {
expect(instance).toEqual([
[
[path.join(folder, 'singletonWithDependency.js'), 1],
[path.join(folder, 'singletonWithDependency.js'), 1],
[path.join(folder, 'singletonWithDependency.js'), 1]
],
[
[path.join(folder, 'singletonWithDependency.js'), 1],
[path.join(folder, 'singletonWithDependency.js'), 1],
[path.join(folder, 'singletonWithDependency.js'), 1]
]
]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should load instance modules according to their type', function (done) {
var myInstance = { test: '===' };
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
{
implements: 'myInstance',
instance: myInstance
},
{
implements: 'myInstance2',
instance: myInstance,
type: fireUpLib.constants.MODULE_TYPE_SINGLETON
},
'../fixtures/modules/instantiation/factoryAdapters/instanceMultiple.js'
]
});
BPromise.resolve()
.then(function () {
return fireUp('myInstance');
})
.then(function (instance) {
expect(instance).toBe(myInstance);
})
.then(function () {
return fireUp('myInstance2');
})
.then(function (instance) {
expect(instance).toBe(myInstance);
})
.then(function () {
return BPromise.all([
fireUp('myInstance'),
fireUp('myInstance'),
fireUp('myInstance2')
]);
})
.then(function (instances) {
expect(instances[0]).toBe(instances[1]);
expect(instances[1]).toBe(instances[2]);
instances[0].attr = 'xyz';
expect(instances[0]).toEqual(instances[1]);
})
.then(function () {
return fireUp('instantiation/factoryAdapters/instanceMultiple');
})
.then(function (instance) {
expect(instance).toEqual({ me: 'instantiation/factoryAdapters/instanceMultiple' });
})
.then(function () {
return BPromise.all([
fireUp('instantiation/factoryAdapters/instanceMultiple'),
fireUp('instantiation/factoryAdapters/instanceMultiple')
]);
})
.then(function (instances) {
expect(instances[0]).not.toBe(instances[1]);
expect(instances[0]).toEqual(instances[1]);
instances[0].attr = 'xyz';
expect(instances[0]).not.toEqual(instances[1]);
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should load constructor modules according to their type', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
'../fixtures/modules/instantiation/factoryAdapters/*.js',
{
implements: 'dependsOn/constructor',
inject: 'instantiation/factoryAdapters/constructor',
factory: function (instance) {
return instance;
}
}
]
});
BPromise.resolve()
.then(function () {
return fireUp('instantiation/factoryAdapters/constructor');
})
.then(function (instance) {
expect(instance.getMe()).toEqual('instantiation/factoryAdapters/constructor');
expect(instance.index).toBe(1);
})
.then(function () {
return fireUp('dependsOn/constructor');
})
.then(function (instance) {
expect(instance.getMe()).toEqual('instantiation/factoryAdapters/constructor');
expect(instance.index).toBe(1);
})
.then(function () {
return BPromise.all([
fireUp('instantiation/factoryAdapters/constructor'),
fireUp('instantiation/factoryAdapters/constructor'),
fireUp('dependsOn/constructor')
]);
})
.then(function (instances) {
expect(instances[0]).toBe(instances[1]);
expect(instances[1]).toBe(instances[2]);
})
.then(function () {
return fireUp('instantiation/factoryAdapters/constructorMultiple');
})
.then(function (instance) {
expect(instance.getMe()).toEqual('instantiation/factoryAdapters/constructorMultiple');
expect(instance.index).toBe(1);
})
.then(function () {
return fireUp('instantiation/factoryAdapters/constructorMultiple');
})
.then(function (instance) {
expect(instance.getMe()).toEqual('instantiation/factoryAdapters/constructorMultiple');
expect(instance.index).toBe(2);
})
.then(function () {
return BPromise.all([
fireUp('instantiation/factoryAdapters/constructorMultiple'),
fireUp('instantiation/factoryAdapters/constructor')
]);
})
.then(function (instances) {
expect(instances[0]).not.toBe(instances[1]);
instances[0].test = 'x';
expect(instances[1].test).not.toBeDefined();
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should return module instances of different type', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/instantiation/returnValue/*.js']
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/instantiation/returnValue/'));
BPromise.resolve()
.then(function () {
return fireUp('instantiation/returnValue/simpleValue')
.then(function (instance) {
expect(instance).toEqual(path.join(folder, 'simpleValue.js'));
});
})
.then(function () {
return fireUp('instantiation/returnValue/simpleValueAsync')
.then(function (instance) {
expect(instance).toEqual(path.join(folder, 'simpleValueAsync.js'));
});
})
.then(function () {
return fireUp('instantiation/returnValue/object')
.then(function (instance) {
expect(instance).toEqual({ path: path.join(folder, 'object.js') });
});
})
.then(function () {
return fireUp('instantiation/returnValue/objectAsync')
.then(function (instance) {
expect(instance).toEqual({ path: path.join(folder, 'objectAsync.js') });
});
})
.then(function () {
return fireUp('instantiation/returnValue/function')
.then(function (instance) {
expect(instance()).toEqual(path.join(folder, 'function.js'));
});
})
.then(function () {
return fireUp('instantiation/returnValue/functionAsync')
.then(function (instance) {
expect(instance()).toEqual(path.join(folder, 'functionAsync.js'));
});
})
.then(function () {
return fireUp('instantiation/returnValue/loadAll')
.then(function (instance) {
instance[4] = instance[4]();
instance[5] = instance[5]();
expect(instance).toEqual([
path.join(folder, 'simpleValue.js'),
path.join(folder, 'simpleValueAsync.js'),
{ path: path.join(folder, 'object.js') },
{ path: path.join(folder, 'objectAsync.js') },
path.join(folder, 'function.js'),
path.join(folder, 'functionAsync.js')
]);
});
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should invoke the factory method with correct this pointer', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: [
'../fixtures/modules/special/thisPointer.js',
{
implements: 'special/thisPointer/customModule',
property: 'custom module',
factory: function () {
return this.property;
}
}
]
});
var folder = path.relative(process.cwd(), path.join(__dirname, '../fixtures/modules/special/'));
BPromise.resolve()
.then(function () {
return fireUp('special/thisPointer')
.then(function (instance) {
expect(instance).toEqual(path.join(folder, 'thisPointer.js'));
});
})
.then(function () {
return fireUp('special/thisPointer/customModule')
.then(function (instance) {
expect(instance).toEqual('custom module');
});
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should inject options', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/injection/fireup/*.js'],
option1: 'option1',
option2: 'option2'
});
BPromise.resolve()
.then(function () {
return fireUp('fireUp/options:unknown')
.then(function () {
done(new Error('fireUp should have rejected the promise.'));
})
.catch(fireUp.errors.NoImplementationError, function () {
// This is expected to be called.
});
})
.then(function () {
return fireUp('fireUp/options')
.then(function (instance) {
var options = {
option1: instance.option1,
option2: instance.option2
};
expect(options).toEqual({
option1: 'option1',
option2: 'option2'
});
});
})
.then(function () {
return fireUp('fireUp/options', { option2: 'overwritten', option3: 'extra' })
.then(function (instance) {
var options = {
option1: instance.option1,
option2: instance.option2,
option3: instance.option3
};
expect(options).toEqual({
option1: 'option1',
option2: 'overwritten',
option3: 'extra'
});
});
})
.then(function () {
return fireUp('injection/fireUp/options')
.then(function (instance) {
var options = {
option1: instance.option1,
option2: instance.option2
};
expect(options).toEqual({
option1: 'option1',
option2: 'option2'
});
});
})
.then(function () {
return fireUp('injection/fireUp/options', { option2: 'overwritten', option3: 'extra' })
.then(function (instance) {
var options = {
option1: instance.option1,
option2: instance.option2,
option3: instance.option3
};
expect(options).toEqual({
option1: 'option1',
option2: 'overwritten',
option3: 'extra'
});
});
})
.then(function () {
return fireUp('injection/fireUp/options', { option1: 'overwritten2', option4: 'extra2' })
.then(function (instance) {
var options = {
option1: instance.option1,
option2: instance.option2,
option3: instance.option3,
option4: instance.option4
};
expect(options).toEqual({
option1: 'overwritten2',
option2: 'option2',
option3: undefined,
option4: 'extra2'
});
});
})
.then(function () {
done();
})
.catch(function (err) {
done(err);
});
});
it('should inject the current injector', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/injection/fireup/*.js']
});
BPromise.resolve()
.then(function () {
return fireUp('fireUp/currentInjector:unknown')
.then(function () {
done(new Error('fireUp should have rejected the promise.'));
})
.catch(fireUp.errors.NoImplementationError, function () {
// This is expected to be called.
});
})
.then(function () {
return fireUp('fireUp/currentInjector')
.then(function (instance) {
expect(instance).toBe(fireUp);
});
})
.then(function () {
return fireUp('injection/fireUp/currentInjector')
.then(function (instance) {
expect(instance).toBe(fireUp);
});
})
.then(function () {
done();
})
.catch(function (e) {
done(e);
});
});
it('should inject the injectionRequest', function (done) {
var fireUp = fireUpLib.newInjector({
basePath: __dirname,
modules: ['../fixtures/modules/injection/fireup/*.js'],
option1: 'option1',
option2: 'option2'
});
BPromise.resolve()
.then(function () {
return fireUp('fireUp/injectionRequest:unknown')
.then(function () {
done(new Error('fireUp should have rejected the promise.'));
})
.catch(fireUp.errors.NoImplementationError, function () {
// This is expected to be called.
});
})
.then(function () {
return fireUp('fireUp/injectionRequest')
.then(function (injectionRequest) {
expect(injectionRequest).toBeUndefined();
});
})
.then(function () {
return fireUp('injection/fireUp/injectionRequest')
.then(function (injectionRequest) {
expect(_.isPlainObject(injectionRequest)).toBe(true);
expect(injectionRequest.moduleReference).toEqual('injection/fireUp/injectionRequest');
expect(injectionRequest.parsedModuleReference).toEqual({ segments: ['injection/fireUp/injectionRequest'], args: [] });
expect(injectionRequest.usedInterface).toEqual('injection/fireUp/injectionRequest');
expect(injectionRequest.implementedByVirtualModule).toBe(false);
expect(injectionRequest.cachedModule).toBe(require('../fixtures/modules/injection/fireup/injectionRequest.js'));
expect(injectionRequest.parent).toBeUndefined();
expect(injectionRequest.nestingLevel).toEqual(0);
});
})
.then(function () {
return fireUp('injection/fireUp/injectionRequest(test, 2)')
.then(function (injectionRequest) {
expect(injectionRequest.moduleReference).toEqual('injection/fireUp/injectionRequest(test, 2)');
expect(injectionRequest.parsedModuleReference).toEqual({ segments: ['injection/fireUp/injectionRequest'], args: ['test', 2] });
expect(injectionRequest.usedInterface).toEqual('injection/fireUp/injectionRequest');
});
})
.then(function () {
return fireUp('injection/fireUp/nestedInjectionRequest')
.then(function (injectionRequest) {
expect(injectionRequest.moduleReference).toEqual('injection/fireUp/injectionRequest');
expect(injectionRequest.usedInterface).toEqual('injection/fireUp/injectionRequest');
expect(injectionRequest.cachedModule).toBe(require('../fixtures/modules/injection/fireup/injectionRequest.js'));
expect(injectionRequest.nestingLevel).toEqual(1);
expect(_.isPlainObject(injectionRequest.parent)).toBe(true);
expect(injectionRequest.parent.moduleReference).toEqual('injection/fireUp/nestedInjectionRequest');
expect(injectionRequest.parent.parsedModuleReference).toEqual({ segments: ['injection/fireUp/nestedInjectionRequest'], args: [] });
expect(injectionRequest.parent.usedInterface).toEqual('injection/fireUp/nestedInjectionRequest');
expect(injectionRequest.parent.implementedByVirtualModule).toBe(false);
expect(injectionRequest.parent.cachedModule).toBe(require('../fixtures/modules/injection/fireup/nestedInjectionRequest.js'));
expect(injectionRequest.parent.parent).toBeUndefined();
expect(injectionRequest.parent.nestingLevel).toEqual(0);
});
})
.then(function () {
return fireUp('injection/fireUp/injectionRequest:*')
.then(function (instances) {
expect(_.isPlainObject(instances['injection/fireUp/injectionRequest:plain'])).toBe(true);
expect(instances['injection/fireUp/injectionRequest:plain'].moduleReference).toEqual('injection/fireUp/injectionRequest:plain');
expect(instances['injection/fireUp/injectionRequest:plain'].parsedModuleReference).toEqual({ segments: ['injection/fireUp/injectionRequest', 'plain'], args: [] });
expect(instances['injection/fireUp/injectionRequest:plain'].usedInterface).toEqual('injection/fireUp/injectionRequest:plain');
expect(instances['injection/fireUp/injectionRequest:plain'].implementedByVirtualModule).toBe(false);
expect(instances['injection/fireUp/injectionRequest:plain'].cachedModule).toBe(require('../fixtures/modules/injection/fireup/injectionRequest.js'));
expect(instances['injection/fireUp/injectionRequest:plain'].parent).not.toBeUndefined();
expect(instances['injection/fireUp/injectionRequest:plain'].nestingLevel).toEqual(1);
expect(_.isPlainObject(instances['injection/fireUp/injectionRequest:plain'].parent)).toBe(true);
expect(instances['injection/fireUp/injectionRequest:plain'].parent.moduleReference).toEqual('injection/fireUp/injectionRequest:*');
expect(instances['injection/fireUp/injectionRequest:plain'].parent.parsedModuleReference).toEqual({ segments: ['injection/fireUp/injectionRequest', '*'], args: [] });
expect(instances['injection/fireUp/injectionRequest:plain'].parent.usedInterface).toBeUndefined();
expect(instances['injection/fireUp/injectionRequest:plain'].parent.implementedByVirtualModule).toBe(true);
expect(instances['injection/fireUp/injectionRequest:plain'].parent.cachedModule).toBeUndefined();
expect(instances['injection/fireUp/injectionRequest:plain'].parent.parent).toBeUndefined();
expect(instances['injection/fireUp/injectionRequest:plain'].parent.nestingLevel).toEqual(0);
expect(instances['injection/fireUp/injectionRequest:nested'].moduleReference).toEqual('injection/fireUp/injectionRequest');
expect(instances['injection/fireUp/injectionRequest:nested'].usedInterface).toEqual('injection/fireUp/injectionRequest');
expect(instances['injection/fireUp/injectionRequest:nested'].cachedModule).toBe(require('../fixtures/modules/injection/fireup/injectionRequest.js'));
expect(instances['injection/fireUp/injectionRequest:nested'].nestingLevel).toEqual(2);
expect(_.isPlainObject(instances['injection/fireUp/injectionRequest:nested'].parent)).toBe(true);
expect(instances['injection/fireUp/injectionRequest:nested'].parent.moduleReference).toEqual('injection/fireUp/injectionRequest:nested');
expect(instances['injection/fireUp/injectionRequest:nested'].parent.parsedModuleReference).toEqual({ segments: ['injection/fireUp/injectionRequest', 'nested'], args: [] });
expect(instances['injection/fireUp/injectionRequest:nested'].parent.usedInterface).toEqual('injection/fireUp/injectionRequest:nested');
expect(instances['injection/fireUp/injectionRequest:nested'].parent.implementedByVirtualModule).toBe(false);
expect(instances['injection/fireUp/injectionRequest:nested'].parent.cachedModule).toBe(require('../fixtures/modules/injection/fireup/nestedInjectionRequest.js'));
expect(instances['injection/fireUp/injectionRequest:nested'].parent.parent).not.toBeUndefined();
expect(instances['injection/fireUp/injectionRequest:nested'].parent.nestingLevel).toEqual(1);
expect(instances['injection/fireUp/injectionRequest:nested'].parent.parent).toEqual(instances['injection/fireUp/injectionRequest:plain'].parent);
});
})
.then(function () {
return fireUp('injection/fireUp/injectionRequest/base')
.then(function (injectionRequest) {
expect(injectionRequest.moduleReference).toEqual('injection/fireUp/injectionRequest/base');
expect(injectionRequest.usedInterface).toEqual('injection/fireUp/injectionRequest/base');
});
})
.then(function () {
return fireUp('injection/fireUp/injectionRequest/base', { use: ['injection/fireUp/injectionRequest/base:plain'] })
.then(function (injectionRequest) {
expect(injectionRequest.moduleReference).toEqual('injection/fireUp/injectionRequest/base');
expect(injectionRequest.usedInterface).toEqual('injection/fireUp/injectionRequest/base:plain');
});
})
.then(function () {
done();
})
.catch(function (err) {
done(err);
});
});
});