diff --git a/lib/content-services/upload/components/upload-button.component.spec.ts b/lib/content-services/upload/components/upload-button.component.spec.ts index 39150b7a00..01642f7319 100644 --- a/lib/content-services/upload/components/upload-button.component.spec.ts +++ b/lib/content-services/upload/components/upload-button.component.spec.ts @@ -20,7 +20,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ContentService, UploadService, TranslationService, setupTestBed, CoreModule } from '@alfresco/adf-core'; import { Observable } from 'rxjs/Observable'; import { UploadButtonComponent } from './upload-button.component'; -import { TranslationMock } from '@alfresco/adf-core'; +import { TranslationMock, PermissionsEnum } from '@alfresco/adf-core'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; describe('UploadButtonComponent', () => { @@ -100,6 +100,22 @@ describe('UploadButtonComponent', () => { expect(compiled.querySelector('#uploadFolder')).toBeDefined(); }); + it('should disable uploadFolder button if disabled is true', () => { + component.disabled = true; + component.uploadFolders = true; + let compiled = fixture.debugElement.nativeElement; + fixture.detectChanges(); + expect(compiled.querySelector('#uploadFolder').getAttribute('disabled')).toBe('true'); + }); + + it('should disable upload-single-file button if disabled is true', () => { + component.disabled = true; + component.multipleFiles = false; + let compiled = fixture.debugElement.nativeElement; + fixture.detectChanges(); + expect(compiled.querySelector('#upload-single-file').getAttribute('disabled')).toBe('true'); + }); + it('should call uploadFile with the default root folder', () => { component.rootFolderId = '-root-'; component.success = null; @@ -130,6 +146,18 @@ describe('UploadButtonComponent', () => { expect(uploadService.uploadFilesInTheQueue).toHaveBeenCalledWith(null); }); + it('should not call uploadFiles if rootFolderId is null', () => { + component.rootFolderId = null; + component.ngOnChanges({ rootFolderId: new SimpleChange(null, null, true) }); + + uploadService.uploadFilesInTheQueue = jasmine.createSpy('uploadFilesInTheQueue'); + + fixture.detectChanges(); + + component.onFilesAdded(fakeEvent); + expect(uploadService.uploadFilesInTheQueue).not.toHaveBeenCalled(); + }); + it('should create a folder and emit an File uploaded event', (done) => { component.rootFolderId = '-my-'; @@ -312,4 +340,88 @@ describe('UploadButtonComponent', () => { expect(addToQueueSpy).not.toHaveBeenCalled(); }); }); + + describe('uploadFiles permission', () => { + let fakeNodeWithNoPermission; + + beforeEach(() => { + fakeNodeWithNoPermission = { + entry: {} + }; + }); + + it('should not call uploadFiles for node without permission', () => { + component.rootFolderId = 'nodeId'; + + spyOn(contentService, 'getNode').and.returnValue(Observable.of(fakeNodeWithNoPermission)); + component.ngOnChanges({ rootFolderId: new SimpleChange(null, component.rootFolderId, true) }); + + uploadService.uploadFilesInTheQueue = jasmine.createSpy('uploadFilesInTheQueue'); + + fixture.detectChanges(); + + component.onFilesAdded(fakeEvent); + expect(uploadService.uploadFilesInTheQueue).not.toHaveBeenCalled(); + }); + + it('should not call uploadFiles when getNode fails', () => { + component.rootFolderId = 'nodeId'; + + spyOn(contentService, 'getNode').and.returnValue(Observable.throw('error')); + component.ngOnChanges({ rootFolderId: new SimpleChange(null, component.rootFolderId, true) }); + + uploadService.uploadFilesInTheQueue = jasmine.createSpy('uploadFilesInTheQueue'); + + fixture.detectChanges(); + + component.onFilesAdded(fakeEvent); + expect(uploadService.uploadFilesInTheQueue).not.toHaveBeenCalled(); + }); + + it('should emit an error message when getNode fails', (done) => { + component.rootFolderId = 'nodeId'; + + spyOn(contentService, 'getNode').and.returnValue(Observable.throw('error')); + + component.error.subscribe((value) => { + expect(value).toBe('error'); + done(); + }); + + component.ngOnChanges({ rootFolderId: new SimpleChange(null, component.rootFolderId, true) }); + fixture.detectChanges(); + + component.onFilesAdded(fakeEvent); + }); + + it('should not call uploadFiles for node with other permissions', () => { + component.rootFolderId = 'nodeId'; + + fakeNodeWithNoPermission.entry.allowableOperations = ['other']; + + spyOn(contentService, 'getNode').and.returnValue(Observable.of(fakeNodeWithNoPermission)); + component.ngOnChanges({ rootFolderId: new SimpleChange(null, component.rootFolderId, true) }); + + uploadService.uploadFilesInTheQueue = jasmine.createSpy('uploadFilesInTheQueue'); + + fixture.detectChanges(); + + component.onFilesAdded(fakeEvent); + expect(uploadService.uploadFilesInTheQueue).not.toHaveBeenCalled(); + }); + + it('should call uploadFiles when node has CREATE', () => { + component.rootFolderId = 'nodeId'; + + spyOn(contentService, 'getNode').and.returnValue(Observable.of(fakeFolderNodeWithPermission)); + component.ngOnChanges({ rootFolderId: new SimpleChange(null, component.rootFolderId, true) }); + + uploadService.uploadFilesInTheQueue = jasmine.createSpy('uploadFilesInTheQueue'); + + fixture.detectChanges(); + + component.onFilesAdded(fakeEvent); + expect(uploadService.uploadFilesInTheQueue).toHaveBeenCalled(); + }); + }); }); diff --git a/lib/content-services/upload/components/upload-button.component.ts b/lib/content-services/upload/components/upload-button.component.ts index 50a56fa81e..57f8c6f988 100644 --- a/lib/content-services/upload/components/upload-button.component.ts +++ b/lib/content-services/upload/components/upload-button.component.ts @@ -23,6 +23,7 @@ import { Component, EventEmitter, forwardRef, Input, OnChanges, OnInit, Output, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { MinimalNodeEntryEntity } from 'alfresco-js-api'; import { Subject } from 'rxjs/Subject'; import { PermissionModel } from '../../document-list/models/permissions.model'; import 'rxjs/add/observable/throw'; @@ -61,7 +62,7 @@ export class UploadButtonComponent extends UploadBase implements OnInit, OnChang private hasPermission: boolean = false; - private permissionValue: Subject = new Subject(); + protected permissionValue: Subject = new Subject(); constructor(protected uploadService: UploadService, private contentService: ContentService, @@ -118,9 +119,13 @@ export class UploadButtonComponent extends UploadBase implements OnInit, OnChang }; this.contentService.getNode(this.rootFolderId, opts).subscribe( - res => this.permissionValue.next(this.contentService.hasPermission(res.entry, PermissionsEnum.CREATE)), + res => this.permissionValue.next(this.nodeHasPermission(res.entry, PermissionsEnum.CREATE)), error => this.error.emit(error) ); } } + + nodeHasPermission(node: MinimalNodeEntryEntity, permission: PermissionsEnum | string): boolean { + return this.contentService.hasPermission(node, permission); + } } diff --git a/lib/content-services/upload/components/upload-version-button.component.ts b/lib/content-services/upload/components/upload-version-button.component.ts index bda00cc080..84e4e4a5c3 100644 --- a/lib/content-services/upload/components/upload-version-button.component.ts +++ b/lib/content-services/upload/components/upload-version-button.component.ts @@ -15,7 +15,8 @@ * limitations under the License. */ -import { Component, forwardRef, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { PermissionsEnum } from '@alfresco/adf-core'; +import { Component, forwardRef, Input, OnChanges, SimpleChanges, ViewEncapsulation, OnInit } from '@angular/core'; import { MinimalNodeEntryEntity } from 'alfresco-js-api'; import { UploadButtonComponent } from './upload-button.component'; import { FileModel, EXTENDIBLE_COMPONENT } from '@alfresco/adf-core'; @@ -29,7 +30,7 @@ import { FileModel, EXTENDIBLE_COMPONENT } from '@alfresco/adf-core'; ], encapsulation: ViewEncapsulation.None }) -export class UploadVersionButtonComponent extends UploadButtonComponent implements OnChanges { +export class UploadVersionButtonComponent extends UploadButtonComponent implements OnChanges, OnInit { /** (**Required**) The node to be versioned. */ @Input() @@ -57,4 +58,13 @@ export class UploadVersionButtonComponent extends UploadButtonComponent implemen return fileModel; } + + ngOnInit() { + super.ngOnInit(); + this.checkPermission(); + } + + checkPermission() { + this.permissionValue.next(this.nodeHasPermission(this.node, PermissionsEnum.UPDATE)); + } }