deependency
Version:
Deependency is modular and extensible Inversion of Control container to easily introduce dependency injection in your NodeJS modules.
723 lines (463 loc) • 20.5 kB
JavaScript
;
var should = require('should');
var ModuleDefinitionProvider = require('../../lib/definitionProviders/ModuleDefinitionProvider');
describe('Describing [ModuleDefinitionProvider]', () => {
context('calling getServiceDefinition(serviceRegistration)', () => {
context('by providing a serviceRegistration which exposes an object definition', () => {
context('defined locally', () => {
function ObjectDefinition() {
this.toString = () => 'ObjectDefinition';
}
var serviceRegistration = {
module: ObjectDefinition,
};
describe('the serviceDefinition', () => {
var serviceDefinition = null;
before(() => {
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
serviceDefinition = serviceDefinitionService.getServiceDefinition(serviceRegistration);
});
it('should not be null or undefined', () => {
should(serviceDefinition).be.not.undefined();
should(serviceDefinition).be.not.null();
});
it('should be named as the object constructor name', () => {
should(serviceDefinition.names).be.Array();
serviceDefinition.names.should.have.length(1);
serviceDefinition.names.should.match(['ObjectDefinition']);
});
it('should have a factory method', () => {
should(serviceDefinition.factoryMethod).be.Function();
});
it('should allow to get an instance of the registered object', () => {
var instance = serviceDefinition.factoryMethod();
should(instance).be.instanceOf(ObjectDefinition);
instance.toString().should.be.equal('ObjectDefinition');
});
it('should always return a new instance', () => {
var firstTime = serviceDefinition.factoryMethod();
var secondTime = serviceDefinition.factoryMethod();
should(secondTime).not.be.equal(firstTime);
});
});
});
context('defined into an external file', () => {
var serviceRegistration = {
module: require('./samples/ExternalObjectDefinition'),
};
describe('the serviceDefinition', () => {
var serviceDefinition = null;
before(() => {
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
serviceDefinition = serviceDefinitionService.getServiceDefinition(serviceRegistration);
});
it('should not be null or undefined', () => {
should(serviceDefinition).be.not.undefined();
should(serviceDefinition).be.not.null();
});
it('should be named as the object constructor name', () => {
should(serviceDefinition.names).be.Array();
serviceDefinition.names.should.have.length(1);
serviceDefinition.names.should.match(['ExternalObjectDefinition']);
});
it('should allow to get a new instance of the registered object', () => {
var firstTime = serviceDefinition.factoryMethod();
var secondTime = serviceDefinition.factoryMethod();
firstTime.toString().should.be.equal('ExternalObjectDefinition');
should(secondTime).not.be.equal(firstTime);
});
});
});
context('defined without any dependency', () => {
describe('the serviceDefinition', () => {
it('should have an empty dependency list', () => {
// Arrange
function ObjectDefinition() { }
var serviceRegistration = {
module: ObjectDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(0);
});
});
});
context('defined with multiple dependencies', () => {
describe('the serviceDefinition', () => {
it('should list all its dependencies respecting the signature order', () => {
// Arrange
function ObjectDefinition(dependencyOne, dependencyTwo) {
}
var serviceRegistration = {
module: ObjectDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(2);
serviceDefinition.dependencies[0].should.be.equal('dependencyOne');
serviceDefinition.dependencies[1].should.be.equal('dependencyTwo');
});
});
});
context('defined with multiple dependencies in a multiline constructor', () => {
describe('the serviceDefinition', () => {
it('should list all its dependencies respecting the signature order', () => {
// Arrange
function ObjectDefinition(
dependencyOne,
dependencyTwo) { }
var serviceRegistration = {
module: ObjectDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(2);
serviceDefinition.dependencies[0].should.be.equal('dependencyOne');
serviceDefinition.dependencies[1].should.be.equal('dependencyTwo');
});
});
});
context('defined anonymous', () => {
describe('the serviceDefinition', () => {
it('should not provide any name', () => {
// Arrange
var serviceRegistration = {
module: function () { },
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
should(serviceDefinition).not.be.null();
serviceDefinition.names.should.have.length(0);
});
});
});
});
context('by providing a serviceRegistration which exposes a class definition', () => {
context('defined locally', () => {
class ClassDefinition {
toString () {
return 'ClassDefinition';
}
}
var serviceRegistration = {
module: ClassDefinition,
};
describe('the serviceDefinition', () => {
var serviceDefinition = null;
before(() => {
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
serviceDefinition = serviceDefinitionService.getServiceDefinition(serviceRegistration);
});
it('should not be null or undefined', () => {
should(serviceDefinition).be.not.undefined();
should(serviceDefinition).be.not.null();
});
it('should be named as the class name', () => {
should(serviceDefinition.names).be.Array();
serviceDefinition.names.should.have.length(1);
serviceDefinition.names.should.match(['ClassDefinition']);
});
it('should have a factory method', () => {
should(serviceDefinition.factoryMethod).be.Function();
});
it('should allow to get an instance of the registered class', () => {
var instance = serviceDefinition.factoryMethod();
should(instance).be.instanceOf(ClassDefinition);
instance.toString().should.be.equal('ClassDefinition');
});
it('should always return a new class instance', () => {
var firstTime = serviceDefinition.factoryMethod();
var secondTime = serviceDefinition.factoryMethod();
should(secondTime).not.be.equal(firstTime);
});
});
});
context('defined into an external file', () => {
var serviceRegistration = {
module: require('./samples/ExternalClassDefinition'),
};
describe('the serviceDefinition', () => {
var serviceDefinition = null;
before(() => {
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
serviceDefinition = serviceDefinitionService.getServiceDefinition(serviceRegistration);
});
it('should not be null or undefined', () => {
should(serviceDefinition).be.not.undefined();
should(serviceDefinition).be.not.null();
});
it('should be named as the object constructor name', () => {
should(serviceDefinition.names).be.Array();
serviceDefinition.names.should.have.length(1);
serviceDefinition.names.should.match(['ExternalClassDefinition']);
});
it('should allow to get a new instance of the registered object', () => {
var firstTime = serviceDefinition.factoryMethod();
var secondTime = serviceDefinition.factoryMethod();
firstTime.toString().should.be.equal('ExternalClassDefinition');
should(secondTime).not.be.equal(firstTime);
});
});
});
context('defined without any dependency', () => {
describe('the serviceDefinition', () => {
it('should have an empty dependency list', () => {
// Arrange
class ClassDefinition {
constructor() { }
}
var serviceRegistration = {
module: ClassDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(0);
});
});
});
context('defined with multiple dependencies', () => {
describe('the serviceDefinition', () => {
it('should list all its dependencies respecting the signature order', () => {
// Arrange
class ClassDefinition {
constructor(dependencyOne, dependencyTwo) { }
}
var serviceRegistration = {
module: ClassDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(2);
serviceDefinition.dependencies[0].should.be.equal('dependencyOne');
serviceDefinition.dependencies[1].should.be.equal('dependencyTwo');
});
});
});
context('defined with multiple dependencies in a multiline constructor', () => {
describe('the serviceDefinition', () => {
it('should list all its dependencies respecting the signature order', () => {
// Arrange
class ClassDefinition {
constructor(
dependencyOne,
dependencyTwo) { }
}
var serviceRegistration = {
module: ClassDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(2);
serviceDefinition.dependencies[0].should.be.equal('dependencyOne');
serviceDefinition.dependencies[1].should.be.equal('dependencyTwo');
});
});
});
context('defined anonymous', () => {
describe('the serviceDefinition', () => {
it('should not provide any name', () => {
// Arrange
var serviceRegistration = {
module: class { },
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
should(serviceDefinition).not.be.null();
serviceDefinition.names.should.have.length(0);
});
});
});
});
context('by providing a serviceRegistration which exposes a module definition', () => {
context('defined locally', () => {
function ModuleDefinition() {
return {
toString: function () {
return 'ModuleDefinition';
},
};
}
var serviceRegistration = {
module: ModuleDefinition,
};
describe('the serviceDefinition', () => {
var serviceDefinition = null;
before(() => {
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
serviceDefinition = serviceDefinitionService.getServiceDefinition(serviceRegistration);
});
it('should not be null or undefined', () => {
should(serviceDefinition).be.not.undefined();
should(serviceDefinition).be.not.null();
});
it('should be named as the module constructor name', () => {
should(serviceDefinition.names).be.Array();
serviceDefinition.names.should.have.length(1);
serviceDefinition.names.should.match(['ModuleDefinition']);
});
it('should have a factory method', () => {
should(serviceDefinition.factoryMethod).be.Function();
});
it('should allow to get an instance of the registered module', () => {
var instance = serviceDefinition.factoryMethod();
instance.toString().should.be.equal('ModuleDefinition');
});
it('should always return a new module instance', () => {
var firstTime = serviceDefinition.factoryMethod();
var secondTime = serviceDefinition.factoryMethod();
should(secondTime).not.be.equal(firstTime);
});
});
});
context('defined into an external file', () => {
var serviceRegistration = {
module: require('./samples/ExternalModuleDefinition'),
};
describe('the serviceDefinition', () => {
var serviceDefinition = null;
before(() => {
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
serviceDefinition = serviceDefinitionService.getServiceDefinition(serviceRegistration);
});
it('should not be null or undefined', () => {
should(serviceDefinition).be.not.undefined();
should(serviceDefinition).be.not.null();
});
it('should be named as the object constructor name', () => {
should(serviceDefinition.names).be.Array();
serviceDefinition.names.should.have.length(1);
serviceDefinition.names.should.match(['ExternalModuleDefinition']);
});
it('should allow to get a new instance of the registered object', () => {
var firstTime = serviceDefinition.factoryMethod();
var secondTime = serviceDefinition.factoryMethod();
firstTime.toString().should.be.equal('ExternalModuleDefinition');
should(secondTime).not.be.equal(firstTime);
});
});
});
context('defined without any dependency', () => {
describe('the serviceDefinition', () => {
it('should have an empty dependency list', () => {
// Arrange
function ModuleDefinition() {
return { };
}
var serviceRegistration = {
module: ModuleDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(0);
});
});
});
context('defined with multiple dependencies', () => {
describe('the serviceDefinition', () => {
it('should list all its dependencies respecting the signature order', () => {
// Arrange
function ModuleDefinition(dependencyOne, dependencyTwo) {
return { };
}
var serviceRegistration = {
module: ModuleDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(2);
serviceDefinition.dependencies[0].should.be.equal('dependencyOne');
serviceDefinition.dependencies[1].should.be.equal('dependencyTwo');
});
});
});
context('defined with multiple dependencies in a multiline constructor', () => {
describe('the serviceDefinition', () => {
it('should list all its dependencies respecting the signature order', () => {
// Arrange
function ModuleDefinition(
dependencyOne,
dependencyTwo) {
return { };
}
var serviceRegistration = {
module: ModuleDefinition,
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
serviceDefinition.dependencies.should.have.length(2);
serviceDefinition.dependencies[0].should.be.equal('dependencyOne');
serviceDefinition.dependencies[1].should.be.equal('dependencyTwo');
});
});
});
context('defined anonymous', () => {
describe('the serviceDefinition', () => {
it('should not provide any name', () => {
// Arrange
var serviceRegistration = {
module: function () { return { }; },
};
// Act
var serviceDefinitionService = new ModuleDefinitionProvider();
var serviceDefinition = serviceDefinitionService.getServiceDefinition(
serviceRegistration
);
// Assert
should(serviceDefinition).not.be.null();
serviceDefinition.names.should.have.length(0);
});
});
});
});
});
});