diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index 53a7302b46..eff5942d4e 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -1,7 +1,7 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; -import { distinctUntilChanged, map, tap } from 'rxjs/operators'; +import { distinctUntilChanged, map } from 'rxjs/operators'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; @@ -67,8 +67,7 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { this.subs.push( this.selectableListService.getSelectableList(this.listId).pipe( distinctUntilChanged(), - map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)), - tap(console.log) + map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list)) ).subscribe(this.objectsSelected$) ) } 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 3372f98dab..8a64d01df4 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 @@ -10,6 +10,9 @@ import { SelectableListService } from '../../shared/object-list/selectable-list/ import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { Process } from '../../process-page/processes/process.model'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; fdescribe('BulkAccessComponent', () => { let component: BulkAccessComponent; @@ -47,6 +50,13 @@ fdescribe('BulkAccessComponent', () => { } }; + const mockFile = { + "uuids": [ + '1234', '5678' + ], + "file": { } + } + const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', { getValue: jasmine.createSpy('getValue'), reset: jasmine.createSpy('reset') @@ -55,12 +65,18 @@ fdescribe('BulkAccessComponent', () => { const selectableListState: SelectableListState = { id: 'test', selection }; const expectedIdList = ['1234', '5678']; + const selectableListStateEmpty: SelectableListState = { id: 'test', selection: [] }; + beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ TranslateModule.forRoot() ], + imports: [ + RouterTestingModule, + TranslateModule.forRoot() + ], declarations: [ BulkAccessComponent ], providers: [ { provide: BulkAccessControlService, useValue: bulkAccessControlServiceMock }, + { provide: NotificationsService, useValue: NotificationsServiceStub }, { provide: SelectableListService, useValue: selectableListServiceMock } ], schemas: [NO_ERRORS_SCHEMA] @@ -73,43 +89,70 @@ fdescribe('BulkAccessComponent', () => { component = fixture.componentInstance; bulkAccessControlService = TestBed.inject(BulkAccessControlService); selectableListService = TestBed.inject(SelectableListService); - (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); - fixture.detectChanges(); - component.settings = mockSettings; + }); afterEach(() => { fixture.destroy(); }); - it('should create', () => { - expect(component).toBeTruthy(); + describe('when there are no elements selected', () => { + + beforeEach(() => { + + (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListStateEmpty)); + fixture.detectChanges(); + component.settings = mockSettings; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should generate the id list by selected elements', () => { + expect(component.objectsSelected$.value).toEqual([]); + }); + + it('should disable the execute button when there are no objects selected', () => { + expect(component.canExport()).toBe(false); + }); + }); - it('should generate the id list by selected elements', () => { - expect(component.objectsSelected$.value).toEqual(expectedIdList); - }); + describe('when there are elements selected', () => { - it('should disable the execute button when there are no objects selected', () => { - expect(component.canExport()).toBe(false); - }); + beforeEach(() => { - it('should enable the execute button when there are objects selected', () => { - component.objectsSelected$.next(['1234']); - expect(component.canExport()).toBe(true); - }); + (component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState)); + fixture.detectChanges(); + component.settings = mockSettings; + }); - it('should call the settings reset method when reset is called', () => { - spyOn(component.settings, 'reset'); - component.reset(); - expect(component.settings.reset).toHaveBeenCalled(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call the bulkAccessControlService executeScript method when submit is called', () => { - (component.settings as any).getValue.and.returnValue(mockFormState) - bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); - component.objectsSelected$.next(['1234']); - component.submit(); - expect(bulkAccessControlService.executeScript).toHaveBeenCalled(); + it('should generate the id list by selected elements', () => { + expect(component.objectsSelected$.value).toEqual(expectedIdList); + }); + + it('should enable the execute button when there are objects selected', () => { + component.objectsSelected$.next(['1234']); + expect(component.canExport()).toBe(true); + }); + + it('should call the settings reset method when reset is called', () => { + component.reset(); + expect(component.settings.reset).toHaveBeenCalled(); + }); + + it('should call the bulkAccessControlService executeScript method when submit is called', () => { + (component.settings as any).getValue.and.returnValue(mockFormState); + bulkAccessControlService.createPayloadFile.and.returnValue(mockFile); + bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process())); + component.objectsSelected$.next(['1234']); + component.submit(); + expect(bulkAccessControlService.executeScript).toHaveBeenCalled(); + }); }); }); 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 8a82edb273..b928f3da4a 100644 --- a/src/app/access-control/bulk-access/bulk-access.component.ts +++ b/src/app/access-control/bulk-access/bulk-access.component.ts @@ -1,36 +1,28 @@ 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 { distinctUntilChanged, map, take, tap } from 'rxjs/operators'; import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service'; import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer'; -import { BehaviorSubject, Subscription } from 'rxjs'; 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', - // templateUrl: './bulk-access.component.html', - template: `