X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=webapp-frontend%2Fsrc%2Fapp%2Fei-coordinator%2Fjobs-list%2Fjobs-list.component.spec.ts;h=0e1f9d3e2b9499f9943484068f2d3db8b53f3b10;hb=d5e2acb3624c6705f47bed520d1330c0e75f78e4;hp=24750ebeb0bb3748e96bcbcd055f1dfc90399272;hpb=869354bad80ea5db92893ad3017eaf9c421c0731;p=portal%2Fnonrtric-controlpanel.git diff --git a/webapp-frontend/src/app/ei-coordinator/jobs-list/jobs-list.component.spec.ts b/webapp-frontend/src/app/ei-coordinator/jobs-list/jobs-list.component.spec.ts index 24750eb..0e1f9d3 100644 --- a/webapp-frontend/src/app/ei-coordinator/jobs-list/jobs-list.component.spec.ts +++ b/webapp-frontend/src/app/ei-coordinator/jobs-list/jobs-list.component.spec.ts @@ -21,141 +21,244 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { MatInputHarness } from '@angular/material/input/testing'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSortModule } from '@angular/material/sort'; +import { MatSortHarness } from '@angular/material/sort/testing'; +import { MatPaginatorHarness } from '@angular/material/paginator/testing'; import { MatTableModule } from '@angular/material/table'; import { MatTableHarness } from '@angular/material/table/testing'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { of } from 'rxjs/observable/of'; -import { EIJob } from 'src/app/interfaces/ei.types'; -import { UiService } from 'src/app/services/ui/ui.service'; -import { EIJobDataSource } from '../ei-job.datasource'; +import { EIJob } from '../../interfaces/ei.types'; +import { EIService } from '../../services/ei/ei.service'; +import { UiService } from '../../services/ui/ui.service'; import { JobsListComponent } from './jobs-list.component'; +let component: JobsListComponent; +let fixture: ComponentFixture; + +const job1 = { + ei_job_identity: 'job1', + ei_type_identity: 'type1', + owner: 'owner1', + target_uri: 'http://one' +} as EIJob; +const job2 = { + ei_job_identity: 'job2', + ei_type_identity: 'type2', + owner: 'owner2', + target_uri: 'http://two' +} as EIJob; + describe('JobsListComponent', () => { - let component: JobsListComponent; - let fixture: ComponentFixture; let loader: HarnessLoader; - let eiJobComponent: jasmine.SpyObj; - let jobDataSourceSpy: jasmine.SpyObj; - - const job1 = { - ei_job_identity: 'job1', - ei_type_identity: 'type1', - owner: 'owner1', - target_uri: 'http://one' - } as EIJob; - const job2 = { - ei_job_identity: 'job2', - ei_type_identity: 'type2', - owner: 'owner2', - target_uri: 'http://two' - } as EIJob; beforeEach(async(() => { - eiJobComponent = jasmine.createSpyObj('producersListSpy', ['refresh']); - jobDataSourceSpy = jasmine.createSpyObj('EIJobDataSource', ['loadJobs', 'eiJobs', 'eiJobsSubject']); - - jobDataSourceSpy.eiJobsSubject.and.returnValue(of([job1, job2])); + const spy = jasmine.createSpyObj('EIService', ['getProducerIds', 'getJobsForProducer']); TestBed.configureTestingModule({ imports: [ MatTableModule, - ReactiveFormsModule - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA + MatPaginatorModule, + FormsModule, + MatSortModule, + ReactiveFormsModule, + BrowserAnimationsModule, + MatFormFieldModule, + MatInputModule ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], declarations: [JobsListComponent], providers: [ - { provide: EIJobDataSource, useValue: jobDataSourceSpy }, - UiService, - FormBuilder, + { provide: EIService, useValue: spy }, + UiService ] }) - .compileComponents(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(JobsListComponent); + component = fixture.componentInstance; + loader = TestbedHarnessEnvironment.loader(fixture); + }); })); const expectedJob1Row = { id: 'job1', typeId: 'type1', owner: 'owner1', targetUri: 'http://one' }; - beforeEach(() => { - fixture = TestBed.createComponent(JobsListComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - it('should create', () => { expect(component).toBeTruthy(); }); - it('should contain job table with correct columns', async () => { - let producersTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); - let headerRow = (await producersTable.getHeaderRows())[0]; - let headers = await headerRow.getCellTextByColumnName(); + describe('#content', () => { + + it('should loadJobs', () => { + setServiceSpy(); + component.loadJobs(); + const actualJobs: EIJob[] = component.jobs(); + expect(actualJobs.length).toEqual(4); + expect(actualJobs).toEqual([job1, job2, job1, job2]); + }); + + it('should contain job table with correct columns', async () => { + setServiceSpy(); + let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); + let headerRow = (await jobsTable.getHeaderRows())[0]; + let headers = await headerRow.getCellTextByColumnName(); + + expect(headers).toEqual({ id: 'Job ID', typeId: 'Type ID', owner: 'Owner', targetUri: 'Target URI' }); + }); + + it('should set correct dark mode from UIService', () => { + setServiceSpy(); + component.ngOnInit(); + const uiService: UiService = TestBed.inject(UiService); + expect(component.darkMode).toBeTruthy(); - expect(headers).toEqual({ id: 'Job ID', typeId: 'Type ID', owner: 'Owner', targetUri: 'Target URI' }); + uiService.darkModeState.next(false); + fixture.detectChanges(); + expect(component.darkMode).toBeFalsy(); + }); }); - it('should contain data after initialization', async () => { - component.ngOnInit(); - const expectedJobRows = [ - expectedJob1Row, - { id: 'job2', typeId: 'type2', owner: 'owner2', targetUri: 'http://two' } - ]; - let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); - let jobRows = await jobsTable.getRows(); - expect(jobRows.length).toEqual(2); - jobRows.forEach(row => { - row.getCellTextByColumnName().then(values => { - expect(expectedJobRows).toContain(jasmine.objectContaining(values)); + describe('#jobsTable', () => { + + it('should contain data after initialization', async () => { + setServiceSpy(); + component.ngOnInit(); + const expectedJobRows = [ + expectedJob1Row, + { id: 'job2', typeId: 'type2', owner: 'owner2', targetUri: 'http://two' } + ]; + let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); + let jobRows = await jobsTable.getRows(); + expect(jobRows.length).toEqual(4); + jobRows.forEach(row => { + row.getCellTextByColumnName().then(values => { + expect(expectedJobRows).toContain(jasmine.objectContaining(values)); + }); }); }); - }); - it('should display default values for non required properties ', async () => { - const jobMissingProperties = { - ei_job_identity: 'job1', - target_uri: 'http://one' - } as EIJob; - const jobs: EIJob[] = [jobMissingProperties]; - jobDataSourceSpy.eiJobsSubject.and.returnValue(of(jobs)); - component.ngOnInit(); - - const expectedJobRow = { id: 'job1', typeId: '< No type >', owner: '< No owner >', targetUri: 'http://one' }; - let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); - let jobRows = await jobsTable.getRows(); - expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJobRow); - }); + it('should display default values for non required properties ', async () => { + + const jobMissingProperties = { + "ei_job_identity": "job1", + "ei_job_data": { + "jobparam2": "value2_job2", + "jobparam3": "value3_job2", + "jobparam1": "value1_job2" + }, + "target_uri": "http://one" + } as EIJob; + + let eiServiceSpy = TestBed.inject(EIService) as jasmine.SpyObj; + eiServiceSpy.getProducerIds.and.returnValue(of(['producer1'])); + eiServiceSpy.getJobsForProducer.and.returnValue(of([jobMissingProperties])); + + component.ngOnInit(); + const expectedJobRow = { id: 'job1', typeId: '< No type >', owner: '< No owner >', targetUri: 'http://one' }; + let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); + let jobRows = await jobsTable.getRows(); + expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJobRow); + }); + + it('filtering', async () => { + setServiceSpy(); + component.ngOnInit(); + let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); - it('filtering', async () => { - component.ngOnInit(); - let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); - - let idFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobIdFilter' })); - await idFilterInput.setValue("1"); - let jobRows = await jobsTable.getRows(); - expect(jobRows.length).toEqual(1); - expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJob1Row); - - idFilterInput.setValue(''); - let typeIdFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobTypeIdFilter' })); - await typeIdFilterInput.setValue("1"); - jobRows = await jobsTable.getRows(); - expect(jobRows.length).toEqual(1); - - typeIdFilterInput.setValue(''); - let ownerFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobOwnerFilter' })); - await ownerFilterInput.setValue("1"); - jobRows = await jobsTable.getRows(); - expect(jobRows.length).toEqual(1); - expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJob1Row); - - ownerFilterInput.setValue(''); - let targetUriFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobTargetUriFilter' })); - await targetUriFilterInput.setValue("one"); - jobRows = await jobsTable.getRows(); - expect(jobRows.length).toEqual(1); - expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJob1Row); + let idFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobIdFilter' })); + await idFilterInput.setValue("1"); + let jobRows = await jobsTable.getRows(); + expect(jobRows.length).toEqual(2); + expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJob1Row); + + idFilterInput.setValue(''); + let typeIdFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobTypeIdFilter' })); + await typeIdFilterInput.setValue("1"); + jobRows = await jobsTable.getRows(); + expect(jobRows.length).toEqual(2); + + typeIdFilterInput.setValue(''); + let ownerFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobOwnerFilter' })); + await ownerFilterInput.setValue("1"); + jobRows = await jobsTable.getRows(); + expect(jobRows.length).toEqual(2); + expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJob1Row); + + ownerFilterInput.setValue(''); + let targetUriFilterInput = await loader.getHarness(MatInputHarness.with({ selector: '#jobTargetUriFilter' })); + await targetUriFilterInput.setValue("one"); + jobRows = await jobsTable.getRows(); + expect(jobRows.length).toEqual(2); + expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJob1Row); + }); + + describe('#sorting', () => { + + it('should verify sort functionality on the table', async () => { + setServiceSpy(); + const sort = await loader.getHarness(MatSortHarness); + let headers = await sort.getSortHeaders({ sortDirection: '' }); + expect(headers.length).toBe(4); + + await headers[0].click(); + expect(await headers[0].isActive()).toBe(true); + expect(await headers[0].getSortDirection()).toBe('asc'); + + await headers[0].click(); + expect(await headers[0].getSortDirection()).toBe('desc'); + + }); + + it('should sort table asc and desc by first header', async () => { + setServiceSpy(); + const sort = await loader.getHarness(MatSortHarness); + let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); + const firstHeader = (await sort.getSortHeaders())[0]; + expect(await firstHeader.getSortDirection()).toBe(''); + + await firstHeader.click(); + expect(await firstHeader.getSortDirection()).toBe('asc'); + let jobRows = await jobsTable.getRows(); + jobRows = await jobsTable.getRows(); + expect(await jobRows[0].getCellTextByColumnName()).toEqual(expectedJob1Row); + + await firstHeader.click(); + expect(await firstHeader.getSortDirection()).toBe('desc'); + jobRows = await jobsTable.getRows(); + expect(await jobRows[jobRows.length - 1].getCellTextByColumnName()).toEqual(expectedJob1Row); + }); + }); + + describe('#paging', () => { + it('should work properly on the table', async () => { + let eiServiceSpy = TestBed.inject(EIService) as jasmine.SpyObj; + eiServiceSpy.getProducerIds.and.returnValue(of(['producer1', 'producer2'])); + eiServiceSpy.getJobsForProducer.and.returnValue(of([job1, job2, job1])); + + const paging = await loader.getHarness(MatPaginatorHarness); + await paging.setPageSize(5); + + let jobsTable = await loader.getHarness(MatTableHarness.with({ selector: '#jobsTable' })); + let jobRows = await jobsTable.getRows(); + expect(jobRows.length).toEqual(5); + + await paging.goToNextPage(); + jobRows = await jobsTable.getRows(); + expect(jobRows.length).toEqual(1); + expect(await jobRows[jobRows.length - 1].getCellTextByColumnName()).toEqual(expectedJob1Row); + }); + }); }); }); + +function setServiceSpy() { + let eiServiceSpy = TestBed.inject(EIService) as jasmine.SpyObj; + eiServiceSpy.getProducerIds.and.returnValue(of(['producer1', 'producer2'])); + eiServiceSpy.getJobsForProducer.and.returnValue(of([job1, job2])); +}