mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
CST-9639: Added and fixed unit tests
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ng-container *ngFor="let control of form.accessControls; trackBy: trackById">
|
<ng-container *ngFor="let control of form.accessControls; trackBy: trackById">
|
||||||
<div #ngModelGroup="ngModelGroup" ngModelGroup="access-control-item-{{control.id}}" class="access-control-item mt-3">
|
<div ngModelGroup="access-control-item-{{control.id}}" class="access-control-item mt-3">
|
||||||
|
|
||||||
<div class="d-flex flex-column">
|
<div class="d-flex flex-column">
|
||||||
<div>
|
<div>
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
|
|
||||||
<button type="button" class="btn btn-outline-danger"
|
<button type="button" class="btn btn-outline-danger"
|
||||||
[disabled]="ngForm.disabled || form.accessControls.length === 1"
|
[disabled]="ngForm.disabled || form.accessControls.length === 1"
|
||||||
(click)="removeAccessControlItem(ngModelGroup, control.id)">
|
(click)="removeAccessControlItem(control.id)">
|
||||||
<i class="fas fa-trash"></i>
|
<i class="fas fa-trash"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -45,12 +45,14 @@ describe('AccessControlArrayFormComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should remove access control item', () => {
|
it('should remove access control item', () => {
|
||||||
component.removeAccessControlItem(0);
|
expect(component.form.accessControls.length).toEqual(1);
|
||||||
expect(component.form.accessControls.length).toEqual(0);
|
|
||||||
|
|
||||||
component.addAccessControlItem();
|
component.addAccessControlItem();
|
||||||
component.removeAccessControlItem(0);
|
expect(component.form.accessControls.length).toEqual(2);
|
||||||
expect(component.form.accessControls.length).toEqual(0);
|
|
||||||
|
const id = component.form.accessControls[0].id;
|
||||||
|
component.removeAccessControlItem(id);
|
||||||
|
expect(component.form.accessControls.length).toEqual(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should reset form value', () => {
|
it('should reset form value', () => {
|
||||||
@@ -69,7 +71,12 @@ describe('AccessControlArrayFormComponent', () => {
|
|||||||
|
|
||||||
|
|
||||||
it('should display a select dropdown with options', () => {
|
it('should display a select dropdown with options', () => {
|
||||||
const selectElement: DebugElement = fixture.debugElement.query(By.css('select#accesscontroloption-0'));
|
component.enable();
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
const id = component.form.accessControls[0].id;
|
||||||
|
|
||||||
|
const selectElement: DebugElement = fixture.debugElement.query(By.css(`select#accesscontroloption-${id}`));
|
||||||
expect(selectElement).toBeTruthy();
|
expect(selectElement).toBeTruthy();
|
||||||
|
|
||||||
const options = selectElement.nativeElement.querySelectorAll('option');
|
const options = selectElement.nativeElement.querySelectorAll('option');
|
||||||
@@ -81,6 +88,9 @@ describe('AccessControlArrayFormComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should add new access control items when clicking "Add more" button', () => {
|
it('should add new access control items when clicking "Add more" button', () => {
|
||||||
|
component.enable();
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
const addButton: DebugElement = fixture.debugElement.query(By.css(`button#add-btn-${component.type}`));
|
const addButton: DebugElement = fixture.debugElement.query(By.css(`button#add-btn-${component.type}`));
|
||||||
addButton.nativeElement.click();
|
addButton.nativeElement.click();
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
@@ -90,11 +100,17 @@ describe('AccessControlArrayFormComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should remove access control items when clicking remove button', () => {
|
it('should remove access control items when clicking remove button', () => {
|
||||||
const removeButton: DebugElement = fixture.debugElement.query(By.css('button.btn-outline-danger'));
|
component.enable();
|
||||||
removeButton.nativeElement.click();
|
|
||||||
|
component.addAccessControlItem('test');
|
||||||
|
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
const removeButton: DebugElement[] = fixture.debugElement.queryAll(By.css('button.btn-outline-danger'));
|
||||||
|
removeButton[1].nativeElement.click();
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
const accessControlItems = fixture.debugElement.queryAll(By.css('.access-control-item'));
|
const accessControlItems = fixture.debugElement.queryAll(By.css('.access-control-item'));
|
||||||
expect(accessControlItems.length).toEqual(0);
|
expect(accessControlItems.length).toEqual(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import {Component, Input, OnInit, ViewChild} from '@angular/core';
|
import {Component, Input, OnInit, ViewChild} from '@angular/core';
|
||||||
import {NgForm, NgModelGroup} from '@angular/forms';
|
import {NgForm} from '@angular/forms';
|
||||||
import {AccessesConditionOption} from '../../../core/config/models/config-accesses-conditions-options.model';
|
import {AccessesConditionOption} from '../../../core/config/models/config-accesses-conditions-options.model';
|
||||||
import {dateToISOFormat} from '../../date.util';
|
import {dateToISOFormat} from '../../date.util';
|
||||||
|
|
||||||
@@ -52,9 +52,7 @@ export class AccessControlArrayFormComponent implements OnInit {
|
|||||||
* @param ngModelGroup
|
* @param ngModelGroup
|
||||||
* @param index
|
* @param index
|
||||||
*/
|
*/
|
||||||
removeAccessControlItem(ngModelGroup: NgModelGroup, id: number) {
|
removeAccessControlItem(id: number) {
|
||||||
this.ngForm.removeFormGroup(ngModelGroup);
|
|
||||||
|
|
||||||
this.form.accessControls = this.form.accessControls.filter(item => item.id !== id);
|
this.form.accessControls = this.form.accessControls.filter(item => item.id !== id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,38 +1,149 @@
|
|||||||
//
|
import {ComponentFixture, fakeAsync, TestBed} from '@angular/core/testing';
|
||||||
// describe('AccessControlFormContainerComponent', () => {
|
import {NgbDatepickerModule, NgbModal, NgbModalRef} from '@ng-bootstrap/ng-bootstrap';
|
||||||
// let component: AccessControlFormContainerComponent<any>;
|
import {Component} from '@angular/core';
|
||||||
// let fixture: ComponentFixture<AccessControlFormContainerComponent<any>>;
|
import {of} from 'rxjs';
|
||||||
//
|
import {AccessControlFormContainerComponent} from './access-control-form-container.component';
|
||||||
// let bulkAccessConfigDataServiceMock: BulkAccessConfigDataService;
|
import {BulkAccessControlService} from './bulk-access-control.service';
|
||||||
//
|
import {BulkAccessConfigDataService} from '../../core/config/bulk-access-config-data.service';
|
||||||
// beforeEach(async () => {
|
import {Item} from '../../core/shared/item.model';
|
||||||
//
|
import {SelectableListService} from '../object-list/selectable-list/selectable-list.service';
|
||||||
// bulkAccessConfigDataServiceMock = jasmine.createSpyObj('BulkAccessConfigDataService', {
|
import {createAccessControlInitialFormState} from './access-control-form-container-intial-state';
|
||||||
// findByName: jasmine.createSpy('findByName'),
|
import {CommonModule} from '@angular/common';
|
||||||
// });
|
import {SharedBrowseByModule} from '../browse-by/shared-browse-by.module';
|
||||||
//
|
import {TranslateModule} from '@ngx-translate/core';
|
||||||
//
|
import {FormsModule} from '@angular/forms';
|
||||||
// await TestBed.configureTestingModule({
|
import {UiSwitchModule} from 'ngx-ui-switch';
|
||||||
// declarations: [ AccessControlFormContainerComponent ],
|
import {
|
||||||
// imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ],
|
ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID
|
||||||
// providers: [
|
} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component';
|
||||||
// { provide: BulkAccessConfigDataService, useValue: bulkAccessConfigDataServiceMock },
|
import {AccessControlFormModule} from './access-control-form.module';
|
||||||
// // private bulkAccessControlService: BulkAccessControlService,
|
|
||||||
// // private selectableListService: SelectableListService,
|
|
||||||
// // protected modalService: NgbModal,
|
describe('AccessControlFormContainerComponent', () => {
|
||||||
// // private cdr: ChangeDetectorRef
|
let component: AccessControlFormContainerComponent<any>;
|
||||||
// ]
|
let fixture: ComponentFixture<AccessControlFormContainerComponent<any>>;
|
||||||
// })
|
|
||||||
// .compileComponents();
|
|
||||||
// });
|
// Mock NgbModal
|
||||||
//
|
@Component({selector: 'ds-ngb-modal', template: ''})
|
||||||
// beforeEach(() => {
|
class MockNgbModalComponent {
|
||||||
// fixture = TestBed.createComponent(AccessControlFormContainerComponent);
|
}
|
||||||
// component = fixture.componentInstance;
|
|
||||||
// fixture.detectChanges();
|
// Mock dependencies
|
||||||
// });
|
const mockBulkAccessControlService = {
|
||||||
//
|
createPayloadFile: jasmine.createSpy('createPayloadFile').and.returnValue({file: 'mocked-file'}),
|
||||||
// it('should create', () => {
|
executeScript: jasmine.createSpy('executeScript').and.returnValue(of('success')),
|
||||||
// expect(component).toBeTruthy();
|
};
|
||||||
// });
|
|
||||||
// });
|
const mockBulkAccessConfigDataService = {
|
||||||
|
findByName: jasmine.createSpy('findByName').and.returnValue(of({payload: {options: []}})),
|
||||||
|
};
|
||||||
|
|
||||||
|
const mockSelectableListService = {
|
||||||
|
getSelectableList: jasmine.createSpy('getSelectableList').and.returnValue(of({selection: []})),
|
||||||
|
deselectAll: jasmine.createSpy('deselectAll'),
|
||||||
|
};
|
||||||
|
|
||||||
|
const mockNgbModal = {
|
||||||
|
open: jasmine.createSpy('open').and.returnValue(
|
||||||
|
{ componentInstance: {}, closed: of({})} as NgbModalRef
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [AccessControlFormContainerComponent, MockNgbModalComponent],
|
||||||
|
imports: [
|
||||||
|
CommonModule,
|
||||||
|
FormsModule,
|
||||||
|
SharedBrowseByModule,
|
||||||
|
AccessControlFormModule,
|
||||||
|
TranslateModule.forRoot(),
|
||||||
|
NgbDatepickerModule,
|
||||||
|
UiSwitchModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
{provide: BulkAccessControlService, useValue: mockBulkAccessControlService},
|
||||||
|
{provide: BulkAccessConfigDataService, useValue: mockBulkAccessConfigDataService},
|
||||||
|
{provide: SelectableListService, useValue: mockSelectableListService},
|
||||||
|
{provide: NgbModal, useValue: mockNgbModal},
|
||||||
|
],
|
||||||
|
}).compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(AccessControlFormContainerComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
component.state = createAccessControlInitialFormState();
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create the component', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should reset the form', fakeAsync(() => {
|
||||||
|
fixture.detectChanges();
|
||||||
|
const resetSpy = spyOn(component.bitstreamAccessCmp, 'reset');
|
||||||
|
spyOn(component.itemAccessCmp, 'reset');
|
||||||
|
|
||||||
|
component.reset();
|
||||||
|
|
||||||
|
expect(resetSpy).toHaveBeenCalled();
|
||||||
|
expect(component.itemAccessCmp.reset).toHaveBeenCalled();
|
||||||
|
expect(component.state).toEqual(createAccessControlInitialFormState());
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should submit the form', () => {
|
||||||
|
const bitstreamAccess = 'bitstreamAccess';
|
||||||
|
const itemAccess = 'itemAccess';
|
||||||
|
component.bitstreamAccessCmp.getValue = jasmine.createSpy('getValue').and.returnValue(bitstreamAccess);
|
||||||
|
component.itemAccessCmp.getValue = jasmine.createSpy('getValue').and.returnValue(itemAccess);
|
||||||
|
component.itemRD = {payload: {uuid: 'item-uuid'}} as any;
|
||||||
|
|
||||||
|
component.submit();
|
||||||
|
|
||||||
|
expect(mockBulkAccessControlService.createPayloadFile).toHaveBeenCalledWith({
|
||||||
|
bitstreamAccess,
|
||||||
|
itemAccess,
|
||||||
|
state: createAccessControlInitialFormState(),
|
||||||
|
});
|
||||||
|
expect(mockBulkAccessControlService.executeScript).toHaveBeenCalledWith(['item-uuid'], 'mocked-file');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle the status change for bitstream access', () => {
|
||||||
|
component.bitstreamAccessCmp.enable = jasmine.createSpy('enable');
|
||||||
|
component.bitstreamAccessCmp.disable = jasmine.createSpy('disable');
|
||||||
|
|
||||||
|
component.handleStatusChange('bitstream', true);
|
||||||
|
expect(component.bitstreamAccessCmp.enable).toHaveBeenCalled();
|
||||||
|
|
||||||
|
component.handleStatusChange('bitstream', false);
|
||||||
|
expect(component.bitstreamAccessCmp.disable).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle the status change for item access', () => {
|
||||||
|
component.itemAccessCmp.enable = jasmine.createSpy('enable');
|
||||||
|
component.itemAccessCmp.disable = jasmine.createSpy('disable');
|
||||||
|
|
||||||
|
component.handleStatusChange('item', true);
|
||||||
|
expect(component.itemAccessCmp.enable).toHaveBeenCalled();
|
||||||
|
|
||||||
|
component.handleStatusChange('item', false);
|
||||||
|
expect(component.itemAccessCmp.disable).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should open the select bitstreams modal', () => {
|
||||||
|
const modalService = TestBed.inject(NgbModal);
|
||||||
|
|
||||||
|
component.openSelectBitstreamsModal(new Item());
|
||||||
|
expect(modalService.open).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should unsubscribe and deselect all on component destroy', () => {
|
||||||
|
component.ngOnDestroy();
|
||||||
|
expect(component.selectableListService.deselectAll).toHaveBeenCalledWith(
|
||||||
|
ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
@@ -58,7 +58,7 @@ export class AccessControlFormContainerComponent<T extends DSpaceObject> impleme
|
|||||||
constructor(
|
constructor(
|
||||||
private bulkAccessConfigService: BulkAccessConfigDataService,
|
private bulkAccessConfigService: BulkAccessConfigDataService,
|
||||||
private bulkAccessControlService: BulkAccessControlService,
|
private bulkAccessControlService: BulkAccessControlService,
|
||||||
private selectableListService: SelectableListService,
|
public selectableListService: SelectableListService,
|
||||||
protected modalService: NgbModal,
|
protected modalService: NgbModal,
|
||||||
private cdr: ChangeDetectorRef
|
private cdr: ChangeDetectorRef
|
||||||
) {}
|
) {}
|
||||||
|
Reference in New Issue
Block a user