mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-19 17:14:57 +00:00
Fix unit test upload
This commit is contained in:
parent
7d57073dac
commit
7f3a450e6d
@ -1,60 +0,0 @@
|
|||||||
/*!
|
|
||||||
* @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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export class AlfrescoApiMock {
|
|
||||||
|
|
||||||
static getClientWithTicket(basePath: string, ticket: string) {
|
|
||||||
return {authentications: {basicAuth: {password: 'fake-password', type: 'fake-basic', username: 'fake-user'}}};
|
|
||||||
}
|
|
||||||
|
|
||||||
static get NodesApi() {
|
|
||||||
return NodesApiMock;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export class NodesApiMock {
|
|
||||||
|
|
||||||
constructor(alfrescoClient: any) {
|
|
||||||
}
|
|
||||||
|
|
||||||
addNode(nodeId, nodeBody, opts) {
|
|
||||||
if (nodeId && nodeBody.name !== 'folder-duplicate-fake') {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
resolve({
|
|
||||||
entry: {
|
|
||||||
isFile: false,
|
|
||||||
isFolder: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
reject({
|
|
||||||
response: {
|
|
||||||
body: {
|
|
||||||
error: {
|
|
||||||
statusCode: 409
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -21,23 +21,15 @@ import { Injectable } from '@angular/core';
|
|||||||
export class AlfrescoSettingsServiceMock {
|
export class AlfrescoSettingsServiceMock {
|
||||||
|
|
||||||
static DEFAULT_HOST_ADDRESS: string = 'fakehost';
|
static DEFAULT_HOST_ADDRESS: string = 'fakehost';
|
||||||
static DEFAULT_CONTEXT_PATH: string = '/fake-path-alfresco';
|
|
||||||
static DEFAULT_BASE_API_PATH: string = '/fake-api/fake-public/fake-alfresco/fake-versions/1';
|
|
||||||
|
|
||||||
private providers: string[] = ['ECM', 'BPM'];
|
private providers: string[] = ['ECM', 'BPM'];
|
||||||
|
|
||||||
private _host: string = AlfrescoSettingsServiceMock.DEFAULT_HOST_ADDRESS;
|
private _host: string = AlfrescoSettingsServiceMock.DEFAULT_HOST_ADDRESS;
|
||||||
private _contextPath = AlfrescoSettingsServiceMock.DEFAULT_CONTEXT_PATH;
|
|
||||||
private _apiBasePath: string = AlfrescoSettingsServiceMock.DEFAULT_BASE_API_PATH;
|
|
||||||
|
|
||||||
public get host(): string {
|
public get host(): string {
|
||||||
return this._host;
|
return this._host;
|
||||||
}
|
}
|
||||||
|
|
||||||
getApiBaseUrl(): string {
|
|
||||||
return this._host + this._contextPath + this._apiBasePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
getProviders(): string [] {
|
getProviders(): string [] {
|
||||||
return this.providers;
|
return this.providers;
|
||||||
}
|
}
|
||||||
|
@ -1,82 +0,0 @@
|
|||||||
/*!
|
|
||||||
* @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/Observable';
|
|
||||||
import { FileModel } from '../models/file.model';
|
|
||||||
import { UploadService } from '../services/upload.service';
|
|
||||||
import { AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
|
||||||
|
|
||||||
export class UploadServiceMock extends UploadService {
|
|
||||||
|
|
||||||
filesUpload$: Observable<any>;
|
|
||||||
totalCompleted$: Observable<number>;
|
|
||||||
|
|
||||||
constructor(settings: AlfrescoSettingsService, authService: AlfrescoAuthenticationService) {
|
|
||||||
super(settings, authService);
|
|
||||||
}
|
|
||||||
|
|
||||||
public setOptions(options: any): void {
|
|
||||||
super.setOptions(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
addToQueue(files: any[]): FileModel[] {
|
|
||||||
let result = super.addToQueue(files);
|
|
||||||
this.filesUpload$ = new Observable(observer => {
|
|
||||||
observer.next(files);
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
createFolder(relativePath: string, name: string) {
|
|
||||||
let promise: Promise<any>;
|
|
||||||
if (name !== 'folder-duplicate-fake') {
|
|
||||||
promise = new Promise(function (resolve, reject) {
|
|
||||||
resolve({
|
|
||||||
entry: {
|
|
||||||
isFile: false,
|
|
||||||
isFolder: true,
|
|
||||||
name: name,
|
|
||||||
nodeType: 'cm:folder'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
promise = new Promise(function (resolve, reject) {
|
|
||||||
reject({
|
|
||||||
response: {
|
|
||||||
body: {
|
|
||||||
error: {
|
|
||||||
statusCode: 409
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return Observable.fromPromise(promise)
|
|
||||||
.map(res => {
|
|
||||||
return res;
|
|
||||||
})
|
|
||||||
.do(data => console.log('Node data', data))
|
|
||||||
.catch((error => {
|
|
||||||
return Observable.throw(error);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public uploadFilesInTheQueue(directory: string, elementEmit: any): void {
|
|
||||||
};
|
|
||||||
}
|
|
@ -21,7 +21,6 @@ import { FileUploadingDialogComponent } from './file-uploading-dialog.component'
|
|||||||
import { FileModel } from '../models/file.model';
|
import { FileModel } from '../models/file.model';
|
||||||
import { AlfrescoTranslationService, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
import { AlfrescoTranslationService, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
||||||
import { TranslationMock } from '../assets/translation.service.mock';
|
import { TranslationMock } from '../assets/translation.service.mock';
|
||||||
import { UploadServiceMock } from '../assets/upload.service.mock';
|
|
||||||
import { UploadService } from '../services/upload.service';
|
import { UploadService } from '../services/upload.service';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { HTTP_PROVIDERS } from '@angular/http';
|
import { HTTP_PROVIDERS } from '@angular/http';
|
||||||
@ -34,10 +33,10 @@ describe('FileUploadDialog', () => {
|
|||||||
beforeEachProviders(() => {
|
beforeEachProviders(() => {
|
||||||
return [
|
return [
|
||||||
HTTP_PROVIDERS,
|
HTTP_PROVIDERS,
|
||||||
{ provide: AlfrescoSettingsService, useClass: AlfrescoSettingsService },
|
AlfrescoSettingsService,
|
||||||
{ provide: AlfrescoAuthenticationService, useClass: AlfrescoAuthenticationService },
|
AlfrescoAuthenticationService,
|
||||||
{ provide: AlfrescoTranslationService, useClass: TranslationMock },
|
{ provide: AlfrescoTranslationService, useClass: TranslationMock },
|
||||||
{ provide: UploadService, useClass: UploadServiceMock }
|
UploadService
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -86,11 +85,9 @@ describe('FileUploadDialog', () => {
|
|||||||
let file = new FileModel(fileFake);
|
let file = new FileModel(fileFake);
|
||||||
file.progress = {'percent': 50};
|
file.progress = {'percent': 50};
|
||||||
|
|
||||||
uploadService.addToQueue([file]);
|
|
||||||
|
|
||||||
|
|
||||||
let component = componentFixture.componentInstance;
|
let component = componentFixture.componentInstance;
|
||||||
componentFixture.detectChanges();
|
componentFixture.detectChanges();
|
||||||
|
uploadService.addToQueue([file]);
|
||||||
component.filesUploadingList = [file];
|
component.filesUploadingList = [file];
|
||||||
|
|
||||||
let compiled = componentFixture.debugElement.nativeElement;
|
let compiled = componentFixture.debugElement.nativeElement;
|
||||||
|
@ -57,7 +57,7 @@ export class FileUploadingListComponent {
|
|||||||
let file = this.filesUploadingList.filter((uploadingFileModel) => {
|
let file = this.filesUploadingList.filter((uploadingFileModel) => {
|
||||||
return uploadingFileModel.id === id;
|
return uploadingFileModel.id === id;
|
||||||
});
|
});
|
||||||
file[0].setAbort();
|
file[0].emitAbort();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,7 +68,7 @@ export class FileUploadingListComponent {
|
|||||||
$event.preventDefault();
|
$event.preventDefault();
|
||||||
}
|
}
|
||||||
this.filesUploadingList.forEach((uploadingFileModel: FileModel) => {
|
this.filesUploadingList.forEach((uploadingFileModel: FileModel) => {
|
||||||
uploadingFileModel.setAbort();
|
uploadingFileModel.emitAbort();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,20 +20,49 @@ import { TestComponentBuilder } from '@angular/compiler/testing';
|
|||||||
import { UploadButtonComponent } from './upload-button.component';
|
import { UploadButtonComponent } from './upload-button.component';
|
||||||
import { AlfrescoTranslationService, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
import { AlfrescoTranslationService, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
||||||
import { TranslationMock } from '../assets/translation.service.mock';
|
import { TranslationMock } from '../assets/translation.service.mock';
|
||||||
import { UploadServiceMock } from '../assets/upload.service.mock';
|
|
||||||
import { UploadService } from '../services/upload.service';
|
import { UploadService } from '../services/upload.service';
|
||||||
import { AlfrescoApiMock } from '../assets/AlfrescoApi.mock';
|
|
||||||
import { AlfrescoSettingsServiceMock } from '../assets/AlfrescoSettingsService.service.mock';
|
import { AlfrescoSettingsServiceMock } from '../assets/AlfrescoSettingsService.service.mock';
|
||||||
import { HTTP_PROVIDERS } from '@angular/http';
|
import { HTTP_PROVIDERS } from '@angular/http';
|
||||||
|
|
||||||
declare var AlfrescoApi: any;
|
declare var AlfrescoApi: any;
|
||||||
|
|
||||||
describe('AlfrescoUploadButton', () => {
|
describe('AlfrescoUploadButton', () => {
|
||||||
|
|
||||||
let uploadButtonFixture;
|
let uploadButtonFixture;
|
||||||
|
|
||||||
|
let file = {name: 'fake-name-1', size: 10, webkitRelativePath: 'fake-folder1/fake-name-1.json'};
|
||||||
|
let fakeEvent = {
|
||||||
|
currentTarget: {
|
||||||
|
files: [file]
|
||||||
|
},
|
||||||
|
target: {value: 'fake-name-1'}
|
||||||
|
};
|
||||||
|
|
||||||
|
let fakeResolveRest = {
|
||||||
|
entry: {
|
||||||
|
isFile: false,
|
||||||
|
isFolder: true,
|
||||||
|
name: 'fake-folder1'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let fakeResolvePromise = new Promise(function (resolve, reject) {
|
||||||
|
resolve(fakeResolveRest);
|
||||||
|
});
|
||||||
|
|
||||||
|
let fakeRejectRest = {
|
||||||
|
response: {
|
||||||
|
body: {
|
||||||
|
error: {
|
||||||
|
statusCode: 409
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let fakeRejectPromise = new Promise(function (resolve, reject) {
|
||||||
|
reject(fakeRejectRest);
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach( () => {
|
beforeEach( () => {
|
||||||
window['AlfrescoApi'] = AlfrescoApiMock;
|
|
||||||
window['componentHandler'] = null;
|
window['componentHandler'] = null;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -41,9 +70,9 @@ describe('AlfrescoUploadButton', () => {
|
|||||||
return [
|
return [
|
||||||
HTTP_PROVIDERS,
|
HTTP_PROVIDERS,
|
||||||
{ provide: AlfrescoSettingsService, useClass: AlfrescoSettingsServiceMock },
|
{ provide: AlfrescoSettingsService, useClass: AlfrescoSettingsServiceMock },
|
||||||
{ provide: AlfrescoAuthenticationService, useClass: AlfrescoAuthenticationService },
|
AlfrescoAuthenticationService,
|
||||||
{ provide: AlfrescoTranslationService, useClass: TranslationMock },
|
{ provide: AlfrescoTranslationService, useClass: TranslationMock },
|
||||||
{ provide: UploadService, useClass: UploadServiceMock }
|
UploadService
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -84,55 +113,42 @@ describe('AlfrescoUploadButton', () => {
|
|||||||
component._uploaderService.uploadFilesInTheQueue = jasmine.createSpy('uploadFilesInTheQueue');
|
component._uploaderService.uploadFilesInTheQueue = jasmine.createSpy('uploadFilesInTheQueue');
|
||||||
|
|
||||||
uploadButtonFixture.detectChanges();
|
uploadButtonFixture.detectChanges();
|
||||||
let file = {name: 'fake-name-1', size: 10, webkitRelativePath: 'fake-folder1/fake-name-1.json'};
|
|
||||||
|
|
||||||
let fakeEvent = {
|
|
||||||
currentTarget: {
|
|
||||||
files: [file]
|
|
||||||
},
|
|
||||||
target: {value: 'fake-value'}
|
|
||||||
};
|
|
||||||
|
|
||||||
component.onFilesAdded(fakeEvent);
|
component.onFilesAdded(fakeEvent);
|
||||||
expect(component._uploaderService.uploadFilesInTheQueue).toHaveBeenCalledWith('/root-fake-/sites-fake/folder-fake', null);
|
expect(component._uploaderService.uploadFilesInTheQueue).toHaveBeenCalledWith('/root-fake-/sites-fake/folder-fake', null);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create a folder and call upload file', () => {
|
it('should create a folder and emit an File uploaded event', (done) => {
|
||||||
let component = uploadButtonFixture.componentInstance;
|
let component = uploadButtonFixture.componentInstance;
|
||||||
|
component.currentFolderPath = '/fake-root-path';
|
||||||
component.uploadFiles = jasmine.createSpy('uploadFiles');
|
|
||||||
let doneFn = jasmine.createSpy('success');
|
|
||||||
|
|
||||||
uploadButtonFixture.detectChanges();
|
uploadButtonFixture.detectChanges();
|
||||||
|
|
||||||
let file = {name: 'fake-name-1', size: 10, webkitRelativePath: 'fake-folder1/fake-name-1.json'};
|
spyOn(component._uploaderService, 'callApiCreateFolder').and.returnValue(fakeResolvePromise);
|
||||||
|
|
||||||
let fakeEvent = {
|
component.onSuccess.subscribe(e => {
|
||||||
currentTarget: {
|
expect(e.value).toEqual('File uploaded');
|
||||||
files: [file]
|
done();
|
||||||
},
|
});
|
||||||
target: {value: 'fake-value'}
|
|
||||||
};
|
spyOn(component, 'uploadFiles').and.callFake(() => {
|
||||||
|
component.onSuccess.emit({
|
||||||
|
value: 'File uploaded'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
component.onDirectoryAdded(fakeEvent);
|
component.onDirectoryAdded(fakeEvent);
|
||||||
expect(doneFn).not.toHaveBeenCalledWith(fakeEvent);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throws an exception when the folder already exist', () => {
|
it('should emit an onError event when the folder already exist', (done) => {
|
||||||
let component = uploadButtonFixture.componentInstance;
|
let component = uploadButtonFixture.componentInstance;
|
||||||
|
|
||||||
component.uploadFiles = jasmine.createSpy('uploadFiles');
|
|
||||||
|
|
||||||
uploadButtonFixture.detectChanges();
|
uploadButtonFixture.detectChanges();
|
||||||
|
|
||||||
let file = {name: 'fake-name-1', size: 10, webkitRelativePath: 'folder-duplicate-fake/fake-name-1.json'};
|
spyOn(component._uploaderService, 'callApiCreateFolder').and.returnValue(fakeRejectPromise);
|
||||||
|
component.onError.subscribe(e => {
|
||||||
|
expect(e.value).toEqual('FILE_UPLOAD.MESSAGES.FOLDER_ALREADY_EXIST');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
let fakeEvent = {
|
|
||||||
currentTarget: {
|
|
||||||
files: [file]
|
|
||||||
},
|
|
||||||
target: {value: 'fake-value'}
|
|
||||||
};
|
|
||||||
component.onDirectoryAdded(fakeEvent);
|
component.onDirectoryAdded(fakeEvent);
|
||||||
expect(component.uploadFiles).not.toHaveBeenCalledWith(fakeEvent);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -76,6 +76,12 @@ export class UploadButtonComponent {
|
|||||||
@Output()
|
@Output()
|
||||||
onSuccess = new EventEmitter();
|
onSuccess = new EventEmitter();
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
onError = new EventEmitter();
|
||||||
|
|
||||||
|
@Output()
|
||||||
|
createFolder = new EventEmitter();
|
||||||
|
|
||||||
translate: AlfrescoTranslationService;
|
translate: AlfrescoTranslationService;
|
||||||
|
|
||||||
|
|
||||||
@ -125,6 +131,7 @@ export class UploadButtonComponent {
|
|||||||
error => {
|
error => {
|
||||||
let errorMessagePlaceholder = this.getErrorMessage(error.response);
|
let errorMessagePlaceholder = this.getErrorMessage(error.response);
|
||||||
if (errorMessagePlaceholder) {
|
if (errorMessagePlaceholder) {
|
||||||
|
this.onError.emit({value: errorMessagePlaceholder});
|
||||||
let errorMessage = this.formatString(errorMessagePlaceholder, [directoryName]);
|
let errorMessage = this.formatString(errorMessagePlaceholder, [directoryName]);
|
||||||
if (errorMessage) {
|
if (errorMessage) {
|
||||||
this._showErrorNotificationBar(errorMessage);
|
this._showErrorNotificationBar(errorMessage);
|
||||||
|
@ -21,9 +21,7 @@ import { UploadDragAreaComponent } from './upload-drag-area.component';
|
|||||||
import { AlfrescoTranslationService, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
import { AlfrescoTranslationService, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
||||||
import { AlfrescoSettingsServiceMock } from '../assets/AlfrescoSettingsService.service.mock';
|
import { AlfrescoSettingsServiceMock } from '../assets/AlfrescoSettingsService.service.mock';
|
||||||
import { TranslationMock } from '../assets/translation.service.mock';
|
import { TranslationMock } from '../assets/translation.service.mock';
|
||||||
import { UploadServiceMock } from '../assets/upload.service.mock';
|
|
||||||
import { UploadService } from '../services/upload.service';
|
import { UploadService } from '../services/upload.service';
|
||||||
import { AlfrescoApiMock } from '../assets/AlfrescoApi.mock';
|
|
||||||
import { HTTP_PROVIDERS } from '@angular/http';
|
import { HTTP_PROVIDERS } from '@angular/http';
|
||||||
|
|
||||||
declare var AlfrescoApi: any;
|
declare var AlfrescoApi: any;
|
||||||
@ -33,16 +31,16 @@ describe('AlfrescoUploadDragArea', () => {
|
|||||||
let componentFixture;
|
let componentFixture;
|
||||||
|
|
||||||
beforeEach( () => {
|
beforeEach( () => {
|
||||||
window['AlfrescoApi'] = AlfrescoApiMock;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEachProviders(() => {
|
beforeEachProviders(() => {
|
||||||
return [
|
return [
|
||||||
HTTP_PROVIDERS,
|
HTTP_PROVIDERS,
|
||||||
{ provide: AlfrescoSettingsService, useClass: AlfrescoSettingsServiceMock },
|
{ provide: AlfrescoSettingsService, useClass: AlfrescoSettingsServiceMock },
|
||||||
{ provide: AlfrescoAuthenticationService, useClass: AlfrescoAuthenticationService },
|
AlfrescoAuthenticationService,
|
||||||
{ provide: AlfrescoTranslationService, useClass: TranslationMock },
|
{ provide: AlfrescoTranslationService, useClass: TranslationMock },
|
||||||
{ provide: UploadService, useClass: UploadServiceMock }
|
UploadService
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -142,6 +140,19 @@ describe('AlfrescoUploadDragArea', () => {
|
|||||||
component.showUdoNotificationBar = true;
|
component.showUdoNotificationBar = true;
|
||||||
|
|
||||||
componentFixture.detectChanges();
|
componentFixture.detectChanges();
|
||||||
|
let fakeRest = {
|
||||||
|
response: {
|
||||||
|
body: {
|
||||||
|
error: {
|
||||||
|
statusCode: 409
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let fakePromise = new Promise(function (resolve, reject) {
|
||||||
|
reject(fakeRest);
|
||||||
|
});
|
||||||
|
spyOn(component._uploaderService, 'callApiCreateFolder').and.returnValue(fakePromise);
|
||||||
spyOn(component, '_showErrorNotificationBar').and.callFake( () => {
|
spyOn(component, '_showErrorNotificationBar').and.callFake( () => {
|
||||||
expect(component._showErrorNotificationBar).toHaveBeenCalledWith('FILE_UPLOAD.MESSAGES.FOLDER_ALREADY_EXIST');
|
expect(component._showErrorNotificationBar).toHaveBeenCalledWith('FILE_UPLOAD.MESSAGES.FOLDER_ALREADY_EXIST');
|
||||||
done();
|
done();
|
||||||
@ -175,6 +186,17 @@ describe('AlfrescoUploadDragArea', () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let fakeRest = {
|
||||||
|
entry: {
|
||||||
|
isFile: false,
|
||||||
|
isFolder: true,
|
||||||
|
name: 'folder-fake'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let fakePromise = new Promise(function (resolve, reject) {
|
||||||
|
resolve(fakeRest);
|
||||||
|
});
|
||||||
|
spyOn(component._uploaderService, 'callApiCreateFolder').and.returnValue(fakePromise);
|
||||||
spyOn(component, 'onFilesEntityDropped').and.callFake( () => {
|
spyOn(component, 'onFilesEntityDropped').and.callFake( () => {
|
||||||
expect(component.onFilesEntityDropped).toHaveBeenCalledWith(itemEntity);
|
expect(component.onFilesEntityDropped).toHaveBeenCalledWith(itemEntity);
|
||||||
done();
|
done();
|
||||||
|
@ -35,7 +35,7 @@ export class FileModel {
|
|||||||
abort: boolean = false;
|
abort: boolean = false;
|
||||||
uploading: boolean = false;
|
uploading: boolean = false;
|
||||||
file: any;
|
file: any;
|
||||||
_xmlHttpRequest: XMLHttpRequest;
|
promiseUpload: any;
|
||||||
|
|
||||||
constructor(file: any) {
|
constructor(file: any) {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
@ -53,16 +53,32 @@ export class FileModel {
|
|||||||
this.progress = progress;
|
this.progress = progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emit an event progress on the promise
|
||||||
|
*/
|
||||||
|
emitProgres(progress: any): void {
|
||||||
|
this.setProgres(progress);
|
||||||
|
this.promiseUpload.emit('progress', progress);
|
||||||
|
}
|
||||||
|
|
||||||
setError(): void {
|
setError(): void {
|
||||||
this.error = true;
|
this.error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emit an event progress on the promise
|
||||||
|
*/
|
||||||
|
emitError(): void {
|
||||||
|
this.setError();
|
||||||
|
this.promiseUpload.emit('error');
|
||||||
|
}
|
||||||
|
|
||||||
setUploading() {
|
setUploading() {
|
||||||
this.uploading = true;
|
this.uploading = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
setXMLHttpRequest(xmlHttpRequest: XMLHttpRequest) {
|
setPromiseUpload(promiseUpload: any) {
|
||||||
this._xmlHttpRequest = xmlHttpRequest;
|
this.promiseUpload = promiseUpload;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,10 +88,17 @@ export class FileModel {
|
|||||||
if (!this.done && !this.error) {
|
if (!this.done && !this.error) {
|
||||||
this.abort = true;
|
this.abort = true;
|
||||||
this.uploading = false;
|
this.uploading = false;
|
||||||
this._xmlHttpRequest.abort();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emit an event abort on the promise
|
||||||
|
*/
|
||||||
|
emitAbort(): void {
|
||||||
|
this.setAbort();
|
||||||
|
this.promiseUpload.abort();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update status of the file when upload finish or is ended.
|
* Update status of the file when upload finish or is ended.
|
||||||
*/
|
*/
|
||||||
|
@ -17,38 +17,14 @@
|
|||||||
|
|
||||||
import { it, describe, inject, beforeEach, beforeEachProviders } from '@angular/core/testing';
|
import { it, describe, inject, beforeEach, beforeEachProviders } from '@angular/core/testing';
|
||||||
import { UploadService } from './upload.service';
|
import { UploadService } from './upload.service';
|
||||||
import { FileModel } from './../models/file.model';
|
|
||||||
import { AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
import { AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
|
||||||
import { AlfrescoSettingsServiceMock } from '../assets/AlfrescoSettingsService.service.mock';
|
import { AlfrescoSettingsServiceMock } from '../assets/AlfrescoSettingsService.service.mock';
|
||||||
import { AlfrescoApiMock } from '../assets/AlfrescoApi.mock';
|
|
||||||
import { HTTP_PROVIDERS } from '@angular/http';
|
import { HTTP_PROVIDERS } from '@angular/http';
|
||||||
|
import { EventEmitter } from '@angular/core';
|
||||||
|
|
||||||
declare var AlfrescoApi: any;
|
declare let AlfrescoApi: any;
|
||||||
declare let jasmine: any;
|
declare let jasmine: any;
|
||||||
|
|
||||||
let doneFn = jasmine.createSpy('success');
|
|
||||||
let errorFn = jasmine.createSpy('error');
|
|
||||||
|
|
||||||
class MockUploadService extends UploadService {
|
|
||||||
|
|
||||||
constructor(settings: AlfrescoSettingsService, authService: AlfrescoAuthenticationService) {
|
|
||||||
super(settings, authService);
|
|
||||||
}
|
|
||||||
|
|
||||||
createXMLHttpRequestInstance() {
|
|
||||||
let xhr = new XMLHttpRequest();
|
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (this.readyState === this.DONE && this.status === 200) {
|
|
||||||
doneFn(this.responseText);
|
|
||||||
} else if (this.readyState === this.DONE && this.status === 404) {
|
|
||||||
errorFn(this.responseText);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhr.abort = jasmine.createSpy('abort');
|
|
||||||
return xhr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('AlfrescoUploadService', () => {
|
describe('AlfrescoUploadService', () => {
|
||||||
let service, options: any;
|
let service, options: any;
|
||||||
|
|
||||||
@ -62,14 +38,12 @@ describe('AlfrescoUploadService', () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window['AlfrescoApi'] = AlfrescoApiMock;
|
|
||||||
|
|
||||||
beforeEachProviders(() => {
|
beforeEachProviders(() => {
|
||||||
return [
|
return [
|
||||||
HTTP_PROVIDERS,
|
HTTP_PROVIDERS,
|
||||||
{ provide: AlfrescoSettingsService, useClass: AlfrescoSettingsServiceMock },
|
{ provide: AlfrescoSettingsService, useClass: AlfrescoSettingsServiceMock },
|
||||||
{ provide: AlfrescoAuthenticationService, useClass: AlfrescoAuthenticationService },
|
{ provide: AlfrescoAuthenticationService, useClass: AlfrescoAuthenticationService },
|
||||||
{ provide: UploadService, useClass: MockUploadService }
|
UploadService
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -82,23 +56,6 @@ describe('AlfrescoUploadService', () => {
|
|||||||
jasmine.Ajax.uninstall();
|
jasmine.Ajax.uninstall();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should show the default option if no method setOption is called', () => {
|
|
||||||
let empty = {};
|
|
||||||
service.setOptions(empty);
|
|
||||||
expect(service.getUrl()).toEqual('/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children');
|
|
||||||
let formFields: Object = {};
|
|
||||||
expect(service.getFormFields()).toEqual(formFields);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should show the option passed as input', () => {
|
|
||||||
service.setOptions(options);
|
|
||||||
expect(service.getUrl()).toEqual('/some/cool/url');
|
|
||||||
expect(service.getFormFields()).toEqual({
|
|
||||||
siteid: 'fakeSite',
|
|
||||||
containerid: 'fakeFolder'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return an empty queue if no elements are added', () => {
|
it('should return an empty queue if no elements are added', () => {
|
||||||
service.setOptions(options);
|
service.setOptions(options);
|
||||||
expect(service.getQueue().length).toEqual(0);
|
expect(service.getQueue().length).toEqual(0);
|
||||||
@ -118,73 +75,115 @@ describe('AlfrescoUploadService', () => {
|
|||||||
expect(service.getQueue().length).toEqual(2);
|
expect(service.getQueue().length).toEqual(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should make XHR done request after the file is added in the queue', () => {
|
it('should make XHR done request after the file is added in the queue', (done) => {
|
||||||
|
let emitter = new EventEmitter();
|
||||||
|
|
||||||
|
emitter.subscribe(e => {
|
||||||
|
expect(e.value).toBe('File uploaded');
|
||||||
|
done();
|
||||||
|
});
|
||||||
service.setOptions(options);
|
service.setOptions(options);
|
||||||
let filesFake = [{name: 'fake-name', size: 10}];
|
let filesFake = [{name: 'fake-name', size: 10}];
|
||||||
service.addToQueue(filesFake);
|
service.addToQueue(filesFake);
|
||||||
service.uploadFilesInTheQueue('', null);
|
service.uploadFilesInTheQueue('fake-dir', emitter);
|
||||||
|
|
||||||
let request = jasmine.Ajax.requests.mostRecent();
|
let request = jasmine.Ajax.requests.mostRecent();
|
||||||
expect(request.url).toBe('fakehost/some/cool/url');
|
expect(request.url).toBe('fakehost/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children');
|
||||||
expect(request.method).toBe('POST');
|
expect(request.method).toBe('POST');
|
||||||
// expect(request.data()).toEqual({fileName: 'fake-name.png'});
|
|
||||||
|
|
||||||
expect(doneFn).not.toHaveBeenCalled();
|
|
||||||
jasmine.Ajax.requests.mostRecent().respondWith({
|
jasmine.Ajax.requests.mostRecent().respondWith({
|
||||||
'status': 200,
|
'status': 200,
|
||||||
contentType: 'text/plain',
|
contentType: 'text/plain',
|
||||||
responseText: 'File uploaded'
|
responseText: 'File uploaded'
|
||||||
});
|
});
|
||||||
expect(doneFn).toHaveBeenCalledWith('File uploaded');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should make XHR error request after an error occur', () => {
|
it('should make XHR error request after an error occur', (done) => {
|
||||||
|
let emitter = new EventEmitter();
|
||||||
|
|
||||||
|
emitter.subscribe(e => {
|
||||||
|
expect(e.value).toBe('Error file uploaded');
|
||||||
|
done();
|
||||||
|
});
|
||||||
service.setOptions(options);
|
service.setOptions(options);
|
||||||
let filesFake = [{name: 'fake-name', size: 10}];
|
let filesFake = [{name: 'fake-name', size: 10}];
|
||||||
service.addToQueue(filesFake);
|
service.addToQueue(filesFake);
|
||||||
service.uploadFilesInTheQueue('', null);
|
service.uploadFilesInTheQueue('', emitter);
|
||||||
expect(jasmine.Ajax.requests.mostRecent().url).toBe('fakehost/some/cool/url');
|
expect(jasmine.Ajax.requests.mostRecent().url)
|
||||||
|
.toBe('fakehost/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children');
|
||||||
jasmine.Ajax.requests.mostRecent().respondWith({
|
jasmine.Ajax.requests.mostRecent().respondWith({
|
||||||
'status': 404,
|
'status': 404,
|
||||||
contentType: 'text/plain',
|
contentType: 'text/plain',
|
||||||
responseText: 'Error file uploaded'
|
responseText: 'Error file uploaded'
|
||||||
});
|
});
|
||||||
expect(errorFn).toHaveBeenCalledWith('Error file uploaded');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should make XHR abort request after the xhr abort is called', () => {
|
it('should make XHR abort request after the xhr abort is called', (done) => {
|
||||||
|
let emitter = new EventEmitter();
|
||||||
|
|
||||||
|
emitter.subscribe(e => {
|
||||||
|
expect(e.value).toEqual('File aborted');
|
||||||
|
done();
|
||||||
|
});
|
||||||
service.setOptions(options);
|
service.setOptions(options);
|
||||||
let filesFake = [{name: 'fake-name', size: 10}];
|
let filesFake = [{name: 'fake-name', size: 10}];
|
||||||
service.addToQueue(filesFake);
|
service.addToQueue(filesFake);
|
||||||
service.uploadFilesInTheQueue('', null);
|
service.uploadFilesInTheQueue('', emitter);
|
||||||
|
|
||||||
let file = service.getQueue();
|
let file = service.getQueue();
|
||||||
file[0].setAbort();
|
file[0].emitAbort();
|
||||||
expect(file[0]._xmlHttpRequest.abort).toHaveBeenCalled();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should make XHR done request after the file is upload', () => {
|
it('should make XHR error request after the xhr error is called', (done) => {
|
||||||
service.setOptions(options);
|
let emitter = new EventEmitter();
|
||||||
let filesFake = {name: 'fake-name', size: 10};
|
|
||||||
|
|
||||||
let uploadingFileModel = new FileModel(filesFake);
|
emitter.subscribe(e => {
|
||||||
service.uploadFile(uploadingFileModel, '', null);
|
expect(e.value).toBe('Error file uploaded');
|
||||||
|
done();
|
||||||
expect(jasmine.Ajax.requests.mostRecent().url).toBe('fakehost/some/cool/url');
|
|
||||||
jasmine.Ajax.requests.mostRecent().respondWith({
|
|
||||||
'status': 200,
|
|
||||||
contentType: 'text/plain',
|
|
||||||
responseText: 'Single File uploaded'
|
|
||||||
});
|
});
|
||||||
expect(doneFn).toHaveBeenCalledWith('Single File uploaded');
|
service.setOptions(options);
|
||||||
|
let filesFake = [{name: 'fake-name', size: 10}];
|
||||||
|
service.addToQueue(filesFake);
|
||||||
|
service.uploadFilesInTheQueue('', emitter);
|
||||||
|
|
||||||
|
let file = service.getQueue();
|
||||||
|
file[0].emitError();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should make XHR progress request after the onprogress is called', (done) => {
|
||||||
|
service.setOptions(options);
|
||||||
|
let fakeProgress = {
|
||||||
|
loaded: 500,
|
||||||
|
total: 1234,
|
||||||
|
percent: 44
|
||||||
|
};
|
||||||
|
let filesFake = [{name: 'fake-name', size: 10}];
|
||||||
|
service.addToQueue(filesFake);
|
||||||
|
service.filesUpload$.subscribe( (file) => {
|
||||||
|
expect(file).toBeDefined();
|
||||||
|
expect(file[0]).toBeDefined();
|
||||||
|
expect(file[0].progress).toEqual(fakeProgress);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
service.uploadFilesInTheQueue('', null);
|
||||||
|
|
||||||
|
let file = service.getQueue();
|
||||||
|
|
||||||
|
file[0].emitProgres(fakeProgress);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should make XHR done request after the folder is created', (done) => {
|
it('should make XHR done request after the folder is created', (done) => {
|
||||||
let fakeRest = {
|
let fakeRest = {
|
||||||
entry: {
|
entry: {
|
||||||
isFile: false,
|
isFile: false,
|
||||||
isFolder: true
|
isFolder: true,
|
||||||
|
name: 'fake-folder'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let fakePromise = new Promise(function (resolve, reject) {
|
||||||
|
resolve(fakeRest);
|
||||||
|
});
|
||||||
|
spyOn(service, 'callApiCreateFolder').and.returnValue(fakePromise);
|
||||||
service.setOptions(options);
|
service.setOptions(options);
|
||||||
let defaultPath = '';
|
let defaultPath = '';
|
||||||
let folderName = 'fake-folder';
|
let folderName = 'fake-folder';
|
||||||
@ -204,6 +203,10 @@ describe('AlfrescoUploadService', () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let fakePromise = new Promise(function (resolve, reject) {
|
||||||
|
reject(fakeRest);
|
||||||
|
});
|
||||||
|
spyOn(service, 'callApiCreateFolder').and.returnValue(fakePromise);
|
||||||
service.setOptions(options);
|
service.setOptions(options);
|
||||||
let defaultPath = '';
|
let defaultPath = '';
|
||||||
let folderName = 'folder-duplicate-fake';
|
let folderName = 'folder-duplicate-fake';
|
||||||
|
@ -56,15 +56,6 @@ export class UploadService {
|
|||||||
this.formFields = options.formFields != null ? options.formFields : this.formFields;
|
this.formFields = options.formFields != null ? options.formFields : this.formFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the form fields
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
public getFormFields(): Object {
|
|
||||||
return this.formFields;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add files to the uploading queue to be uploaded.
|
* Add files to the uploading queue to be uploaded.
|
||||||
*
|
*
|
||||||
@ -96,14 +87,14 @@ export class UploadService {
|
|||||||
return !uploadingFileModel.uploading && !uploadingFileModel.done && !uploadingFileModel.abort && !uploadingFileModel.error;
|
return !uploadingFileModel.uploading && !uploadingFileModel.done && !uploadingFileModel.abort && !uploadingFileModel.error;
|
||||||
});
|
});
|
||||||
|
|
||||||
filesToUpload.forEach((uploadingFileModel) => {
|
filesToUpload.forEach((uploadingFileModel: FileModel) => {
|
||||||
uploadingFileModel.setUploading();
|
uploadingFileModel.setUploading();
|
||||||
|
|
||||||
let _filesUploadObserverProgressBar = this.filesUploadObserverProgressBar;
|
let _filesUploadObserverProgressBar = this.filesUploadObserverProgressBar;
|
||||||
let _queue = this.queue;
|
let _queue = this.queue;
|
||||||
|
|
||||||
this.authService.getAlfrescoApi().
|
let promiseUpload = this.authService.getAlfrescoApi().
|
||||||
upload.uploadFile(uploadingFileModel.file, directory)
|
upload.uploadFile(uploadingFileModel.file, directory)
|
||||||
.on('progress', (progress: any) => {
|
.on('progress', (progress: any) => {
|
||||||
uploadingFileModel.setProgres(progress);
|
uploadingFileModel.setProgres(progress);
|
||||||
if (_filesUploadObserverProgressBar) {
|
if (_filesUploadObserverProgressBar) {
|
||||||
@ -112,9 +103,15 @@ export class UploadService {
|
|||||||
})
|
})
|
||||||
.on('abort', () => {
|
.on('abort', () => {
|
||||||
uploadingFileModel.setAbort();
|
uploadingFileModel.setAbort();
|
||||||
|
elementEmit.emit({
|
||||||
|
value: 'File aborted'
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.on('error', () => {
|
.on('error', () => {
|
||||||
uploadingFileModel.setError();
|
uploadingFileModel.setError();
|
||||||
|
elementEmit.emit({
|
||||||
|
value: 'Error file uploaded'
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.on('success', (data: any) => {
|
.on('success', (data: any) => {
|
||||||
elementEmit.emit({
|
elementEmit.emit({
|
||||||
@ -133,6 +130,8 @@ export class UploadService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
uploadingFileModel.setPromiseUpload(promiseUpload);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +158,7 @@ export class UploadService {
|
|||||||
* @param name - the folder name
|
* @param name - the folder name
|
||||||
*/
|
*/
|
||||||
createFolder(relativePath: string, name: string) {
|
createFolder(relativePath: string, name: string) {
|
||||||
return Observable.fromPromise(this.authService.getAlfrescoApi().node.createFolder(name, relativePath))
|
return Observable.fromPromise(this.callApiCreateFolder(relativePath, name))
|
||||||
.map(res => {
|
.map(res => {
|
||||||
return res;
|
return res;
|
||||||
})
|
})
|
||||||
@ -167,6 +166,10 @@ export class UploadService {
|
|||||||
.catch(this.handleError);
|
.catch(this.handleError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private callApiCreateFolder(relativePath: string, name: string) {
|
||||||
|
return this.authService.getAlfrescoApi().node.createFolder(name, relativePath);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Throw the error
|
* Throw the error
|
||||||
* @param error
|
* @param error
|
||||||
|
Loading…
x
Reference in New Issue
Block a user