backbone-skull
Version:
Skull sits on top of Backbone and protects your application's brains.
135 lines (104 loc) • 5.05 kB
JavaScript
/* eslint-env mocha, browser */
/* global mocha, chai, Skull, _ */
(function (mocha, assert, Skull) {
'use strict';
var ResourceRegistry = Skull.ResourceRegistry;
var processRegistry = ResourceRegistry.processRegistry;
var registry = new ResourceRegistry();
function testFactory (value) {
return value;
}
suite('.ResourceRegistry', function () {
test('registry stores and fetches plain resources', function () {
var resName = 'testRes';
var val = 'testValue';
registry.register(resName, val);
assert.equal(registry.acquire(resName), val, 'Registry fetched correct object');
assert.equal(registry.acquire('some crazy key'), undefined, 'Registry returned undefined to non-existent key');
registry.unregister(resName);
});
test('registry stores and fetches factories', function () {
var option = {answer: 42};
var param = {question: 'To be or not to be'};
var resName = 'testFactory';
registry.register(resName, testFactory, option);
assert.deepEqual(
registry.acquire(resName, param),
_.extend({}, option, param)
);
assert.equal(registry.acquire('some crazy key', {test: true}), undefined, 'Registry returned undefined to non-existent key');
registry.unregister(resName, true);
});
test('registry memoizes factories call', function () {
var option = {answer: 42};
var param = {question: 'To be or not to be'};
var resName = 'testFactory';
var callCounter = 0;
function testMemoizedFactory (value) {
callCounter++;
return value;
}
registry.register(resName, testMemoizedFactory, option);
var firstResult = registry.acquire(resName, param);
assert.equal(callCounter, 1, 'Factory was called first time');
var memoizedResult = registry.acquire(resName, param);
assert.equal(callCounter, 1, 'Factory was not called second time');
assert.deepEqual(firstResult, memoizedResult, 'Memoized results are identical');
registry.acquire(resName, {someOtherParam: Math.PI});
assert.equal(callCounter, 2, 'Factory was called when acquired with different params');
registry.unregister(resName, true);
});
suite('Various form of __registry__ processing', function () {
var option = {answer: 42};
setup(function () {
registry.register('answer', 42);
registry.register('factory', function (val) { return val; }, option);
});
teardown(function () {
registry.unregister('answer');
registry.unregister('factory', true);
});
test('processRegistry acquires values from registry when __registry__ is plain object', function () {
var param = {question: 'To be or not to be'},
obj = {
registry: registry,
__registry__: {
answer: 'answer',
factory: ['factory', param]
}
};
processRegistry(obj);
assert.equal(obj.answer, 42, 'Plain resource fetched correctly');
assert.deepEqual(obj.factory, _.extend({}, option, param), 'Factory result fetched correctly');
});
test('processRegistry acquires values from registry when __registry__ is array', function () {
var param = {question: 'To be or not to be'},
obj = {
registry: registry,
__registry__: [
'answer',
['factory', param]
]
};
processRegistry(obj);
assert.equal(obj.answer, 42, 'Plain resource fetched correctly');
assert.deepEqual(obj.factory, _.extend({}, option, param), 'Factory result fetched correctly');
});
test('processRegistry acquires values from registry when __registry__ is function', function () {
var param = {question: 'To be or not to be'},
obj = {
registry: registry,
__registry__: function () {
return {
answer: 'answer',
factory: ['factory', param]
};
}
};
processRegistry(obj);
assert.equal(obj.answer, 42, 'Plain resource fetched correctly');
assert.deepEqual(obj.factory, _.extend({}, option, param), 'Factory result fetched correctly');
});
});
});
})(mocha, chai.assert, Skull);