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