Skip to content

Commit 12b3eb8

Browse files
committed
CST-9639: Added and fixed unit tests
1 parent 9f78f6c commit 12b3eb8

5 files changed

Lines changed: 178 additions & 53 deletions

File tree

src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
</div>
55

66
<ng-container *ngFor="let control of form.accessControls; trackBy: trackById">
7-
<div #ngModelGroup="ngModelGroup" ngModelGroup="access-control-item-{{control.id}}" class="access-control-item mt-3">
7+
<div ngModelGroup="access-control-item-{{control.id}}" class="access-control-item mt-3">
88

99
<div class="d-flex flex-column">
1010
<div>
@@ -91,7 +91,7 @@
9191

9292
<button type="button" class="btn btn-outline-danger"
9393
[disabled]="ngForm.disabled || form.accessControls.length === 1"
94-
(click)="removeAccessControlItem(ngModelGroup, control.id)">
94+
(click)="removeAccessControlItem(control.id)">
9595
<i class="fas fa-trash"></i>
9696
</button>
9797
</div>

src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.spec.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,14 @@ describe('AccessControlArrayFormComponent', () => {
4545
});
4646

4747
it('should remove access control item', () => {
48-
component.removeAccessControlItem(0);
49-
expect(component.form.accessControls.length).toEqual(0);
48+
expect(component.form.accessControls.length).toEqual(1);
5049

5150
component.addAccessControlItem();
52-
component.removeAccessControlItem(0);
53-
expect(component.form.accessControls.length).toEqual(0);
51+
expect(component.form.accessControls.length).toEqual(2);
52+
53+
const id = component.form.accessControls[0].id;
54+
component.removeAccessControlItem(id);
55+
expect(component.form.accessControls.length).toEqual(1);
5456
});
5557

