Include datasource of jobs and producers into component
[portal/nonrtric-controlpanel.git] / webapp-frontend / src / app / ei-coordinator / jobs-list / jobs-list.component.spec.ts
index 24750eb..0e1f9d3 100644 (file)
@@ -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<JobsListComponent>;
+
+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<JobsListComponent>;
   let loader: HarnessLoader;
-  let eiJobComponent: jasmine.SpyObj<JobsListComponent>;
-  let jobDataSourceSpy: jasmine.SpyObj<EIJobDataSource>;
-
-  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<EIService>;
+      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<EIService>;
+        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<EIService>;
+  eiServiceSpy.getProducerIds.and.returnValue(of(['producer1', 'producer2']));
+  eiServiceSpy.getJobsForProducer.and.returnValue(of([job1, job2]));
+}