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';
20 let component: ProducersListComponent;
21 let fixture: ComponentFixture<ProducersListComponent>;
23 describe('ProducersListComponent', () => {
25 let loader: HarnessLoader;
27 beforeEach(async(() => {
28 const spy = jasmine.createSpyObj('EIService', ['getProducerIds', 'getProducer', 'getProducerStatus']);
30 TestBed.configureTestingModule({
35 BrowserAnimationsModule,
39 CUSTOM_ELEMENTS_SCHEMA
42 ProducersListComponent
45 { provide: ProducerService, useValue: spy },
51 fixture = TestBed.createComponent(ProducersListComponent);
52 component = fixture.componentInstance;
53 loader = TestbedHarnessEnvironment.loader(fixture);
57 it('should create', () => {
58 expect(component).toBeTruthy();
61 describe('#content', () => {
63 it('should loadProducers', () => {
65 producer_id: 'producer1',
66 producer_types: ['type1', 'type2'],
70 producer_id: 'producer2',
71 producer_types: ['type2', 'type3'],
76 component.loadProducers();
77 const actualProducers: Producer[] = component.producers();
78 expect(actualProducers).toEqual([producer1, producer2]);
81 it('should contain producers table with correct columns', async () => {
84 let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
85 let headerRow = (await producersTable.getHeaderRows())[0];
86 let headers = await headerRow.getCellTextByColumnName();
87 expect(headers).toEqual({ id: 'Producer ID', types: 'Producer types', status: 'Producer status' });
90 it('should set correct dark mode from UIService', () => {
93 expect(component.darkMode).toBeTruthy();
95 const uiService: UiService = TestBed.inject(UiService);
96 uiService.darkModeState.next(false);
97 fixture.detectChanges();
98 expect(component.darkMode).toBeFalsy();
102 describe('#producersTable', () => {
104 const expectedProducer1Row = { id: 'producer1', types: 'type1,type2', status: 'ENABLED' };
106 it('should contain data after initialization', async () => {
108 component.ngOnInit();
109 const expectedProducerRows = [
110 expectedProducer1Row,
111 { id: 'producer2', types: 'type2,type3', status: 'DISABLED' }
113 let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
114 let producerRows = await producersTable.getRows();
115 expect(producerRows.length).toEqual(2);
116 producerRows.forEach(row => {
117 row.getCellTextByColumnName().then(values => {
118 expect(expectedProducerRows).toContain(jasmine.objectContaining(values));
123 it('should display defaults values for non required properties', async () => {
124 let producerServiceSpy = TestBed.inject(ProducerService) as jasmine.SpyObj<ProducerService>;
126 producerServiceSpy.getProducerIds.and.returnValue(of(['producer1']));
127 producerServiceSpy.getProducer.and.returnValues(of({} as ProducerRegistrationInfo));
128 producerServiceSpy.getProducerStatus.and.returnValues(of({} as ProducerStatus));
130 component.ngOnInit();
131 const expectedProducerRow = { id: 'producer1', types: '< No types >', status: '< No status >' };
132 let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
133 let producerRows = await producersTable.getRows();
134 expect(await producerRows[0].getCellTextByColumnName()).toEqual(expectedProducerRow);
137 it('filtering', async () => {
139 component.ngOnInit();
140 let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#producersTable' }));
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);
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);
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);
166 describe('#sorting', () => {
168 it('should verify sort functionality on the table', async () => {
170 const sort = await loader.getHarness(MatSortHarness);
171 let headers = await sort.getSortHeaders({ sortDirection: '' });
172 expect(headers.length).toBe(3);
174 await headers[0].click();
175 expect(await headers[0].isActive()).toBe(true);
176 expect(await headers[0].getSortDirection()).toBe('asc');
178 await headers[0].click();
179 expect(await headers[0].getSortDirection()).toBe('desc');
183 it('should sort table asc and desc by first header', async () => {
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('');
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);
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);
202 it('should not sort when clicking on the filter input field', async () => {
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[];
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]);
220 producerIdFilter.setValue("");
221 for (let i = 0; i < producerRows.length; i++) {
222 producerRows[i].getCellTextByColumnName().then((value) => {
223 unfilteredProducerIds.push(value[0]);
226 expect(unfilteredProducerIds).toBe(producerIds);
228 producerTypesFilter.setValue("");
229 for (let i = 0; i < producerRows.length; i++) {
230 producerRows[i].getCellTextByColumnName().then((value) => {
231 unfilteredProducerTypes.push(value[1]);
234 expect(unfilteredProducerTypes).toBe(producerTypes);
236 producerStatusFilter.setValue("");
237 for (let i = 0; i < producerRows.length; i++) {
238 producerRows[i].getCellTextByColumnName().then((value) => {
239 unfilteredProducerStatuses.push(value[2]);
242 expect(unfilteredProducerStatuses).toBe(producerStatuses);
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
258 let producerStatus2 = {
259 operational_state: OperationalState.DISABLED
262 let producerServiceSpy = TestBed.inject(ProducerService) as jasmine.SpyObj<ProducerService>;
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));