From cf492a92c84d7e5da1b45cb2b2223bfcbe2cd657 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Mon, 23 Mar 2020 15:54:10 +0100 Subject: [PATCH] 69940: Process detail and overview test cases --- .../process-detail-field.component.spec.ts | 38 +++++ .../detail/process-detail.component.html | 8 +- .../detail/process-detail.component.spec.ts | 67 ++++++++ .../process-overview.component.spec.ts | 157 ++++++++++++++++++ 4 files changed, 266 insertions(+), 4 deletions(-) create mode 100644 src/app/process-page/detail/process-detail-field/process-detail-field.component.spec.ts create mode 100644 src/app/process-page/detail/process-detail.component.spec.ts create mode 100644 src/app/process-page/overview/process-overview.component.spec.ts diff --git a/src/app/process-page/detail/process-detail-field/process-detail-field.component.spec.ts b/src/app/process-page/detail/process-detail-field/process-detail-field.component.spec.ts new file mode 100644 index 0000000000..487adb2ac0 --- /dev/null +++ b/src/app/process-page/detail/process-detail-field/process-detail-field.component.spec.ts @@ -0,0 +1,38 @@ +import { ProcessDetailFieldComponent } from './process-detail-field.component'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { VarDirective } from '../../../shared/utils/var.directive'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; + +describe('ProcessDetailFieldComponent', () => { + let component: ProcessDetailFieldComponent; + let fixture: ComponentFixture; + + let title; + + beforeEach(async(() => { + title = 'fake.title.message'; + + TestBed.configureTestingModule({ + declarations: [ProcessDetailFieldComponent, VarDirective], + imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])], + providers: [ + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProcessDetailFieldComponent); + component = fixture.componentInstance; + component.title = title; + fixture.detectChanges(); + }); + + it('should display the given title', () => { + const header = fixture.debugElement.query(By.css('h4')).nativeElement; + expect(header.textContent).toContain(title); + }); +}); diff --git a/src/app/process-page/detail/process-detail.component.html b/src/app/process-page/detail/process-detail.component.html index 322e076f54..40bc344672 100644 --- a/src/app/process-page/detail/process-detail.component.html +++ b/src/app/process-page/detail/process-detail.component.html @@ -1,19 +1,19 @@

{{'process.page.detail.title' | translate:{ id: process?.processId, name: process?.scriptName } }}

