'use strict';
describe('$templateRequest', function() {
describe('provider', function() {
describe('httpOptions', function() {
it('should default to undefined and fallback to default $http options', function() {
var defaultHeader;
module(function($templateRequestProvider) {
expect($templateRequestProvider.httpOptions()).toBeUndefined();
});
inject(function($templateRequest, $http, $templateCache) {
spyOn($http, 'get').and.callThrough();
$templateRequest('tpl.html');
expect($http.get).toHaveBeenCalledOnceWith('tpl.html', {
cache: $templateCache,
transformResponse: []
});
});
});
it('should be configurable', function() {
function someTransform() {}
module(function($templateRequestProvider) {
// Configure the template request service to provide specific headers and transforms
$templateRequestProvider.httpOptions({
headers: { Accept: 'moo' },
transformResponse: [someTransform]
});
});
inject(function($templateRequest, $http, $templateCache) {
spyOn($http, 'get').and.callThrough();
$templateRequest('tpl.html');
expect($http.get).toHaveBeenCalledOnceWith('tpl.html', {
cache: $templateCache,
transformResponse: [someTransform],
headers: { Accept: 'moo' }
});
});
});
it('should be allow you to override the cache', function() {
var httpOptions = {};
module(function($templateRequestProvider) {
$templateRequestProvider.httpOptions(httpOptions);
});
inject(function($templateRequest, $http, $cacheFactory) {
spyOn($http, 'get').and.callThrough();
var customCache = $cacheFactory('customCache');
httpOptions.cache = customCache;
$templateRequest('tpl.html');
expect($http.get).toHaveBeenCalledOnceWith('tpl.html', {
cache: customCache,
transformResponse: []
});
});
});
});
});
it('should download the provided template file',
inject(function($rootScope, $templateRequest, $httpBackend) {
$httpBackend.expectGET('tpl.html').respond('
abc
');
var content;
$templateRequest('tpl.html').then(function(html) { content = html; });
$rootScope.$digest();
$httpBackend.flush();
expect(content).toBe('abc
');
}));
it('should cache the request to prevent extra downloads',
inject(function($rootScope, $templateRequest, $templateCache, $httpBackend) {
$httpBackend.expectGET('tpl.html').respond('matias');
var content = [];
function tplRequestCb(html) {
content.push(html);
}
$templateRequest('tpl.html').then(tplRequestCb);
$httpBackend.flush();
$templateRequest('tpl.html').then(tplRequestCb);
$rootScope.$digest();
expect(content[0]).toBe('matias');
expect(content[1]).toBe('matias');
expect($templateCache.get('tpl.html')).toBe('matias');
}));
it('should return the cached value on the first request',
inject(function($rootScope, $templateRequest, $templateCache, $httpBackend) {
$httpBackend.expectGET('tpl.html').respond('matias');
spyOn($templateCache, 'put').and.returnValue('_matias');
var content = [];
function tplRequestCb(html) {
content.push(html);
}
$templateRequest('tpl.html').then(tplRequestCb);
$rootScope.$digest();
$httpBackend.flush();
expect(content[0]).toBe('_matias');
}));
it('should call `$exceptionHandler` on request error', function() {
module(function($exceptionHandlerProvider) {
$exceptionHandlerProvider.mode('log');
});
inject(function($exceptionHandler, $httpBackend, $templateRequest) {
$httpBackend.expectGET('tpl.html').respond(404, '', {}, 'Not Found');
var err;
$templateRequest('tpl.html').catch(function(reason) { err = reason; });
$httpBackend.flush();
expect(err).toEqualMinErr('$templateRequest', 'tpload',
'Failed to load template: tpl.html (HTTP status: 404 Not Found)');
expect($exceptionHandler.errors[0]).toEqualMinErr('$templateRequest', 'tpload',
'Failed to load template: tpl.html (HTTP status: 404 Not Found)');
});
});
it('should not call `$exceptionHandler` on request error when `ignoreRequestError` is true',
function() {
module(function($exceptionHandlerProvider) {
$exceptionHandlerProvider.mode('log');
});
inject(function($exceptionHandler, $httpBackend, $templateRequest) {
$httpBackend.expectGET('tpl.html').respond(404);
var err;
$templateRequest('tpl.html', true).catch(function(reason) { err = reason; });
$httpBackend.flush();
expect(err.status).toBe(404);
expect($exceptionHandler.errors).toEqual([]);
});
}
);
it('should not call `$exceptionHandler` when the template is empty',
inject(function($exceptionHandler, $httpBackend, $rootScope, $templateRequest) {
$httpBackend.expectGET('tpl.html').respond('');
var onError = jasmine.createSpy('onError');
$templateRequest('tpl.html').catch(onError);
$rootScope.$digest();
$httpBackend.flush();
expect(onError).not.toHaveBeenCalled();
expect($exceptionHandler.errors).toEqual([]);
})
);
it('should accept empty templates and refuse null or undefined templates in cache',
inject(function($rootScope, $templateRequest, $templateCache, $sce) {
// Will throw on any template not in cache.
spyOn($sce, 'getTrustedResourceUrl').and.returnValue(false);
expect(function() {
$templateRequest('tpl.html'); // should go through $sce
$rootScope.$digest();
}).toThrow();
$templateCache.put('tpl.html'); // is a no-op, so $sce check as well.
expect(function() {
$templateRequest('tpl.html');
$rootScope.$digest();
}).toThrow();
$templateCache.removeAll();
$templateCache.put('tpl.html', null); // makes no sense, but it's been added, so trust it.
expect(function() {
$templateRequest('tpl.html');
$rootScope.$digest();
}).not.toThrow();
$templateCache.removeAll();
$templateCache.put('tpl.html', ''); // should work (empty template)
expect(function() {
$templateRequest('tpl.html');
$rootScope.$digest();
}).not.toThrow();
$templateCache.removeAll();
}));
it('should keep track of how many requests are going on',
inject(function($rootScope, $templateRequest, $httpBackend) {
$httpBackend.expectGET('a.html').respond('a');
$httpBackend.expectGET('b.html').respond('c');
$templateRequest('a.html');
$templateRequest('b.html');
expect($templateRequest.totalPendingRequests).toBe(2);
$rootScope.$digest();
$httpBackend.flush();
expect($templateRequest.totalPendingRequests).toBe(0);
$httpBackend.expectGET('c.html').respond(404);
$templateRequest('c.html');
expect($templateRequest.totalPendingRequests).toBe(1);
$rootScope.$digest();
try {
$httpBackend.flush();
} catch (e) { /* empty */ }
expect($templateRequest.totalPendingRequests).toBe(0);
}));
it('should not try to parse a response as JSON',
inject(function($templateRequest, $httpBackend) {
var spy = jasmine.createSpy('success');
$httpBackend.expectGET('a.html').respond('{{text}}', {
'Content-Type': 'application/json'
});
$templateRequest('a.html').then(spy);
$httpBackend.flush();
expect(spy).toHaveBeenCalledOnceWith('{{text}}');
}));
it('should use custom response transformers (array)', function() {
module(function($httpProvider) {
$httpProvider.defaults.transformResponse.push(function(data) {
return data + '!!';
});
});
inject(function($templateRequest, $httpBackend) {
var spy = jasmine.createSpy('success');
$httpBackend.expectGET('a.html').respond('{{text}}', {
'Content-Type': 'application/json'
});
$templateRequest('a.html').then(spy);
$httpBackend.flush();
expect(spy).toHaveBeenCalledOnceWith('{{text}}!!');
});
});
it('should use custom response transformers (function)', function() {
module(function($httpProvider) {
$httpProvider.defaults.transformResponse = function(data) {
return data + '!!';
};
});
inject(function($templateRequest, $httpBackend) {
var spy = jasmine.createSpy('success');
$httpBackend.expectGET('a.html').respond('{{text}}', {
'Content-Type': 'application/json'
});
$templateRequest('a.html').then(spy);
$httpBackend.flush();
expect(spy).toHaveBeenCalledOnceWith('{{text}}!!');
});
});
});