Unit tests for Attach widget

This commit is contained in:
Denys Vuika
2016-10-13 15:37:48 +01:00
parent cf287abdc1
commit 4c66b9ef93
4 changed files with 335 additions and 29 deletions

View File

@@ -0,0 +1,293 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Observable } from 'rxjs/Rx';
import { AttachWidget } from './attach.widget';
import { ActivitiAlfrescoContentService } from '../../../services/activiti-alfresco.service';
import { FormFieldModel } from './../core/form-field.model';
import { FormFieldTypes } from '../core/form-field-types';
import { ExternalContent } from '../core/external-content';
import { ExternalContentLink } from '../core/external-content-link';
describe('AttachWidget', () => {
let widget: AttachWidget;
let contentService: ActivitiAlfrescoContentService;
let dialogPolyfill: any;
beforeEach(() => {
contentService = new ActivitiAlfrescoContentService(null);
widget = new AttachWidget(contentService);
dialogPolyfill = {
registerDialog(obj: any) {
obj.showModal = function () {};
}
};
window['dialogPolyfill'] = dialogPolyfill;
});
it('should require field value to check file', () => {
widget.hasFile = false;
widget.field = null;
widget.ngOnInit();
expect(widget.hasFile).toBeFalsy();
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD,
value: null
});
widget.ngOnInit();
expect(widget.hasFile).toBeFalsy();
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD,
value: [{ name: 'file' }]
});
widget.ngOnInit();
expect(widget.hasFile).toBeTruthy();
});
it('should setup with form field', () => {
let nodes = [{}];
spyOn(contentService, 'getAlfrescoNodes').and.callFake(() => {
return Observable.create(observer => {
observer.next(nodes);
observer.complete();
});
});
let config = {
siteId: '<id>',
site: '<site>',
pathId: '<pathId>',
accountId: '<accountId>'
};
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD,
params: {
fileSource: {
selectedFolder: config
}
}
});
widget.ngOnInit();
expect(widget.selectedFolderSiteId).toBe(config.siteId);
expect(widget.selectedFolderSiteName).toBe(config.site);
expect(widget.selectedFolderPathId).toBe(config.pathId);
expect(widget.selectedFolderAccountId).toBe(config.accountId);
expect(widget.selectedFolderNodes).toEqual(nodes);
});
it('should link file on select', () => {
let link = <ExternalContentLink> {};
spyOn(contentService, 'linkAlfrescoNode').and.callFake(() => {
return Observable.create(observer => {
observer.next(link);
observer.complete();
});
});
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD
});
widget.ngOnInit();
let node = <ExternalContent> {};
widget.selectFile(node, null);
expect(contentService.linkAlfrescoNode).toHaveBeenCalled();
expect(widget.selectedFile).toBe(node);
expect(widget.field.value).toEqual([link]);
expect(widget.field.json.value).toEqual([link]);
});
it('should reset', () => {
widget.hasFile = true;
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD,
value: [{ name: 'filename' }]
});
widget.reset();
expect(widget.hasFile).toBeFalsy();
expect(widget.field.value).toBeNull();
expect(widget.field.json.value).toBeNull();
});
it('should close dialog on cancel', () => {
let closed = false;
widget.dialog = {
nativeElement: {
close: function() {
closed = true;
}
}
};
widget.cancel();
expect(closed).toBeTruthy();
});
it('should show modal dialog', () => {
spyOn(contentService, 'getAlfrescoNodes').and.callFake(() => {
return Observable.create(observer => {
observer.next([]);
observer.complete();
});
});
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD,
params: {
fileSource: {
selectedFolder: {}
}
}
});
let modalShown = false;
widget.dialog = {
nativeElement: {
showModal: function() {
modalShown = true;
}
}
};
widget.showDialog();
expect(modalShown).toBeTruthy();
});
it('should select folder and load nodes', () => {
let nodes = [{}];
spyOn(contentService, 'getAlfrescoNodes').and.callFake(() => {
return Observable.create(observer => {
observer.next(nodes);
observer.complete();
});
});
let node = <ExternalContent> { id: '<id>' };
widget.selectFolder(node, null);
expect(widget.selectedFolderPathId).toBe(node.id);
expect(widget.selectedFolderNodes).toEqual(nodes);
});
it('should get linked file name via local variable', () => {
widget.fileName = '<fileName>';
widget.selectedFile = null;
widget.field = null;
expect(widget.getLinkedFileName()).toBe(widget.fileName);
});
it('should get linked file name via selected file', () => {
widget.fileName = null;
widget.selectedFile = <ExternalContent> { title: '<title>' };
widget.field = null;
expect(widget.getLinkedFileName()).toBe(widget.selectedFile.title);
});
it('should get linked file name via form field', () => {
widget.fileName = null;
widget.selectedFile = null;
let name = '<file>';
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD,
value: [{ name: name }]
});
expect(widget.getLinkedFileName()).toBe(name);
});
it('should require form field to setup file browser', () => {
widget.field = null;
widget.setupFileBrowser();
expect(widget.selectedFolderPathId).toBeUndefined();
expect(widget.selectedFolderAccountId).toBeUndefined();
const pathId = '<pathId>';
const accountId = '<accountId>';
widget.field = new FormFieldModel(null, {
type: FormFieldTypes.UPLOAD,
params: {
fileSource: {
selectedFolder: {
pathId: pathId,
accountId: accountId
}
}
}
});
widget.setupFileBrowser();
expect(widget.selectedFolderPathId).toBe(pathId);
expect(widget.selectedFolderAccountId).toBe(accountId);
});
it('should get external content nodes', () => {
let nodes = [{}];
spyOn(contentService, 'getAlfrescoNodes').and.callFake(() => {
return Observable.create(observer => {
observer.next(nodes);
observer.complete();
});
});
const accountId = '<accountId>';
const pathId = '<pathId>';
widget.selectedFolderAccountId = accountId;
widget.selectedFolderPathId = pathId;
widget.getExternalContentNodes();
expect(contentService.getAlfrescoNodes).toHaveBeenCalledWith(accountId, pathId);
expect(widget.selectedFolderNodes).toEqual(nodes);
});
it('should handle error', () => {
let error = 'error';
spyOn(contentService, 'getAlfrescoNodes').and.callFake(() => {
return Observable.throw(error);
});
spyOn(console, 'log').and.stub();
widget.getExternalContentNodes();
expect(console.log).toHaveBeenCalledWith(error);
});
it('should register dialog via polyfill', () => {
widget.dialog = {
nativeElement: {}
};
spyOn(dialogPolyfill, 'registerDialog').and.callThrough();
spyOn(widget, 'setupFileBrowser').and.stub();
spyOn(widget, 'getExternalContentNodes').and.stub();
widget.showDialog();
expect(dialogPolyfill.registerDialog).toHaveBeenCalledWith(widget.dialog.nativeElement);
});
it('should require configured dialog to show modal', () => {
widget.dialog = null;
spyOn(widget, 'setupFileBrowser').and.stub();
spyOn(widget, 'getExternalContentNodes').and.stub();
expect(widget.showDialog()).toBeFalsy();
});
});

