describe('Module: oc.lazyLoad', function() {
|
'use strict';
|
|
var $ocLazyLoad,
|
$rootScope,
|
$controller,
|
$injector,
|
$filter,
|
$compile,
|
$httpBackend,
|
$log,
|
element,
|
lazyLoadUrl = '/base/tests/unit/lazyLoad/',
|
triggerDigests = function() {
|
return setInterval(function() {
|
$rootScope.$digest();
|
}, 10)
|
};
|
|
describe('with app1', function() {
|
|
beforeEach(function() {
|
module('app1');
|
|
// get the $httpBackend from E2E tests (because the one for unit tests sucks)
|
module('ngMockE2E');
|
module(function($provide) {
|
//retrieve the $httpBackend from module ng and override $delegate from ngMockE2E
|
angular.injector(['ng'])
|
.invoke(function($httpBackend) {
|
$provide.value('$delegate', $httpBackend);
|
});
|
|
//retrieve the $httpBackend from module ng and override $delegate from ngMockE2E
|
angular.injector(['ngMockE2E'])
|
.invoke(['$httpBackend', function(_$httpBackend_) {
|
$httpBackend = _$httpBackend_;
|
}]);
|
|
$provide.value('$httpBackend', $httpBackend);
|
});
|
|
// get the services for all tests
|
inject(function(_$ocLazyLoad_, _$rootScope_, _$controller_, _$injector_, _$filter_, _$compile_, _$log_) {
|
$ocLazyLoad = _$ocLazyLoad_;
|
$rootScope = _$rootScope_;
|
$controller = _$controller_;
|
$injector = _$injector_;
|
$filter = _$filter_;
|
$compile = _$compile_;
|
$log = _$log_;
|
});
|
|
// allow requests for lazy loaded files
|
$httpBackend.when('GET', new RegExp(lazyLoadUrl)).passThrough();
|
});
|
|
it('service should be defined', function() {
|
expect($ocLazyLoad).toBeDefined();
|
});
|
|
it('getModules should be working', function() {
|
expect($ocLazyLoad.getModules).toBeDefined();
|
expect(angular.isArray($ocLazyLoad.getModules())).toBe(true);
|
});
|
|
it('loadedModules should be working', function() {
|
expect($ocLazyLoad.getModules()).toEqual(['ng', 'oc.lazyLoad']);
|
});
|
|
it('angular.bootstrap should add the module to the loaded list', function() {
|
angular.bootstrap(document, ['app1']);
|
expect($ocLazyLoad.getModules()).toEqual(['ng', 'oc.lazyLoad', 'app1']);
|
});
|
|
it('isLoaded should be working', function() {
|
expect($ocLazyLoad.isLoaded).toBeDefined();
|
expect($ocLazyLoad.isLoaded).toThrowError('You need to define the module(s) name(s)');
|
expect($ocLazyLoad.isLoaded('app1')).toBe(true); // string arg
|
expect($ocLazyLoad.isLoaded(['ng', 'app1'])).toBe(true); // array arg
|
expect($ocLazyLoad.isLoaded('noModule')).toBe(false);
|
expect($ocLazyLoad.isLoaded(['ng', 'noModule'])).toBe(false);
|
});
|
|
it('getModuleConfig should be working', function() {
|
expect($ocLazyLoad.getModuleConfig).toBeDefined();
|
expect($ocLazyLoad.getModuleConfig).toThrowError('You need to give the name of the module to get');
|
expect($ocLazyLoad.getModuleConfig('noModule')).toBe(null);
|
expect($ocLazyLoad.getModuleConfig('test')).toEqual({name: 'test', files: []});
|
});
|
|
it('setModuleConfig should be working', function() {
|
expect($ocLazyLoad.setModuleConfig).toBeDefined();
|
expect($ocLazyLoad.setModuleConfig).toThrowError('You need to give the module config object to set');
|
expect($ocLazyLoad.setModuleConfig({name: 'test2'})).toEqual({name: 'test2'});
|
expect($ocLazyLoad.getModuleConfig('test2')).toEqual({name: 'test2'}); // check if set worked
|
});
|
|
it('should be able to lazy load a module', function(done) {
|
var interval = triggerDigests(),
|
templateUrl = lazyLoadUrl + 'test.html',
|
testModule = [
|
lazyLoadUrl + 'testModule.js',
|
lazyLoadUrl + 'test.css',
|
templateUrl
|
];
|
|
// create spies for the following tests
|
window.spy = jasmine.createSpyObj('spy', ['config', 'run', 'ctrl', 'service', 'filter', 'directive', 'decorator']);
|
|
$ocLazyLoad.load(testModule).then(function success(res) {
|
window.clearInterval(interval);
|
|
// Test the module loading
|
expect(function() {
|
angular.module('testModule')
|
}).not.toThrow();
|
expect(angular.module('testModule')).toBeDefined();
|
|
// execute controller
|
expect(function() {
|
$controller('TestCtrl', {$scope: $rootScope.$new()});
|
}).not.toThrow();
|
|
// instantiate service
|
expect(function() {
|
$injector.get('testService');
|
}).not.toThrow();
|
|
// execute filter
|
expect(function() {
|
$filter('testFilter');
|
}).not.toThrow();
|
|
// Compile a piece of HTML containing the directive
|
element = $compile("<test></test>")($rootScope.$new());
|
|
// Test the template loading
|
var $templateCache;
|
expect(function() {
|
$templateCache = $injector.get('$templateCache');
|
}).not.toThrow();
|
expect($templateCache.get('/partials/test.html')).toEqual('Test partial content');
|
|
// Test the css loading
|
var links = document.getElementsByTagName('link');
|
expect(links.length).toBeGreaterThan(0);
|
expect(function() {
|
links[links.length - 1].sheet.cssRules;
|
}).not.toThrow(); // this only works if a stylesheet has been loaded
|
expect(links[links.length - 1].sheet.cssRules).toBeDefined();
|
|
// because debug is set to false, we shouldn't have any log
|
$log.assertEmpty();
|
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should be able to execute config blocks', function() {
|
expect(window.spy.config).toHaveBeenCalledWith('config1');
|
expect(window.spy.config).toHaveBeenCalledWith('config2');
|
expect(window.spy.config.calls.count()).toEqual(2);
|
});
|
|
it('should be able to execute run blocks', function() {
|
expect(window.spy.run).toHaveBeenCalledWith('run1');
|
expect(window.spy.run).toHaveBeenCalledWith('run2');
|
expect(window.spy.run.calls.count()).toEqual(2);
|
});
|
|
it('should be able to define controllers', function() {
|
expect(window.spy.ctrl).toHaveBeenCalledWith('ctrl');
|
expect(window.spy.ctrl.calls.count()).toEqual(1);
|
});
|
|
it('should be able to define services', function() {
|
expect(window.spy.service).toHaveBeenCalledWith('service');
|
expect(window.spy.service.calls.count()).toEqual(1);
|
});
|
|
it('should be able to define filters', function() {
|
expect(window.spy.filter).toHaveBeenCalledWith('filter');
|
expect(window.spy.filter.calls.count()).toEqual(1);
|
});
|
|
it('should be able to define directives', function() {
|
expect(window.spy.directive).toHaveBeenCalledWith('directive');
|
expect(window.spy.directive.calls.count()).toEqual(1);
|
expect(element.html()).toContain("Test template");
|
});
|
|
if(angular.version.minor > 3) { // only in angular 1.4+
|
it('should be able to define decorators', function() {
|
expect(window.spy.decorator).toHaveBeenCalledWith('decorator');
|
expect(window.spy.service.calls.count()).toEqual(1);
|
});
|
}
|
|
it('should be able to resolve a file name with url parameters', function(done) {
|
var interval = triggerDigests(),
|
testModule = [
|
lazyLoadUrl + 'test.html?v=xy12'
|
];
|
|
$ocLazyLoad.load(testModule).then(function success(res) {
|
window.clearInterval(interval);
|
|
var $templateCache = $injector.get('$templateCache');
|
expect($templateCache.get('/partials/test.html')).toEqual('Test partial content');
|
|
// because debug is set to false, we shouldn't have any log
|
$log.assertEmpty();
|
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should be able to lazy load a module when specifying a file type', function(done) {
|
var interval = triggerDigests(),
|
testModuleNoExt = [
|
{type: 'js', path: lazyLoadUrl + 'testModule.fakejs'},
|
lazyLoadUrl + 'test.css',
|
'html!' + lazyLoadUrl + 'test.html'
|
];
|
|
$ocLazyLoad.load(testModuleNoExt).then(function success(res) {
|
window.clearInterval(interval);
|
|
// Test the module loading
|
expect(angular.module('testModuleNoExt')).toBeDefined();
|
|
// execute controller
|
$controller('TestCtrlNoExt', {$scope: $rootScope.$new()});
|
|
// instantiate service
|
$injector.get('testServiceNoExt');
|
|
// execute filter
|
$filter('testFilterNoExt');
|
|
// Compile a piece of HTML containing the directive
|
element = $compile("<test-no-ext></test-no-ext>")($rootScope.$new());
|
|
// Test the template loading
|
var $templateCache = $injector.get('$templateCache');
|
expect($templateCache.get('/partials/test.html')).toEqual('Test partial content');
|
|
// Test the css loading
|
var links = document.getElementsByTagName('link');
|
expect(links.length).toBeGreaterThan(0);
|
expect(function() {
|
links[links.length - 1].sheet.cssRules;
|
}).not.toThrow(); // this only works if a stylesheet has been loaded
|
expect(links[links.length - 1].sheet.cssRules).toBeDefined();
|
|
// because debug is set to false, we shouldn't have any log
|
$log.assertEmpty();
|
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should be able to lazy load a module when the url ends with a hash', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load(lazyLoadUrl + 'testModule4.js#hash').then(function success(res) {
|
window.clearInterval(interval);
|
|
// Test the module loading
|
expect(angular.module('testModule4')).toBeDefined();
|
|
// Test the module loading
|
expect(res).toBeDefined();
|
|
// because debug is set to false, we shouldn't have any log
|
$log.assertEmpty();
|
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should reject the promise when the jsLoader is unable to load a file', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load(lazyLoadUrl + 'noFile.js').then(function success(res) {
|
window.clearInterval(interval);
|
throw(new Error('failed!'));
|
}, function error(err) {
|
expect(err.message).toEqual('Unable to load ' + lazyLoadUrl + 'noFile.js');
|
window.clearInterval(interval);
|
done();
|
});
|
});
|
|
// test 17
|
it('should reject the promise when the cssLoader is unable to load a file', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load(lazyLoadUrl + 'noFile.css').then(function success(res) {
|
window.clearInterval(interval);
|
throw(new Error('failed!'));
|
}, function error(err) {
|
expect(err.message).toEqual('Unable to load ' + lazyLoadUrl + 'noFile.css');
|
window.clearInterval(interval);
|
done();
|
});
|
});
|
|
it('should reject the promise when the templateLoader is unable to load a file', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load(lazyLoadUrl + 'noFile.html').then(function success(res) {
|
window.clearInterval(interval);
|
throw(new Error('failed!'));
|
}, function error(err) {
|
expect(err.message).toEqual('Unable to load template file "' + lazyLoadUrl + 'noFile.html": NOT FOUND');
|
window.clearInterval(interval);
|
done();
|
});
|
});
|
|
it('should throw if you try to load a module with missing dependencies', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load([lazyLoadUrl + 'testModule3.js']).then(function success(res) {
|
window.clearInterval(interval);
|
throw(new Error('failed!'));
|
}, function error(err) {
|
expect(err).toBeDefined();
|
window.clearInterval(interval);
|
done();
|
});
|
});
|
|
it('should be able to load a module with dependencies', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load([lazyLoadUrl + 'testModule2.js', lazyLoadUrl + 'testModule3.js']).then(function success(res) {
|
expect(function() {
|
angular.module('testModule2');
|
angular.module('testModule3');
|
}).not.toThrow();
|
window.clearInterval(interval);
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should be able to load a module with params', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load({files: [lazyLoadUrl + 'testModule2.js'], cache: false}).then(function success(res) {
|
expect(function() {
|
angular.module('testModule2');
|
}).not.toThrow();
|
window.clearInterval(interval);
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should be able to load a component defined as an object', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load(lazyLoadUrl + 'testModule5.js').then(function success(res) {
|
expect(function() {
|
angular.module('testModule5');
|
}).not.toThrow();
|
|
// execute controller
|
expect(function() {
|
$controller('testModule5Ctrl', {$scope: $rootScope.$new()});
|
}).not.toThrow();
|
|
window.clearInterval(interval);
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should be able to load a module with insertBefore', function(done) {
|
var interval = triggerDigests();
|
|
$ocLazyLoad.load({files: [lazyLoadUrl + 'testModule6.js'], insertBefore: "title"}).then(function success(res) {
|
expect(function() {
|
angular.module('testModule6');
|
}).not.toThrow();
|
window.clearInterval(interval);
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should be able to load files with the param serie set to true', function(done) {
|
var interval = triggerDigests(),
|
params = {files: [lazyLoadUrl + 'testModule5.js', lazyLoadUrl + 'testModule6.js'], serie: true};
|
|
$ocLazyLoad.load(params).then(function success(res) {
|
expect(function() {
|
angular.module('testModule5');
|
angular.module('testModule6');
|
}).not.toThrow();
|
|
expect(params.files.length).toEqual(2); // it should not change the original params
|
|
window.clearInterval(interval);
|
done();
|
}, function error(err) {
|
window.clearInterval(interval);
|
throw err;
|
});
|
});
|
|
it('should attach and then compile an element', function(done) {
|
var fileToLoad = lazyLoadUrl + 'myContainer.js';
|
var scope = $rootScope.$new();
|
var interval;
|
|
$ocLazyLoad.load(fileToLoad).then(function success(res) {
|
scope.fileToLoad = fileToLoad;
|
var element = $compile('<div oc-lazy-load="fileToLoad"><my-container></my-container></div>')(scope);
|
setTimeout(function() {
|
// Should be able to save an element during compilation and reference
|
// it after the element has been attached to the parent DOM.
|
// IE throws "Invalid calling object" if the element is compiled and then attached.
|
expect(scope.vm.highlanders.length).toBe(1);
|
|
window.clearInterval(interval);
|
done();
|
}, interval * 2);
|
});
|
|
interval = triggerDigests();
|
});
|
});
|
});
|