Update license references
[portal/nonrtric-controlpanel.git] / webapp-frontend / src / app / ei-coordinator / producers-list / producers-list.component.spec.ts
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2021-2022 Nordix Foundation
6  * %%
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ========================LICENSE_END===================================
19  */
20
21 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
22 import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
23 import { HarnessLoader } from '@angular/cdk/testing';
24 import { MatTableHarness } from '@angular/material/table/testing';
25 import { MatSortHarness } from '@angular/material/sort/testing';
26 import { ProducersListComponent } from "./producers-list.component";
27 import { ProducerService } from '@services/ei/producer.service';
28 import { Producer, OperationalState, ProducerRegistrationInfo, ProducerStatus } from '@interfaces/producer.types';
29 import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
30 import { ReactiveFormsModule } from '@angular/forms';
31 import { MatIconModule } from '@angular/material/icon';
32 import { MatTableModule } from '@angular/material/table';
33 import { MatInputHarness } from '@angular/material/input/testing';
34 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
35 import { UiService } from '@services/ui/ui.service';
36 import { of } from 'rxjs';
37 import { MatSortModule } from '@angular/material/sort';
38
39 let component: ProducersListComponent;
40 let fixture: ComponentFixture<ProducersListComponent>;
41
42 describe('ProducersListComponent', () => {
43
44   let loader: HarnessLoader;
45
46   beforeEach(async(() => {
47     const spy = jasmine.createSpyObj('EIService', ['getProducerIds', 'getProducer', 'getProducerStatus']);
48
49     TestBed.configureTestingModule({
50       imports: [
51         MatIconModule,
52         MatTableModule,
53         MatSortModule,
54         BrowserAnimationsModule,
55         ReactiveFormsModule
56       ],
57       schemas: [
58         CUSTOM_ELEMENTS_SCHEMA
59       ],
60       declarations: [
61         ProducersListComponent
62       ],
63       providers: [
64         { provide: ProducerService, useValue: spy },
65         UiService,
66       ]
67     })
68       .compileComponents()
69       .then(() => {
70         fixture = TestBed.createComponent(ProducersListComponent);
71         component = fixture.componentInstance;
72         loader = TestbedHarnessEnvironment.loader(fixture);
73       });
74   }));
75
76   it('should create', () => {
77     expect(component).toBeTruthy();
78   });
79
80   describe('#content', () => {
81
82     it('should loadProducers', () => {
83       const producer1 = {
84         producer_id: 'producer1',
85         producer_types: ['type1', 'type2'],
86         status: 'ENABLED'
87       } as Producer;
88       const producer2 = {
89         producer_id: 'producer2',
90         producer_types: ['type2', 'type3'],
91         status: 'DISABLED'
92       } as Producer;
93
94       setServiceSpy();
95
96       component.loadProducers();
97       const actualProducers: Producer[] = component.producers();
98       expect(actualProducers.length).toEqual(2);
99       expect(actualProducers).toEqual([producer1, producer2]);
100     });
101
102     it('should contain producers table with correct columns', async () => {
103       setServiceSpy();
104
105       let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
106       let headerRow = (await producersTable.getHeaderRows())[0];
107       let headers = await headerRow.getCellTextByColumnName();
108       expect(headers).toEqual({ id: 'Producer ID', types: 'Producer types', status: 'Producer status' });
109     });
110
111     it('should set correct dark mode from UIService', () => {
112       setServiceSpy();
113       component.ngOnInit();
114       expect(component.darkMode).toBeTruthy();
115
116       const uiService: UiService = TestBed.inject(UiService);
117       uiService.darkModeState.next(false);
118       fixture.detectChanges();
119       expect(component.darkMode).toBeFalsy();
120     });
121   });
122
123   describe('#producersTable', () => {
124
125     const expectedProducer1Row = { id: 'producer1', types: 'type1,type2', status: 'ENABLED' };
126
127     it('should contain data after initialization', async () => {
128       setServiceSpy();
129       const expectedProducerRows = [
130         expectedProducer1Row,
131         { id: 'producer2', types: 'type2,type3', status: 'DISABLED' }
132       ];
133       let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
134       let producerRows = await producersTable.getRows();
135       expect(producerRows.length).toEqual(2);
136       producerRows.forEach(row => {
137         row.getCellTextByColumnName().then(values => {
138           expect(expectedProducerRows).toContain(jasmine.objectContaining(values));
139         });
140       });
141     });
142
143     it('should display defaults values for non required properties', async () => {
144       let producerServiceSpy = TestBed.inject(ProducerService) as jasmine.SpyObj<ProducerService>;
145
146       producerServiceSpy.getProducerIds.and.returnValue(of(['producer1']));
147       producerServiceSpy.getProducer.and.returnValues(of({} as ProducerRegistrationInfo));
148       producerServiceSpy.getProducerStatus.and.returnValues(of({} as ProducerStatus));
149
150       const expectedProducerRow = { id: 'producer1', types: '< No types >', status: '< No status >' };
151
152       let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
153       let producerRows = await producersTable.getRows();
154       expect(await producerRows[0].getCellTextByColumnName()).toEqual(expectedProducerRow);
155     });
156
157     it('filtering', async () => {
158       setServiceSpy();
159       let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
160
161       let idFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#producerIdFilter' }));
162       await idFilterInput.setValue("1");
163       let producerRows = await producersTable.getRows();
164       expect(producerRows.length).toEqual(1);
165       expect(await producerRows[0].getCellTextByColumnName()).toEqual(expectedProducer1Row);
166
167       idFilterInput.setValue('');
168       let typesFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#producerTypesFilter' }));
169       await typesFilterInput.setValue("1");
170       producerRows = await producersTable.getRows();
171       expect(producerRows.length).toEqual(1);
172       expect(await producerRows[0].getCellTextByColumnName()).toEqual(expectedProducer1Row);
173       await typesFilterInput.setValue("2");
174       producerRows = await producersTable.getRows();
175       expect(producerRows.length).toEqual(2);
176
177       typesFilterInput.setValue('');
178       let statusFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#producerStatusFilter' }));
179       await statusFilterInput.setValue("enabled");
180       producerRows = await producersTable.getRows();
181       expect(producerRows.length).toEqual(1);
182       expect(await producerRows[0].getCellTextByColumnName()).toEqual(expectedProducer1Row);
183     });
184
185     describe('#sorting', () => {
186
187       it('should verify sort functionality on the table', async () => {
188         setServiceSpy();
189         const sort = await loader.getHarness(MatSortHarness);
190         let headers = await sort.getSortHeaders({ sortDirection: '' });
191         expect(headers.length).toBe(3);
192
193         await headers[0].click();
194         expect(await headers[0].isActive()).toBe(true);
195         expect(await headers[0].getSortDirection()).toBe('asc');
196
197         await headers[0].click();
198         expect(await headers[0].getSortDirection()).toBe('desc');
199
200       });
201
202       it('should sort table asc and desc by first header', async () => {
203         setServiceSpy();
204         const sort = await loader.getHarness(MatSortHarness);
205         let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
206         const firstHeader = (await sort.getSortHeaders())[0];
207         expect(await firstHeader.getSortDirection()).toBe('');
208
209         await firstHeader.click();
210         expect(await firstHeader.getSortDirection()).toBe('asc');
211         let prodRows = await producersTable.getRows();
212         prodRows = await producersTable.getRows();
213         expect(await prodRows[0].getCellTextByColumnName()).toEqual(expectedProducer1Row);
214
215         await firstHeader.click();
216         expect(await firstHeader.getSortDirection()).toBe('desc');
217         prodRows = await producersTable.getRows();
218         expect(await prodRows[prodRows.length - 1].getCellTextByColumnName()).toEqual(expectedProducer1Row);
219       });
220
221       it('should not sort when clicking on the filter input field', async () => {
222         setServiceSpy();
223         let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
224         let producerRows = await producersTable.getRows();
225         let producerIdFilter = await loader.getHarness(MatInputHarness.with({ selector: '#producerIdFilter'}));
226         let producerTypesFilter = await loader.getHarness(MatInputHarness.with({ selector: '#producerTypesFilter'}));
227         let producerStatusFilter = await loader.getHarness(MatInputHarness.with({ selector: '#producerStatusFilter'}));
228         let producerIds, producerTypes, producerStatuses: String[];
229         let unfilteredProducerIds, unfilteredProducerTypes, unfilteredProducerStatuses: String[];
230
231         for (let i = 0; i < producerRows.length; i++) {
232           producerRows[i].getCellTextByColumnName().then((value) => {
233             producerIds.push(value[0]);
234             producerTypes.push(value[1]);
235             producerStatuses.push(value[2]);
236           });
237         };
238
239         producerIdFilter.setValue("");
240         for (let i = 0; i < producerRows.length; i++) {
241           producerRows[i].getCellTextByColumnName().then((value) => {
242             unfilteredProducerIds.push(value[0]);
243           });
244         };
245         expect(unfilteredProducerIds).toBe(producerIds);
246
247         producerTypesFilter.setValue("");
248         for (let i = 0; i < producerRows.length; i++) {
249           producerRows[i].getCellTextByColumnName().then((value) => {
250             unfilteredProducerTypes.push(value[1]);
251           });
252         };
253         expect(unfilteredProducerTypes).toBe(producerTypes);
254
255         producerStatusFilter.setValue("");
256         for (let i = 0; i < producerRows.length; i++) {
257           producerRows[i].getCellTextByColumnName().then((value) => {
258             unfilteredProducerStatuses.push(value[2]);
259           });
260         };
261         expect(unfilteredProducerStatuses).toBe(producerStatuses);
262       });
263     });
264   });
265 });
266
267 function setServiceSpy() {
268   let producerRegInfo1 = {
269     supported_info_types: ['type1', 'type2']
270   } as ProducerRegistrationInfo;
271   let producerRegInfo2 = {
272     supported_info_types: ['type2', 'type3']
273   } as ProducerRegistrationInfo;
274   let producerStatus1 = {
275     operational_state: OperationalState.ENABLED
276   } as ProducerStatus;
277   let producerStatus2 = {
278     operational_state: OperationalState.DISABLED
279   } as ProducerStatus;
280
281   let producerServiceSpy = TestBed.inject(ProducerService) as jasmine.SpyObj<ProducerService>;
282
283   producerServiceSpy.getProducerIds.and.returnValue(of(['producer1', 'producer2']));
284   producerServiceSpy.getProducer.and.returnValues(of(producerRegInfo1), of(producerRegInfo2));
285   producerServiceSpy.getProducerStatus.and.returnValues(of(producerStatus1), of(producerStatus2));
286 }
287
288