///
///
///
///
///
describe('DataService', function () {
const contentBlock = new ContentBlock('', 'my-path', 'api-key', 'host');
describe('The content block loader', function () {
const ajaxService = new AjaxService();
const blocks = {
content_blocks: [AjaxServiceMockData.existingContentBlock1(), AjaxServiceMockData.existingContentBlock2()]
};
it('loads a readonly content block', function () {
const spy = spyOn(ajaxService, 'fetchContentBlocks');
spy.and.callFake(() => jQuery.Deferred().resolve(blocks).promise());
const service = new DataService(ajaxService);
service.loadReadonlyContent(contentBlock).then((block:ContentBlock) => {
expect(block.content).toBe('some content');
expect(block.contentPath).toBe('my-path');
expect(block.apiKey).toBe('api-key');
expect(block.apiHost).toBe('host');
expect(block.createdAt).toEqual(new Date(2015, 11, 30));
expect(block.updatedAt).toEqual(new Date(2015, 12, 3));
});
expect(ajaxService.fetchContentBlocks).toHaveBeenCalledWith(contentBlock.apiKey, contentBlock.apiHost, true);
expect(spy.calls.count()).toBe(1);
service.loadReadonlyContent(contentBlock);
expect(spy.calls.count()).toBe(1);
});
it('loads an editable content block without caching', function () {
const contentBlocksSpy = spyOn(ajaxService, 'fetchContentBlocks');
contentBlocksSpy.and.callFake(() => jQuery.Deferred().resolve(blocks).promise());
const renuoUploadCredentialsSpy = spyOn(ajaxService, 'getRenuoUploadCredentials');
const credentials:AjaxRenuoUploadCredentials = {
renuo_upload_credentials: {
api_key: 'upload-api-key',
signing_url: 'signing-url'
}
};
renuoUploadCredentialsSpy.and.callFake(() => jQuery.Deferred().resolve(credentials).promise());
const service = new DataService(ajaxService);
service.loadEditableContent(contentBlock, 'pk').then((block:EditableContentBlock) => {
expect(block.contentBlock.content).toBe('some content');
expect(block.contentBlock.contentPath).toBe('my-path');
expect(block.contentBlock.apiKey).toBe('api-key');
expect(block.contentBlock.apiHost).toBe('host');
expect(block.contentBlock.updatedAt).toEqual(new Date(2015, 12, 3));
expect(block.contentBlock.createdAt).toEqual(new Date(2015, 11, 30));
expect(block.renuoUploadCredentials.apiKey).toEqual('upload-api-key');
expect(block.renuoUploadCredentials.signingUrl).toEqual('signing-url');
});
expect(ajaxService.fetchContentBlocks).toHaveBeenCalledWith(contentBlock.apiKey, contentBlock.apiHost, false);
expect(contentBlocksSpy.calls.count()).toBe(1);
expect(renuoUploadCredentialsSpy.calls.count()).toBe(1);
service.loadEditableContent(contentBlock, 'pk').then((block:EditableContentBlock) => {});
expect(contentBlocksSpy.calls.count()).toBe(1);
expect(renuoUploadCredentialsSpy.calls.count()).toBe(1);
});
it('returns the same block on local storage cache miss', function() {
localStorage.clear();
const service = new DataService(ajaxService);
const block = service.loadReadonlyContentFromCache(contentBlock);
expect(block).toBe(contentBlock);
});
it('fetches a content block from the local storage', function() {
const contentBlocksSpy = spyOn(ajaxService, 'fetchContentBlocks');
contentBlocksSpy.and.callFake(() => jQuery.Deferred().resolve(blocks).promise());
const service = new DataService(ajaxService);
service.loadReadonlyContent(contentBlock).then((requestedBlock) => {
const cachedBlock = service.loadReadonlyContentFromCache(requestedBlock);
expect(cachedBlock).not.toBe(requestedBlock);
expect(cachedBlock.content).toEqual(requestedBlock.content);
expect(cachedBlock.contentPath).toEqual(requestedBlock.contentPath);
expect(cachedBlock.apiKey).toEqual(requestedBlock.apiKey);
expect(cachedBlock.apiHost).toEqual(requestedBlock.apiHost);
expect(cachedBlock.createdAt).toEqual(requestedBlock.createdAt);
expect(cachedBlock.updatedAt).toEqual(requestedBlock.updatedAt);
});
});
});
it('stores a content block', function () {
const ajaxContentBlock = AjaxServiceMockData.existingContentBlock1();
const existingContentBlock = AjaxServiceMockData.existingContentBlock1();
const ajaxService = new AjaxService();
spyOn(ajaxService, 'storeContentBlock').and.callFake(
() => jQuery.Deferred().resolve({content_block: ajaxContentBlock}).promise());
const localStorageService = new LocalStorageService();
spyOn(localStorageService, 'put');
spyOn(localStorageService, 'fetch').and.returnValue({'my-path2': existingContentBlock});
const service = new DataService(ajaxService, localStorageService);
service.storeContent(contentBlock, 'pk');
expect(ajaxService.storeContentBlock).toHaveBeenCalledWith(contentBlock, 'pk');
const expectedCacheValue = {'my-path': ajaxContentBlock, 'my-path2': existingContentBlock};
expect(localStorageService.put).toHaveBeenCalledWith('host|api-key|true', expectedCacheValue);
expect(localStorageService.put).toHaveBeenCalledWith('host|api-key|false', expectedCacheValue);
});
it('calculates the cache key correctly', function () {
const dataService = new DataService(null);
expect(dataService.cacheKey(contentBlock, false)).toEqual('host|api-key|false');
expect(dataService.cacheKey(contentBlock, true)).toEqual('host|api-key|true');
});
});