2 * ========================LICENSE_START=================================
5 * Copyright (C) 2021-2022 Nordix Foundation
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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===================================
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';
39 let component: ProducersListComponent;
40 let fixture: ComponentFixture<ProducersListComponent>;
42 describe('ProducersListComponent', () => {
44 let loader: HarnessLoader;
46 beforeEach(async(() => {
47 const spy = jasmine.createSpyObj('EIService', ['getProducerIds', 'getProducer', 'getProducerStatus']);
49 TestBed.configureTestingModule({
54 BrowserAnimationsModule,
58 CUSTOM_ELEMENTS_SCHEMA
61 ProducersListComponent
64 { provide: ProducerService, useValue: spy },
70 fixture = TestBed.createComponent(ProducersListComponent);
71 component = fixture.componentInstance;
72 loader = TestbedHarnessEnvironment.loader(fixture);
76 it('should create', () => {
77 expect(component).toBeTruthy();
80 describe('#content', () => {
82 it('should loadProducers', () => {
84 producer_id: 'producer1',
85 producer_types: ['type1', 'type2'],
89 producer_id: 'producer2',
90 producer_types: ['type2', 'type3'],
96 component.loadProducers();
97 const actualProducers: Producer[] = component.producers();
98 expect(actualProducers.length).toEqual(2);
99 expect(actualProducers).toEqual([producer1, producer2]);
102 it('should contain producers table with correct columns', async () => {
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' });
111 it('should set correct dark mode from UIService', () => {
113 component.ngOnInit();
114 expect(component.darkMode).toBeTruthy();
116 const uiService: UiService = TestBed.inject(UiService);
117 uiService.darkModeState.next(false);
118 fixture.detectChanges();
119 expect(component.darkMode).toBeFalsy();
123 describe('#producersTable', () => {
125 const expectedProducer1Row = { id: 'producer1', types: 'type1,type2', status: 'ENABLED' };
127 it('should contain data after initialization', async () => {
129 const expectedProducerRows = [
130 expectedProducer1Row,
131 { id: 'producer2', types: 'type2,type3', status: 'DISABLED' }
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));
143 it('should display defaults values for non required properties', async () => {
144 let producerServiceSpy = TestBed.inject(ProducerService) as jasmine.SpyObj<ProducerService>;
146 producerServiceSpy.getProducerIds.and.returnValue(of(['producer1']));
147 producerServiceSpy.getProducer.and.returnValues(of({} as ProducerRegistrationInfo));
148 producerServiceSpy.getProducerStatus.and.returnValues(of({} as ProducerStatus));
150 const expectedProducerRow = { id: 'producer1', types: '< No types >', status: '< No status >' };
152 let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
153 let producerRows = await producersTable.getRows();
154 expect(await producerRows[0].getCellTextByColumnName()).toEqual(expectedProducerRow);
157 it('filtering', async () => {
159 let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
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);
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);
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);
185 describe('#sorting', () => {
187 it('should verify sort functionality on the table', async () => {
189 const sort = await loader.getHarness(MatSortHarness);
190 let headers = await sort.getSortHeaders({ sortDirection: '' });
191 expect(headers.length).toBe(3);
193 await headers[0].click();
194 expect(await headers[0].isActive()).toBe(true);
195 expect(await headers[0].getSortDirection()).toBe('asc');
197 await headers[0].click();
198 expect(await headers[0].getSortDirection()).toBe('desc');
202 it('should sort table asc and desc by first header', async () => {
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('');
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);
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);
221 it('should not sort when clicking on the filter input field', async () => {
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[];
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]);
239 producerIdFilter.setValue("");
240 for (let i = 0; i < producerRows.length; i++) {
241 producerRows[i].getCellTextByColumnName().then((value) => {
242 unfilteredProducerIds.push(value[0]);
245 expect(unfilteredProducerIds).toBe(producerIds);
247 producerTypesFilter.setValue("");
248 for (let i = 0; i < producerRows.length; i++) {
249 producerRows[i].getCellTextByColumnName().then((value) => {
250 unfilteredProducerTypes.push(value[1]);
253 expect(unfilteredProducerTypes).toBe(producerTypes);
255 producerStatusFilter.setValue("");
256 for (let i = 0; i < producerRows.length; i++) {
257 producerRows[i].getCellTextByColumnName().then((value) => {
258 unfilteredProducerStatuses.push(value[2]);
261 expect(unfilteredProducerStatuses).toBe(producerStatuses);
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
277 let producerStatus2 = {
278 operational_state: OperationalState.DISABLED
281 let producerServiceSpy = TestBed.inject(ProducerService) as jasmine.SpyObj<ProducerService>;
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));