From c637d1d0533c1b085752f68fc9b0671fc591ed74 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Fri, 8 Jul 2016 12:16:09 +0100 Subject: [PATCH] Unit tests --- .../src/assets/document-library.model.mock.ts | 3 +- .../src/components/document-list.spec.ts | 122 ------------------ .../src/data/share-datatable-adapter.spec.ts | 113 +++++++++++++++- .../src/data/share-datatable-adapter.ts | 4 +- 4 files changed, 111 insertions(+), 131 deletions(-) diff --git a/ng2-components/ng2-alfresco-documentlist/src/assets/document-library.model.mock.ts b/ng2-components/ng2-alfresco-documentlist/src/assets/document-library.model.mock.ts index f29c1f8121..20e7820a7a 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/assets/document-library.model.mock.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/assets/document-library.model.mock.ts @@ -33,7 +33,7 @@ export class PageNode extends NodePaging { } export class FileNode extends MinimalNodeEntity { - constructor(name?: string) { + constructor(name?: string, mimeType?: string) { super(); this.entry = new MinimalNodeEntryEntity(); this.entry.id = 'file-id'; @@ -42,6 +42,7 @@ export class FileNode extends MinimalNodeEntity { this.entry.name = name; this.entry.path = new PathInfoEntity(); this.entry.content = new ContentInfo(); + this.entry.content.mimeType = mimeType || 'text/plain'; } } diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.spec.ts index bb0a485fde..2454bb327d 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.spec.ts @@ -416,87 +416,6 @@ describe('DocumentList', () => { expect(documentList.displayFolderContent).toHaveBeenCalled(); }); - // TODO: move to data adapter - /* - it('should generate file icon path based on mime type', () => { - let fileName = 'custom-icon.svg'; - spyOn(alfrescoServiceMock, 'getMimeTypeIcon').and.returnValue(fileName); - documentList.baseComponentPath = '/root'; - - let file = new FileNode(); - file.entry.content.mimeType = 'text/plain'; - - expect(documentList.getThumbnailUrl(file)).toBe(`/root/img/${fileName}`); - }); - */ - - // TODO: move to data adapter - /* - it('should fallback to default icon for missing mime type', () => { - spyOn(documentListService, 'getMimeTypeIcon').and.returnValue(null); - documentList.baseComponentPath = '/root'; - - let file = new FileNode(); - file.entry.content.mimeType = null; - - expect(documentList.getThumbnailUrl(file)).toBe('/root/img/ft_ic_miscellaneous.svg'); - }); - */ - - // TODO: move to data adapter - /* - it('should fallback to default icon for unknown mime type', () => { - spyOn(documentListService, 'getMimeTypeIcon').and.returnValue(null); - documentList.baseComponentPath = '/root'; - - let file = new FileNode(); - file.entry.content.mimeType = 'text/plain'; - - expect(documentList.getThumbnailUrl(file)).toBe('/root/img/ft_ic_miscellaneous.svg'); - }); - */ - - // TODO: move to data adapter - /* - it('should resolve thumbnail url for a file', () => { - let url = 'http://'; - spyOn(documentListService, 'getDocumentThumbnailUrl').and.returnValue(url); - - documentList.thumbnails = true; - - let file = new FileNode(); - expect(documentList.getThumbnailUrl(file)).toBe(url); - }); - */ - - // TODO: move to data adapter - /* - it('should return no thumbnail url with missing service', () => { - let list = new DocumentList(null, null); - list.thumbnails = true; - - let file = new FileNode(); - expect(list.getThumbnailUrl(file)).toBeNull(); - }); - */ - - // TODO: move to data adapter - /* - it('should convert cell value to thumbnail', () => { - let url = 'http://
'; - spyOn(documentList, 'getThumbnailUrl').and.returnValue(url); - - let file = new FileNode(); - - let col = new ContentColumnModel(); - col.source = '$thumbnail'; - col.type = 'image'; - - let value = documentList.getCellValue(file, col); - expect(value).toBe(url); - }); - */ - it('should require path to display folder content', () => { spyOn(documentListService, 'getFolder').and.callThrough(); @@ -579,47 +498,6 @@ describe('DocumentList', () => { expect(documentList.displayFolderContent).not.toHaveBeenCalled(); }); - // TODO: move to data adapter - /* - it('should not sort empty page', () => { - let page = new PageNode(); - spyOn(page.list.entries, 'sort').and.stub(); - - documentList.sort(page, null); - expect(page.list.entries.sort).not.toHaveBeenCalled(); - }); - */ - - // TODO: move to data adapter - /* - it('should put folders to top on sort', () => { - let folder = new FolderNode(); - let file1 = new FileNode('file1'); - let file2 = new FileNode('file2'); - let page = new PageNode([file1, file2, folder]); - - // asc - documentList.sort(page, new ColumnSortingModel({ - key: 'name', - direction: 'asc' - })); - - expect(page.list.entries[0]).toBe(folder); - expect(page.list.entries[1]).toBe(file1); - expect(page.list.entries[2]).toBe(file2); - - // desc - documentList.sort(page, new ColumnSortingModel({ - key: 'name', - direction: 'desc' - })); - - expect(page.list.entries[0]).toBe(folder); - expect(page.list.entries[1]).toBe(file2); - expect(page.list.entries[2]).toBe(file1); - }); - */ - // TODO: move to data adapter /* it('should sort by dates up to ms', () => { diff --git a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts index 40714e06be..a45291a462 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts @@ -16,8 +16,7 @@ */ import { it, describe, expect, beforeEach } from '@angular/core/testing'; -import { DataColumn, DataRow } from 'ng2-alfresco-datatable'; - +import { DataColumn, DataRow, DataSorting } from 'ng2-alfresco-datatable'; import { DocumentListServiceMock } from './../assets/document-list.service.mock'; import { ShareDataTableAdapter, ShareDataRow } from './share-datatable-adapter'; import { FileNode, FolderNode, PageNode } from './../assets/document-library.model.mock'; @@ -209,10 +208,49 @@ describe('ShareDataTableAdapter', () => { expect(console.error).toHaveBeenCalledWith(`Error parsing date ${value} to format ${col.format}`); }); - it('should generate fallback icon for a file thumbnail', () => { - let adapter = new ShareDataTableAdapter(null, basePath, null); + it('should generate fallback icon for a file thumbnail with unknown mime type', () => { + let adapter = new ShareDataTableAdapter(documentListService, basePath, null); - let row = new ShareDataRow(new FileNode()); + let file = new FileNode('file', 'wrong-mime'); + let row = new ShareDataRow(file); + let col = { type: 'image', key: '$thumbnail' }; + + let value = adapter.getValue(row, col); + expect(value).toBe(`${basePath}/img/ft_ic_miscellaneous.svg`); + }); + + it('should generate fallback icon for a file thumbnail with missing mime type', () => { + let adapter = new ShareDataTableAdapter(documentListService, basePath, null); + + let file = new FileNode(); + file.entry.content.mimeType = null; + + let row = new ShareDataRow(file); + let col = { type: 'image', key: '$thumbnail' }; + + let value = adapter.getValue(row, col); + expect(value).toBe(`${basePath}/img/ft_ic_miscellaneous.svg`); + }); + + it('should generate fallback icon for a file with no content entry', () => { + let adapter = new ShareDataTableAdapter(documentListService, basePath, null); + + let file = new FileNode(); + file.entry.content = null; + + let row = new ShareDataRow(file); + let col = { type: 'image', key: '$thumbnail' }; + + let value = adapter.getValue(row, col); + expect(value).toBe(`${basePath}/img/ft_ic_miscellaneous.svg`); + }); + + it('should generate fallback icon when document service fails to find one', () => { + spyOn(documentListService, 'getMimeTypeIcon').and.returnValue(null); + let adapter = new ShareDataTableAdapter(documentListService, basePath, null); + + let file = new FileNode(); + let row = new ShareDataRow(file); let col = { type: 'image', key: '$thumbnail' }; let value = adapter.getValue(row, col); @@ -301,10 +339,73 @@ describe('ShareDataTableAdapter', () => { expect(console.error).toHaveBeenCalledWith(error); }); + it('should generate file icon path based on mime type', () => { + let fileName = 'custom-icon.svg'; + spyOn(documentListService, 'getMimeTypeIcon').and.returnValue(fileName); + let file = new FileNode('file1', 'text/plain'); + let row = new ShareDataRow(file); + let col = {type: 'image', key: '$thumbnail'}; + + let adapter = new ShareDataTableAdapter(documentListService, '/root', null); + let value = adapter.getValue(row, col); + + expect(value).toBe(`/root/img/${fileName}`); + expect(documentListService.getMimeTypeIcon).toHaveBeenCalled(); + }); + + it('should put folders on top upon sort', () => { + let file1 = new FileNode('file1'); + let file2 = new FileNode('file2'); + let folder = new FolderNode(); + + let col = { key: 'name' }; + let adapter = new ShareDataTableAdapter(null, null, [col]); + adapter.setSorting(new DataSorting('name', 'asc')); + + adapter.setRows([ + new ShareDataRow(file2), + new ShareDataRow(file1), + new ShareDataRow(folder) + ]); + + let sorted = adapter.getRows(); + expect(( sorted[0]).node).toBe(folder); + expect(( sorted[1]).node).toBe(file1); + expect(( sorted[2]).node).toBe(file2); + }); + + it('should sort by dates up to ms', () => { + let file1 = new FileNode('file1'); + file1.entry['dateProp'] = new Date(2016, 6, 30, 13, 14, 1); + + let file2 = new FileNode('file2'); + file2.entry['dateProp'] = new Date(2016, 6, 30, 13, 14, 2); + + let col = { key: 'dateProp' }; + let adapter = new ShareDataTableAdapter(null, null, [col]); + + adapter.setRows([ + new ShareDataRow(file2), + new ShareDataRow(file1) + ]); + + adapter.sort('dateProp', 'asc'); + + let rows = adapter.getRows(); + expect(( rows[0]).node).toBe(file1); + expect(( rows[1]).node).toBe(file2); + + adapter.sort('dateProp', 'desc'); + expect(( rows[0]).node).toBe(file2); + expect(( rows[1]).node).toBe(file1); + }); + + it('should sort folders', () => { + + }); }); - describe('ShareDataRow', () => { it('should wrap node', () => { diff --git a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts index d8735c9658..66b88d63c5 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts @@ -99,7 +99,7 @@ export class ShareDataTableAdapter implements DataTableAdapter { return null; } - if (node.entry.content && node.entry.content.mimeType) { + if (node.entry.content) { let mimeType = node.entry.content.mimeType; if (mimeType) { let icon = this.documentListService.getMimeTypeIcon(mimeType); @@ -125,7 +125,7 @@ export class ShareDataTableAdapter implements DataTableAdapter { setSorting(sorting: DataSorting): void { this.sorting = sorting; - if (sorting && sorting.key) { + if (sorting && sorting.key && this.rows && this.rows.length > 0) { this.rows.sort((a: ShareDataRow, b: ShareDataRow) => { if (a.node.entry.isFolder !== b.node.entry.isFolder) { return a.node.entry.isFolder ? -1 : 1;