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>
<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>
@@ -91,7 +91,7 @@
<button type="button" class="btn btn-outline-danger"
[disabled]="ngForm.disabled || form.accessControls.length === 1"
(click)="removeAccessControlItem(ngModelGroup, control.id)">
(click)="removeAccessControlItem(control.id)">
<i class="fas fa-trash"></i>
</button>
</div>

View File

@@ -45,12 +45,14 @@ describe('AccessControlArrayFormComponent', () => {
});
it('should remove access control item', () => {
component.removeAccessControlItem(0);
expect(component.form.accessControls.length).toEqual(0);
expect(component.form.accessControls.length).toEqual(1);
component.addAccessControlItem();
component.removeAccessControlItem(0);
expect(component.form.accessControls.length).toEqual(0);
expect(component.form.accessControls.length).toEqual(2);
const id = component.form.accessControls[0].id;
component.removeAccessControlItem(id);
expect(component.form.accessControls.length).toEqual(1);
});
it('should reset form value', () => {
@@ -69,7 +71,12 @@ describe('AccessControlArrayFormComponent', () => {
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();
const options = selectElement.nativeElement.querySelectorAll('option');
@@ -81,6 +88,9 @@ describe('AccessControlArrayFormComponent', () => {
});
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}`));
addButton.nativeElement.click();
fixture.detectChanges();
@@ -90,11 +100,17 @@ describe('AccessControlArrayFormComponent', () => {
});
it('should remove access control items when clicking remove button', () => {
const removeButton: DebugElement = fixture.debugElement.query(By.css('button.btn-outline-danger'));
removeButton.nativeElement.click();
component.enable();
component.addAccessControlItem('test');
fixture.detectChanges();
const removeButton: DebugElement[] = fixture.debugElement.queryAll(By.css('button.btn-outline-danger'));
removeButton[1].nativeElement.click();
fixture.detectChanges();
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 {NgForm, NgModelGroup} from '@angular/forms';
import {NgForm} from '@angular/forms';
import {AccessesConditionOption} from '../../../core/config/models/config-accesses-conditions-options.model';
import {dateToISOFormat} from '../../date.util';
@@ -52,9 +52,7 @@ export class AccessControlArrayFormComponent implements OnInit {
* @param ngModelGroup
* @param index
*/
removeAccessControlItem(ngModelGroup: NgModelGroup, id: number) {
this.ngForm.removeFormGroup(ngModelGroup);
removeAccessControlItem(id: number) {
this.form.accessControls = this.form.accessControls.filter(item => item.id !== id);
}

View File

@@ -1,38 +1,149 @@
//
// describe('AccessControlFormContainerComponent', () => {
// let component: AccessControlFormContainerComponent<any>;
// let fixture: ComponentFixture<AccessControlFormContainerComponent<any>>;
//
// let bulkAccessConfigDataServiceMock: BulkAccessConfigDataService;
//
// beforeEach(async () => {
//
// bulkAccessConfigDataServiceMock = jasmine.createSpyObj('BulkAccessConfigDataService', {
// findByName: jasmine.createSpy('findByName'),
// });
//
//
// await TestBed.configureTestingModule({
// declarations: [ AccessControlFormContainerComponent ],
// imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ],
// providers: [
// { provide: BulkAccessConfigDataService, useValue: bulkAccessConfigDataServiceMock },
// // private bulkAccessControlService: BulkAccessControlService,
// // private selectableListService: SelectableListService,
// // protected modalService: NgbModal,
// // private cdr: ChangeDetectorRef
// ]
// })
// .compileComponents();
// });
//
// beforeEach(() => {
// fixture = TestBed.createComponent(AccessControlFormContainerComponent);
// component = fixture.componentInstance;
// fixture.detectChanges();
// });
//
// it('should create', () => {
// expect(component).toBeTruthy();
// });
// });
import {ComponentFixture, fakeAsync, TestBed} from '@angular/core/testing';
import {NgbDatepickerModule, NgbModal, NgbModalRef} from '@ng-bootstrap/ng-bootstrap';
import {Component} from '@angular/core';
import {of} from 'rxjs';
import {AccessControlFormContainerComponent} from './access-control-form-container.component';
import {BulkAccessControlService} from './bulk-access-control.service';
import {BulkAccessConfigDataService} from '../../core/config/bulk-access-config-data.service';
import {Item} from '../../core/shared/item.model';
import {SelectableListService} from '../object-list/selectable-list/selectable-list.service';
import {createAccessControlInitialFormState} from './access-control-form-container-intial-state';
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';
import {UiSwitchModule} from 'ngx-ui-switch';
import {
ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID
} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component';
import {AccessControlFormModule} from './access-control-form.module';
describe('AccessControlFormContainerComponent', () => {
let component: AccessControlFormContainerComponent<any>;
let fixture: ComponentFixture<AccessControlFormContainerComponent<any>>;
// Mock NgbModal
@Component({selector: 'ds-ngb-modal', template: ''})
class MockNgbModalComponent {
}
// Mock dependencies
const mockBulkAccessControlService = {
createPayloadFile: jasmine.createSpy('createPayloadFile').and.returnValue({file: 'mocked-file'}),
executeScript: jasmine.createSpy('executeScript').and.returnValue(of('success')),
};
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(
private bulkAccessConfigService: BulkAccessConfigDataService,
private bulkAccessControlService: BulkAccessControlService,
private selectableListService: SelectableListService,
public selectableListService: SelectableListService,
protected modalService: NgbModal,
private cdr: ChangeDetectorRef
) {}