diff --git a/lib/initializer.js b/lib/initializer.js index 9c6b45e..4dae138 100644 --- a/lib/initializer.js +++ b/lib/initializer.js @@ -31,6 +31,11 @@ module.exports = function Initializer(type, opts) { mod = Registry.findBy(type, opts[type]); } + if (!mod) { + var err = [ "Unable to find", type, "for", opts[type] ].join(" "); + throw new Error(err); + } + var obj = mod[type](opts); _.each(obj, function(prop, name) { diff --git a/spec/lib/initializer.spec.js b/spec/lib/initializer.spec.js new file mode 100644 index 0000000..69f4eef --- /dev/null +++ b/spec/lib/initializer.spec.js @@ -0,0 +1,101 @@ +"use strict"; + +var initializer = lib("initializer"), + Registry = lib("registry"), + Config = lib("config"); + +var Loopback = lib("test/loopback"), + Ping = lib("test/ping"), + TestAdaptor = lib("test/test-adaptor"), + TestDriver = lib("test/test-driver"); + +describe("Initializer", function() { + beforeEach(function() { + spy(Registry, "findBy"); + stub(Registry, "register"); + }); + + afterEach(function() { + Registry.findBy.restore(); + Registry.register.restore(); + }); + + it("creates an instance of the requested adaptor/driver", function() { + var adaptor = initializer("adaptor", { adaptor: "loopback" }); + expect(adaptor).to.be.an.instanceOf(Loopback); + + var driver = initializer("driver", { driver: "ping" }); + expect(driver).to.be.an.instanceOf(Ping); + }); + + context("if the module isn't registered", function() { + var module; + + beforeEach(function() { + Registry.findBy.restore(); + + module = { + adaptor: stub(), + driver: stub() + }; + + stub(Registry, "findBy") + .onFirstCall().returns(false) + .onSecondCall().returns(module); + }); + + context("if a module key was provided", function() { + it("attempts to register it", function() { + initializer("adaptor", { adaptor: "adaptor", module: "test" }); + expect(Registry.register).to.be.calledWith("test"); + expect(module.adaptor).to.be.called; + }); + }); + + context("if no module key was provided", function() { + it("attempts to find it automatically", function() { + initializer("driver", { driver: "driver" }); + expect(Registry.register).to.be.calledWith("cylon-driver"); + expect(module.driver).to.be.called; + }); + }); + + context("if the module still can't be found", function() { + beforeEach(function() { + Registry.findBy.onSecondCall().returns(false); + }); + + it("throws an error", function() { + function fn() { + return initializer("adaptor", { adaptor: "badadaptor" }); + } + + expect(fn).to.throw("Unable to find adaptor for badadaptor"); + }); + }); + }); + + context("if in test mode", function() { + var tm = Config.testMode, adaptor, driver; + + beforeEach(function() { + Config.testMode = true; + + driver = initializer("driver", { driver: "ping" }); + adaptor = initializer("adaptor", { adaptor: "loopback" }); + }); + + afterEach(function() { + Config.testMode = tm; + }); + + it("creates a test adaptor/driver", function() { + expect(driver).to.be.an.instanceOf(TestDriver); + expect(adaptor).to.be.an.instanceOf(TestAdaptor); + }); + + it("stubs out the driver/adaptor behaviour", function() { + expect(driver.ping).to.be.a("function"); + }); + }); +});