5658
it('should reset form value', () => {
@@ -69,7 +71,12 @@ describe('AccessControlArrayFormComponent', () => {
6971

7072

7173
it('should display a select dropdown with options', () => {
72-
const selectElement: DebugElement = fixture.debugElement.query(By.css('select#accesscontroloption-0'));
74+
component.enable();
75+
fixture.detectChanges();
76+
77+
const id = component.form.accessControls[0].id;
78+
79+
const selectElement: DebugElement = fixture.debugElement.query(By.css(`select#accesscontroloption-${id}`));
7380
expect(selectElement).toBeTruthy();
7481

7582
const options = selectElement.nativeElement.querySelectorAll('option');
@@ -81,6 +88,9 @@ describe('AccessControlArrayFormComponent', () => {
8188
});
8289

8390
it('should add new access control items when clicking "Add more" button', () => {
91+
component.enable();
92+
fixture.detectChanges();
93+
8494
const addButton: DebugElement = fixture.debugElement.query(By.css(`button#add-btn-${component.type}`));
8595
addButton.nativeElement.click();
8696
fixture.detectChanges();
@@ -90,11 +100,17 @@ describe('AccessControlArrayFormComponent', () => {
90100
});
91101

92102
it('should remove access control items when clicking remove button', () => {
93-
const removeButton: DebugElement = fixture.debugElement.query(By.css('button.btn-outline-danger'));
94-
removeButton.nativeElement.click();
103+
component.enable();
104+
105+
component.addAccessControlItem('test');
106+
107+
fixture.detectChanges();
108+
109+
const removeButton: DebugElement[] = fixture.debugElement.queryAll(By.css('button.btn-outline-danger'));
110+
removeButton[1].nativeElement.click();
95111
fixture.detectChanges();
96112

97113
const accessControlItems = fixture.debugElement.queryAll(By.css('.access-control-item'));
98-
expect(accessControlItems.length).toEqual(0);
114+
expect(accessControlItems.length).toEqual(1);
99115
});
100116
});

src/app/shared/access-control-form-container/access-control-array-form/access-control-array-form.component.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Component, Input, OnInit, ViewChild} from '@angular/core';
2-
import {NgForm, NgModelGroup} from '@angular/forms';
2+
import {NgForm} from '@angular/forms';
33
import {AccessesConditionOption} from '../../../core/config/models/config-accesses-conditions-options.model';
44
import {dateToISOFormat} from '../../date.util';
55

@@ -52,9 +52,7 @@ export class AccessControlArrayFormComponent implements OnInit {
5252
* @param ngModelGroup
5353
* @param index
5454
*/
55-
removeAccessControlItem(ngModelGroup: NgModelGroup, id: number) {
56-
this.ngForm.removeFormGroup(ngModelGroup);
57-
55+
removeAccessControlItem(id: number) {
5856
this.form.accessControls = this.form.accessControls.filter(item => item.id !== id);
5957
}
6058

Lines changed: 149 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,149 @@
1-
//
2-
// describe('AccessControlFormContainerComponent', () => {
3-
// let component: AccessControlFormContainerComponent<any>;
4-
// let fixture: ComponentFixture<AccessControlFormContainerComponent<any>>;
5-
//
6-
// let bulkAccessConfigDataServiceMock: BulkAccessConfigDataService;
7-
//
8-
// beforeEach(async () => {
9-
//
10-
// bulkAccessConfigDataServiceMock = jasmine.createSpyObj('BulkAccessConfigDataService', {
11-
// findByName: jasmine.createSpy('findByName'),
12-
// });
13-
//
14-
//
15-
// await TestBed.configureTestingModule({
16-
// declarations: [ AccessControlFormContainerComponent ],
17-
// imports: [ CommonModule, ReactiveFormsModule, SharedBrowseByModule, TranslateModule, NgbDatepickerModule ],
18-
// providers: [
19-
// { provide: BulkAccessConfigDataService, useValue: bulkAccessConfigDataServiceMock },
20-
// // private bulkAccessControlService: BulkAccessControlService,
21-
// // private selectableListService: SelectableListService,
22-
// // protected modalService: NgbModal,
23-
// // private cdr: ChangeDetectorRef
24-
// ]
25-
// })
26-
// .compileComponents();
27-
// });
28-
//
29-
// beforeEach(() => {
30-
// fixture = TestBed.createComponent(AccessControlFormContainerComponent);
31-
// component = fixture.componentInstance;
32-
// fixture.detectChanges();
33-
// });
34-
//
35-
// it('should create', () => {
36-
// expect(component).toBeTruthy();
37-
// });
38-
// });
1+
import {ComponentFixture, fakeAsync, TestBed} from '@angular/core/testing';
2+
import {NgbDatepickerModule, NgbModal, NgbModalRef} from '@ng-bootstrap/ng-bootstrap';
3+
import {Component} from '@angular/core';
4+
import {of} from 'rxjs';
5+
import {AccessControlFormContainerComponent} from './access-control-form-container.component';
6+
import {BulkAccessControlService} from './bulk-access-control.service';
7+
import {BulkAccessConfigDataService} from '../../core/config/bulk-access-config-data.service';
8+
import {Item} from '../../core/shared/item.model';
9+
import {SelectableListService} from '../object-list/selectable-list/selectable-list.service';
10+
import {createAccessControlInitialFormState} from './access-control-form-container-intial-state';
11+
import {CommonModule} from '@angular/common';
12+
import {SharedBrowseByModule} from '../browse-by/shared-browse-by.module';
13+
import {TranslateModule} from '@ngx-translate/core';
14+
import {FormsModule} from '@angular/forms';
15+
import {UiSwitchModule} from 'ngx-ui-switch';
16+
import {
17+
ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID
18+
} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component';
19+
import {AccessControlFormModule} from './access-control-form.module';
20+
21+
22+
describe('AccessControlFormContainerComponent', () => {
23+
let component: AccessControlFormContainerComponent<any>;
24+
let fixture: ComponentFixture<AccessControlFormContainerComponent<any>>;
25+
26+
27+
// Mock NgbModal
28+
@Component({selector: 'ds-ngb-modal', template: ''})
29+
class MockNgbModalComponent {
30+
}
31+
32+
// Mock dependencies
33+
const mockBulkAccessControlService = {
34+
createPayloadFile: jasmine.createSpy('createPayloadFile').and.returnValue({file: 'mocked-file'}),
35+
executeScript: jasmine.createSpy('executeScript').and.returnValue(of('success')),
36+
};
37+
38+
const mockBulkAccessConfigDataService = {
39+
findByName: jasmine.createSpy('findByName').and.returnValue(of({payload: {options: []}})),
40+
};
41+
42+
const mockSelectableListService = {
43+
getSelectableList: jasmine.createSpy('getSelectableList').and.returnValue(of({selection: []})),
44+
deselectAll: jasmine.createSpy('deselectAll'),
45+
};
46+
47+
const mockNgbModal = {
48+
open: jasmine.createSpy('open').and.returnValue(
49+
{ componentInstance: {}, closed: of({})} as NgbModalRef
50+
)
51+
};
52+
53+
beforeEach(async () => {
54+
await TestBed.configureTestingModule({
55+
declarations: [AccessControlFormContainerComponent, MockNgbModalComponent],
56+
imports: [
57+
CommonModule,
58+
FormsModule,
59+
SharedBrowseByModule,
60+
AccessControlFormModule,
61+
TranslateModule.forRoot(),
62+
NgbDatepickerModule,
63+
UiSwitchModule
64+
],
65+
providers: [
66+
{provide: BulkAccessControlService, useValue: mockBulkAccessControlService},
67+
{provide: BulkAccessConfigDataService, useValue: mockBulkAccessConfigDataService},
68+
{provide: SelectableListService, useValue: mockSelectableListService},
69+
{provide: NgbModal, useValue: mockNgbModal},
70+
],
71+
}).compileComponents();
72+
});
73+
74+
beforeEach(() => {
75+
fixture = TestBed.createComponent(AccessControlFormContainerComponent);
76+
component = fixture.componentInstance;
77+
component.state = createAccessControlInitialFormState();
78+
fixture.detectChanges();
79+
});
80+
81+
it('should create the component', () => {
82+
expect(component).toBeTruthy();
83+
});
84+
85+
it('should reset the form', fakeAsync(() => {
86+
fixture.detectChanges();
87+
const resetSpy = spyOn(component.bitstreamAccessCmp, 'reset');
88+
spyOn(component.itemAccessCmp, 'reset');
89+
90+
component.reset();
91+
92+
expect(resetSpy).toHaveBeenCalled();
93+
expect(component.itemAccessCmp.reset).toHaveBeenCalled();
94+
expect(component.state).toEqual(createAccessControlInitialFormState());
95+
}));
96+
97+
it('should submit the form', () => {
98+
const bitstreamAccess = 'bitstreamAccess';
99+
const itemAccess = 'itemAccess';
100+
component.bitstreamAccessCmp.getValue = jasmine.createSpy('getValue').and.returnValue(bitstreamAccess);
101+
component.itemAccessCmp.getValue = jasmine.createSpy('getValue').and.returnValue(itemAccess);
102+
component.itemRD = {payload: {uuid: 'item-uuid'}} as any;
103+
104+
component.submit();
105+
106+
expect(mockBulkAccessControlService.createPayloadFile).toHaveBeenCalledWith({
107+
bitstreamAccess,
108+
itemAccess,
109+
state: createAccessControlInitialFormState(),
110+
});
111+
expect(mockBulkAccessControlService.executeScript).toHaveBeenCalledWith(['item-uuid'], 'mocked-file');
112+
});
113+
114+
it('should handle the status change for bitstream access', () => {
115+
component.bitstreamAccessCmp.enable = jasmine.createSpy('enable');
116+
component.bitstreamAccessCmp.disable = jasmine.createSpy('disable');
117+
118+
component.handleStatusChange('bitstream', true);
119+
expect(component.bitstreamAccessCmp.enable).toHaveBeenCalled();
120+
121+
component.handleStatusChange('bitstream', false);
122+
expect(component.bitstreamAccessCmp.disable).toHaveBeenCalled();
123+
});
124+
125+
it('should handle the status change for item access', () => {
126+
component.itemAccessCmp.enable = jasmine.createSpy('enable');
127+
component.itemAccessCmp.disable = jasmine.createSpy('disable');
128+
129+
component.handleStatusChange('item', true);
130+
expect(component.itemAccessCmp.enable).toHaveBeenCalled();
131+
132+
component.handleStatusChange('item', false);
133+
expect(component.itemAccessCmp.disable).toHaveBeenCalled();
134+
});
135+
136+
it('should open the select bitstreams modal', () => {
137+
const modalService = TestBed.inject(NgbModal);
138+
139+
component.openSelectBitstreamsModal(new Item());
140+
expect(modalService.open).toHaveBeenCalled();
141+
});
142+
143+
it('should unsubscribe and deselect all on component destroy', () => {
144+
component.ngOnDestroy();
145+
expect(component.selectableListService.deselectAll).toHaveBeenCalledWith(
146+
ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID
147+
);
148+
});
149+
});

src/app/shared/access-control-form-container/access-control-form-container.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export class AccessControlFormContainerComponent<T extends DSpaceObject> impleme
5858
constructor(
5959
private bulkAccessConfigService: BulkAccessConfigDataService,
6060
private bulkAccessControlService: BulkAccessControlService,
61-
private selectableListService: SelectableListService,
61+
public selectableListService: SelectableListService,
6262
protected modalService: NgbModal,
6363
private cdr: ChangeDetectorRef
6464
) {}

0 commit comments

Comments
 (0)