- +
{{ process?.scriptName }}
- +
{{ argument?.name }} {{ argument?.value }}
- + - +
{{'process.page.detail.output.alert' | translate}}
diff --git a/src/app/process-page/detail/process-detail.component.spec.ts b/src/app/process-page/detail/process-detail.component.spec.ts new file mode 100644 index 0000000000..0acdb275de --- /dev/null +++ b/src/app/process-page/detail/process-detail.component.spec.ts @@ -0,0 +1,67 @@ +import { ProcessDetailComponent } from './process-detail.component'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { VarDirective } from '../../shared/utils/var.directive'; +import { TranslateModule } from '@ngx-translate/core'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ProcessDetailFieldComponent } from './process-detail-field/process-detail-field.component'; +import { Process } from '../processes/process.model'; +import { ActivatedRoute } from '@angular/router'; +import { of as observableOf } from 'rxjs'; +import { createSuccessfulRemoteDataObject } from '../../shared/testing/utils'; +import { By } from '@angular/platform-browser'; + +describe('ProcessDetailComponent', () => { + let component: ProcessDetailComponent; + let fixture: ComponentFixture; + + let process: Process; + + function init() { + process = Object.assign(new Process(), { + processId: 1, + scriptName: 'script-name', + parameters: [ + { + name: '-f', + value: 'file.xml' + }, + { + name: '-i', + value: 'identifier' + } + ] + }); + } + + beforeEach(async(() => { + init(); + TestBed.configureTestingModule({ + declarations: [ProcessDetailComponent, ProcessDetailFieldComponent, VarDirective], + imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])], + providers: [ + { provide: ActivatedRoute, useValue: { data: observableOf({ process: createSuccessfulRemoteDataObject(process) }) } } + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProcessDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should display the script\'s name', () => { + const name = fixture.debugElement.query(By.css('#process-name')).nativeElement; + expect(name.textContent).toContain(process.scriptName); + }); + + it('should display the process\'s parameters', () => { + const args = fixture.debugElement.query(By.css('#process-arguments')).nativeElement; + process.parameters.forEach((param) => { + expect(args.textContent).toContain(`${param.name} ${param.value}`) + }); + }); + +}); diff --git a/src/app/process-page/overview/process-overview.component.spec.ts b/src/app/process-page/overview/process-overview.component.spec.ts new file mode 100644 index 0000000000..878fc352f9 --- /dev/null +++ b/src/app/process-page/overview/process-overview.component.spec.ts @@ -0,0 +1,157 @@ +import { ProcessOverviewComponent } from './process-overview.component'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { VarDirective } from '../../shared/utils/var.directive'; +import { TranslateModule } from '@ngx-translate/core'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { ProcessDataService } from '../../core/data/processes/process-data.service'; +import { Process } from '../processes/process.model'; +import { EPersonDataService } from '../../core/eperson/eperson-data.service'; +import { EPerson } from '../../core/eperson/models/eperson.model'; +import { createPaginatedList, createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; +import { By } from '@angular/platform-browser'; +import { ProcessStatus } from '../processes/process-status.model'; + +describe('ProcessOverviewComponent', () => { + let component: ProcessOverviewComponent; + let fixture: ComponentFixture; + + let processService: ProcessDataService; + let ePersonService: EPersonDataService; + + let processes: Process[]; + let ePerson: EPerson; + + function init() { + processes = [ + Object.assign(new Process(), { + processId: 1, + scriptName: 'script-name', + startTime: '2020-03-19T13:20:23.535+0000', + endTime: '2020-03-19T13:27:36.720+0000', + processStatus: ProcessStatus.COMPLETED + }), + Object.assign(new Process(), { + processId: 2, + scriptName: 'script-name', + startTime: '2020-03-20T11:21:23.487+0000', + endTime: '2020-03-20T11:22:36.165+0000', + processStatus: ProcessStatus.FAILED + }), + Object.assign(new Process(), { + processId: 3, + scriptName: 'another-script-name', + startTime: '2020-03-21T20:05:00.784+0000', + endTime: '2020-03-21T20:15:56.126+0000', + processStatus: ProcessStatus.RUNNING + }) + ]; + ePerson = Object.assign(new EPerson(), { + metadata: { + 'eperson.firstname': [ + { + value: 'John', + language: null + } + ], + 'eperson.lastname': [ + { + value: 'Doe', + language: null + } + ] + } + }); + processService = jasmine.createSpyObj('processService', { + findAll: createSuccessfulRemoteDataObject$(createPaginatedList(processes)) + }); + ePersonService = jasmine.createSpyObj('ePersonService', { + findById: createSuccessfulRemoteDataObject$(ePerson) + }); + } + + beforeEach(async(() => { + init(); + TestBed.configureTestingModule({ + declarations: [ProcessOverviewComponent, VarDirective], + imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])], + providers: [ + { provide: ProcessDataService, useValue: processService }, + { provide: EPersonDataService, useValue: ePersonService } + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProcessOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + describe('table structure', () => { + let rowElements; + + beforeEach(() => { + rowElements = fixture.debugElement.queryAll(By.css('tbody tr')); + }); + + it(`should contain 3 rows`, () => { + expect(rowElements.length).toEqual(3); + }); + + it('should display the process IDs in the first column', () => { + rowElements.forEach((rowElement, index) => { + const el = rowElement.query(By.css('td:nth-child(1)')).nativeElement; + expect(el.textContent).toContain(processes[index].processId); + }); + }); + + it('should display the script names in the second column', () => { + rowElements.forEach((rowElement, index) => { + const el = rowElement.query(By.css('td:nth-child(2)')).nativeElement; + expect(el.textContent).toContain(processes[index].scriptName); + }); + }); + + it('should display the eperson\'s name in the third column', () => { + rowElements.forEach((rowElement, index) => { + const el = rowElement.query(By.css('td:nth-child(3)')).nativeElement; + expect(el.textContent).toContain(ePerson.name); + }); + }); + + it('should display the start time in the fourth column', () => { + rowElements.forEach((rowElement, index) => { + const el = rowElement.query(By.css('td:nth-child(4)')).nativeElement; + expect(el.textContent).toContain(processes[index].startTime); + }); + }); + + it('should display the end time in the fifth column', () => { + rowElements.forEach((rowElement, index) => { + const el = rowElement.query(By.css('td:nth-child(5)')).nativeElement; + expect(el.textContent).toContain(processes[index].endTime); + }); + }); + + it('should display the status in the sixth column', () => { + rowElements.forEach((rowElement, index) => { + const el = rowElement.query(By.css('td:nth-child(6)')).nativeElement; + expect(el.textContent).toContain(processes[index].processStatus); + }); + }); + }); + + describe('onPageChange', () => { + const toPage = 2; + + beforeEach(() => { + component.onPageChange(toPage); + }); + + it('should call a new findAll with the corresponding page', () => { + expect(processService.findAll).toHaveBeenCalledWith(jasmine.objectContaining({ currentPage: toPage })); + }); + }); +});