CST-9639: Added and fixed unit tests

This commit is contained in:
Enea Jahollari
2023-06-07 17:29:05 +02:00
parent 9f78f6c5c1
commit 12b3eb839b
5 changed files with 178 additions and 53 deletions

View File

@@ -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>

View File

@@ -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);
}); });
}); });

View File

@@ -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);
} }

View File

@@ -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
);
});
});

View File

@@ -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
) {} ) {}