View File

@@ -53,24 +53,30 @@ export class AttachWidget extends WidgetComponent implements OnInit {
}
ngOnInit() {
if (this.field &&
this.field.value) {
this.hasFile = true;
}
if (this.field &&
this.field.params &&
this.field.params.fileSource &&
this.field.params.fileSource.selectedFolder) {
this.selectedFolderSiteId = this.field.params.fileSource.selectedFolder.siteId;
this.selectedFolderSiteName = this.field.params.fileSource.selectedFolder.site;
this.setupFileBrowser();
this.getExternalContentNodes();
if (this.field) {
if (this.field.value) {
this.hasFile = true;
}
let params = this.field.params;
if (params &&
params.fileSource &&
params.fileSource.selectedFolder) {
this.selectedFolderSiteId = params.fileSource.selectedFolder.siteId;
this.selectedFolderSiteName = params.fileSource.selectedFolder.site;
this.setupFileBrowser();
this.getExternalContentNodes();
}
}
}
private setupFileBrowser() {
this.selectedFolderPathId = this.field.params.fileSource.selectedFolder.pathId;
this.selectedFolderAccountId = this.field.params.fileSource.selectedFolder.accountId;
setupFileBrowser() {
if (this.field) {
let params = this.field.params;
this.selectedFolderPathId = params.fileSource.selectedFolder.pathId;
this.selectedFolderAccountId = params.fileSource.selectedFolder.accountId;
}
}
getLinkedFileName(): string {
@@ -80,7 +86,8 @@ export class AttachWidget extends WidgetComponent implements OnInit {
this.selectedFile.title) {
result = this.selectedFile.title;
}
if (this.field.value &&
if (this.field &&
this.field.value &&
this.field.value.length > 0 &&
this.field.value[0].name) {
result = this.field.value[0].name;
@@ -89,14 +96,12 @@ export class AttachWidget extends WidgetComponent implements OnInit {
return result;
}
private getExternalContentNodes() {
getExternalContentNodes() {
this.contentService.getAlfrescoNodes(this.selectedFolderAccountId, this.selectedFolderPathId)
.subscribe(
(nodes) => {
this.selectedFolderNodes = nodes;
},
error => console.error(error));
nodes => this.selectedFolderNodes = nodes,
error => this.handleError(error)
);
}
selectFile(node: ExternalContent, $event: any) {
@@ -116,17 +121,19 @@ export class AttachWidget extends WidgetComponent implements OnInit {
this.getExternalContentNodes();
}
public showDialog() {
showDialog(): boolean {
this.setupFileBrowser();
this.getExternalContentNodes();
if (!this.dialog.nativeElement.showModal) {
dialogPolyfill.registerDialog(this.dialog.nativeElement);
}
if (this.dialog) {
if (!this.dialog.nativeElement.showModal) {
dialogPolyfill.registerDialog(this.dialog.nativeElement);
}
this.dialog.nativeElement.showModal();
return true;
}
return false;
}
private closeDialog() {
@@ -135,7 +142,7 @@ export class AttachWidget extends WidgetComponent implements OnInit {
}
}
public cancel() {
cancel() {
this.closeDialog();
}

View File

@@ -295,7 +295,7 @@ describe('DisplayValueWidget', () => {
spyOn(formService, 'getRestFieldValues').and.callFake(() => {
return Observable.create(observer => {
observer.next([
{ id: '1', name: 'option 1' },
{ id: '1', name: 'option 1' },
{ id: '2', name: 'option 2' }
]);
observer.complete();

View File

@@ -97,4 +97,10 @@ export class WidgetComponent implements AfterViewInit {
return null;
}
protected handleError(error: any) {
if (error) {
console.log(error);
}
}
}