diff --git a/src/app/access-control/bulk-access/bulk-access.component.spec.ts b/src/app/access-control/bulk-access/bulk-access.component.spec.ts index ccbdabb7a6..e9b253147d 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.spec.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.spec.ts @@ -14,7 +14,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; -fdescribe('BulkAccessComponent', () => { +describe('BulkAccessComponent', () => { let component: BulkAccessComponent; let fixture: ComponentFixture; let bulkAccessControlService: any; diff --git a/src/app/access-control/bulk-access/bulk-access.component.ts b/src/app/access-control/bulk-access/bulk-access.component.ts index 074dbc7f55..04724614cb 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -1,20 +1,12 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { Router } from '@angular/router'; import { BehaviorSubject, Subscription } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; -import { TranslateService } from '@ngx-translate/core'; import { BulkAccessSettingsComponent } from './settings/bulk-access-settings.component'; import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service'; import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; import { SelectableListService } from '../../shared/object-list/selectable-list/selectable-list.service'; -import { getFirstCompletedRemoteData } from '../../core/shared/operators'; -import { RemoteData } from '../../core/data/remote-data'; -import { Process } from '../../process-page/processes/process.model'; -import { isNotEmpty } from '../../shared/empty.util'; -import { getProcessDetailRoute } from '../../process-page/process-page-routing.paths'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; @Component({ selector: 'ds-bulk-access', @@ -45,10 +37,7 @@ export class BulkAccessComponent implements OnInit { constructor( private bulkAccessControlService: BulkAccessControlService, - private notificationsService: NotificationsService, - private router: Router, - private selectableListService: SelectableListService, - private translationService: TranslateService + private selectableListService: SelectableListService ) { } @@ -91,24 +80,7 @@ export class BulkAccessComponent implements OnInit { this.bulkAccessControlService.executeScript( this.objectsSelected$.value || [], file - ).pipe( - getFirstCompletedRemoteData(), - map((rd: RemoteData) => { - if (rd.hasSucceeded) { - const title = this.translationService.get('process.new.notification.success.title'); - const content = this.translationService.get('process.new.notification.success.content'); - this.notificationsService.success(title, content); - if (isNotEmpty(rd.payload)) { - this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId)); - } - return true; - } else { - const title = this.translationService.get('process.new.notification.error.title'); - const content = this.translationService.get('process.new.notification.error.content'); - this.notificationsService.error(title, content); - return false; - } - })).subscribe(); + ).subscribe(); } /** diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts index 1bd2efcfef..2dc2bbc4f3 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.spec.ts @@ -1,20 +1,57 @@ import { TestBed } from '@angular/core/testing'; -import { BulkAccessControlService, BulkAccessPayload } from './bulk-access-control.service'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TranslateModule } from '@ngx-translate/core'; + +import { BulkAccessControlService } from './bulk-access-control.service'; import { ScriptDataService } from '../../core/data/processes/script-data.service'; import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; +import { NotificationsService } from '../notifications/notifications.service'; +import { NotificationsServiceStub } from '../testing/notifications-service.stub'; +import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; +import { Process } from '../../process-page/processes/process.model'; describe('BulkAccessControlService', () => { let service: BulkAccessControlService; let scriptServiceSpy: jasmine.SpyObj; - + const mockPayload: any = { + 'bitstream': [], + 'item': [ + { + 'name': 'embargo', + 'startDate': { + 'year': 2026, + 'month': 5, + 'day': 31 + }, + 'endDate': null + } + ], + 'state': { + 'item': { + 'toggleStatus': true, + 'accessMode': 'replace' + }, + 'bitstream': { + 'toggleStatus': false, + 'accessMode': '', + 'changesLimit': '', + 'selectedBitstreams': [] + } + } + }; beforeEach(() => { const spy = jasmine.createSpyObj('ScriptDataService', ['invoke']); TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + TranslateModule.forRoot() + ], providers: [ BulkAccessControlService, - { provide: ScriptDataService, useValue: spy } + { provide: ScriptDataService, useValue: spy }, + { provide: NotificationsService, useValue: NotificationsServiceStub }, ] }); service = TestBed.inject(BulkAccessControlService); @@ -27,7 +64,7 @@ describe('BulkAccessControlService', () => { describe('createPayloadFile', () => { it('should create a file and return the URL and file object', () => { - const payload: BulkAccessPayload = { state: null, bitstreamAccess: null, itemAccess: null }; + const payload = mockPayload; const result = service.createPayloadFile(payload); expect(result.url).toBeTruthy(); @@ -39,10 +76,13 @@ describe('BulkAccessControlService', () => { it('should invoke the script service with the correct parameters', () => { const uuids = ['123', '456']; const file = new File(['test'], 'data.json', { type: 'application/json' }); - const expectedParams: ProcessParameter[] = [{ name: 'uuid', value: '123,456' }]; + const expectedParams: ProcessParameter[] = [ + { name: '-u', value: '123,456' }, + { name: '-f', value: 'data.json' } + ]; // @ts-ignore - scriptServiceSpy.invoke.and.returnValue(Promise.resolve({})); + scriptServiceSpy.invoke.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); const result = service.executeScript(uuids, file); diff --git a/src/app/shared/access-control-form-container/bulk-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts index 057a64906f..706bdde367 100644 --- a/src/app/shared/access-control-form-container/bulk-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -1,8 +1,19 @@ import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; + +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; import { ScriptDataService } from '../../core/data/processes/script-data.service'; import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; import { AccessControlFormState } from './access-control-form-container.component'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { RemoteData } from '../../core/data/remote-data'; +import { Process } from '../../process-page/processes/process.model'; +import { isNotEmpty } from '../empty.util'; +import { getProcessDetailRoute } from '../../process-page/process-page-routing.paths'; +import { NotificationsService } from '../notifications/notifications.service'; export interface BulkAccessPayload { state: AccessControlFormState; @@ -12,7 +23,14 @@ export interface BulkAccessPayload { @Injectable({ providedIn: 'root' }) export class BulkAccessControlService { - constructor(private scriptService: ScriptDataService) {} + constructor( + private notificationsService: NotificationsService, + private router: Router, + private scriptService: ScriptDataService, + private translationService: TranslateService + ) { + + } createPayloadFile(payload: BulkAccessPayload) { const content = convertToBulkAccessControlFileModel(payload); @@ -26,19 +44,37 @@ export class BulkAccessControlService { }); const url = URL.createObjectURL(file); - window.open(url, '_blank'); // remove this later return { url, file }; } - executeScript(uuids: string[], file: File) { + executeScript(uuids: string[], file: File): Observable { console.log('execute', { uuids, file }); const params: ProcessParameter[] = [ - { name: 'uuid', value: uuids.join(',') }, + { name: '-u', value: uuids.join(',') }, + { name: '-f', value: file.name } ]; - return this.scriptService.invoke('bulk-access-control', params, [file]); + return this.scriptService.invoke('bulk-access-control', params, [file]).pipe( + getFirstCompletedRemoteData(), + map((rd: RemoteData) => { + if (rd.hasSucceeded) { + const title = this.translationService.get('process.new.notification.success.title'); + const content = this.translationService.get('process.new.notification.success.content'); + this.notificationsService.success(title, content); + if (isNotEmpty(rd.payload)) { + this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId)); + } + return true; + } else { + const title = this.translationService.get('process.new.notification.error.title'); + const content = this.translationService.get('process.new.notification.error.content'); + this.notificationsService.error(title, content); + return false; + } + }) + ); } }