From d0f58600bcddcd7bed8079f68df9a8180be928dc Mon Sep 17 00:00:00 2001 From: Vito Date: Fri, 24 Apr 2020 14:27:31 +0100 Subject: [PATCH] =?UTF-8?q?[DW-1669]=20[ADF-5107]-=20Added=20new=20api=20c?= =?UTF-8?q?all=20for=20creating=20and=20starting=20a=20process=20in?= =?UTF-8?q?=E2=80=A6=20(#5602)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [DW-1669] - Added new api call for creating and starting a process instance * [DW-1669] - fixed linting * [DW-1669] - fixed process default issue * [DW-1669] - fixed problem on start process cloud * [DW-1669] - removed check on valid form as it might interact with the correct behaviour * [DW-1669] - added a small delay before pressing start as a debounce time was added and the click on start is too fast * [DW-1669] - added a small delay before pressing start as a debounce time was added and the click on start is too fast * [DW-1669] - removed wrong fdescribe * [DW-1669] - added a small delay before pressing start as a debounce time was added and the click on start is too fast --- .../task-visibility-condition.e2e.ts | 2 + .../start-process-cloud.e2e.ts | 1 + .../start-process-cloud.component.html | 2 +- .../start-process-cloud.component.spec.ts | 146 ++++++++++++++---- .../start-process-cloud.component.ts | 62 ++++++-- .../mock/start-process.component.mock.ts | 12 ++ .../start-process-cloud.service.spec.ts | 35 ++++- .../services/start-process-cloud.service.ts | 29 ++++ .../process-filters.component.spec.ts | 7 +- 9 files changed, 247 insertions(+), 49 deletions(-) diff --git a/e2e/process-services-cloud/form-field/task-visibility-condition.e2e.ts b/e2e/process-services-cloud/form-field/task-visibility-condition.e2e.ts index c53ebc9afa..49ef7e58b1 100644 --- a/e2e/process-services-cloud/form-field/task-visibility-condition.e2e.ts +++ b/e2e/process-services-cloud/form-field/task-visibility-condition.e2e.ts @@ -103,6 +103,7 @@ describe('Task cloud visibility', async () => { await startProcessPage.selectFromProcessDropdown(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.numbervisibilityprocess); await startProcessPage.enterProcessName(processName); + await browser.sleep(400); await startProcessPage.clickStartProcessButton(); await processCloudDemoPage.editProcessFilterCloudComponent().setFilter({ processName }); @@ -134,6 +135,7 @@ describe('Task cloud visibility', async () => { await startProcessPage.clearField(startProcessPage.processNameInput); await startProcessPage.selectFromProcessDropdown(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.booleanvisibilityprocess); await startProcessPage.enterProcessName(processName); + await browser.sleep(400); await startProcessPage.clickStartProcessButton(); await processCloudDemoPage.editProcessFilterCloudComponent().setFilter({ processName }); diff --git a/e2e/process-services-cloud/start-process-cloud.e2e.ts b/e2e/process-services-cloud/start-process-cloud.e2e.ts index 6af594abf8..3249f1bd6e 100644 --- a/e2e/process-services-cloud/start-process-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-process-cloud.e2e.ts @@ -103,6 +103,7 @@ describe('Start Process', () => { await startProcessPage.clearField(startProcessPage.processNameInput); await startProcessPage.enterProcessName(processName); await expect(await startProcessPage.checkStartProcessButtonIsEnabled()).toBe(true); + await browser.sleep(400); await startProcessPage.clickStartProcessButton(); await processCloudDemoPage.processFilterCloudComponent.clickOnProcessFilters(); diff --git a/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.html b/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.html index 5d9318a12b..8019937bea 100755 --- a/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.html +++ b/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.html @@ -18,7 +18,7 @@ [matAutocomplete]="auto" id="processDefinitionName">
- + {{ getProcessDefinitionValue(processDef) }} diff --git a/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.spec.ts index a70ac1c6aa..ad9ebcb704 100755 --- a/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.spec.ts @@ -17,16 +17,21 @@ import { SimpleChange, DebugElement } from '@angular/core'; import { async, ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { setupTestBed } from '@alfresco/adf-core'; +import { setupTestBed, StorageService, LogService, TranslationService, TranslationMock, FormService } from '@alfresco/adf-core'; import { of, throwError } from 'rxjs'; import { StartProcessCloudService } from '../services/start-process-cloud.service'; import { FormCloudService } from '../../../form/services/form-cloud.service'; - import { StartProcessCloudComponent } from './start-process-cloud.component'; -import { ProcessServiceCloudTestingModule } from '../../../testing/process-service-cloud.testing.module'; -import { ProcessCloudModule } from '../../process-cloud.module'; +import { HttpClientModule } from '@angular/common/http'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TranslateModule, TranslateStore } from '@ngx-translate/core'; +import { MatCardModule, MatOptionModule, MatAutocompleteModule, MatIconModule, MatButtonModule, MatFormFieldModule, MatInputModule, MatRippleModule, MatCommonModule } from '@angular/material'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { FormCloudModule } from 'process-services-cloud/src/lib/form/form-cloud.module'; + import { fakeProcessDefinitions, fakeStartForm, fakeStartFormNotValid, - fakeProcessInstance, fakeProcessPayload, fakeNoNameProcessDefinitions, fakeSingleProcessDefinition } from '../mock/start-process.component.mock'; + fakeProcessInstance, fakeNoNameProcessDefinitions, + fakeSingleProcessDefinition, fakeCreatedProcessInstance } from '../mock/start-process.component.mock'; import { By } from '@angular/platform-browser'; describe('StartProcessCloudComponent', () => { @@ -37,6 +42,7 @@ describe('StartProcessCloudComponent', () => { let formCloudService: FormCloudService; let getDefinitionsSpy: jasmine.Spy; let startProcessSpy: jasmine.Spy; + let createProcessSpy: jasmine.Spy; let formDefinitionSpy: jasmine.Spy; const selectOptionByName = (name: string) => { @@ -52,10 +58,37 @@ describe('StartProcessCloudComponent', () => { } }; + function typeValueInto(selector: any, value: string ) { + const inputElement = fixture.debugElement.query(By.css(`${selector}`)); + inputElement.nativeElement.value = value; + inputElement.nativeElement.dispatchEvent(new Event('input')); + } + setupTestBed({ imports: [ - ProcessServiceCloudTestingModule, - ProcessCloudModule + HttpClientModule, + NoopAnimationsModule, + FormsModule, + MatCommonModule, + ReactiveFormsModule, + MatCardModule, + MatIconModule, + MatAutocompleteModule, + MatOptionModule, + MatButtonModule, + MatFormFieldModule, + MatInputModule, + MatRippleModule, + FormCloudModule, + TranslateModule.forChild() + ], + declarations: [StartProcessCloudComponent], + providers: [ + { provide: TranslationService, useClass: TranslationMock }, + FormService, + TranslateStore, + StorageService, + LogService ] }); @@ -66,7 +99,8 @@ describe('StartProcessCloudComponent', () => { component = fixture.componentInstance; getDefinitionsSpy = spyOn(processService, 'getProcessDefinitions').and.returnValue(of(fakeProcessDefinitions)); - startProcessSpy = spyOn(processService, 'startProcess').and.returnValue(of(fakeProcessInstance)); + startProcessSpy = spyOn(processService, 'startCreatedProcess').and.returnValue(of(fakeProcessInstance)); + createProcessSpy = spyOn(processService, 'createProcess').and.returnValue(of(fakeCreatedProcessInstance)); }); afterEach(() => { @@ -76,6 +110,29 @@ describe('StartProcessCloudComponent', () => { describe('start a process without start form', () => { + it('should create a process instance if the selection is valid', fakeAsync(() => { + component.name = ''; + component.processDefinitionName = ''; + fixture.detectChanges(); + + const change = new SimpleChange(null, 'MyApp', true); + component.ngOnChanges({ 'appName': change }); + fixture.detectChanges(); + tick(); + typeValueInto('#processName', 'OLE'); + typeValueInto('#processDefinitionName', 'processwithoutform2'); + fixture.detectChanges(); + fixture.whenStable(); + tick(450); + + const startBtn = fixture.nativeElement.querySelector('#button-start'); + expect(startBtn.disabled).toBe(false); + expect(component.isProcessFormValid()).toBe(true); + expect(createProcessSpy).toHaveBeenCalledWith('MyApp', component.processPayloadCloud); + expect(component.currentCreatedProcess.status).toBe('CREATED'); + expect(component.currentCreatedProcess.startDate).toBeNull(); + })); + it('should be able to start a process with a valid process name and process definition', async(() => { component.name = 'My new process'; component.processDefinitionName = 'processwithoutform2'; @@ -88,21 +145,7 @@ describe('StartProcessCloudComponent', () => { fixture.whenStable().then(() => { const startBtn = fixture.nativeElement.querySelector('#button-start'); expect(startBtn.disabled).toBe(false); - }); - })); - - it('should have start button disabled when name not filled out', async(() => { - component.name = ''; - component.processDefinitionName = 'processwithoutform2'; - fixture.detectChanges(); - - const change = new SimpleChange(null, 'MyApp', true); - component.ngOnChanges({ 'appName': change }); - fixture.detectChanges(); - - fixture.whenStable().then(() => { - const startBtn = fixture.nativeElement.querySelector('#button-start'); - expect(startBtn.disabled).toBe(true); + expect(component.isProcessFormValid()).toBe(true); }); })); @@ -118,6 +161,23 @@ describe('StartProcessCloudComponent', () => { fixture.whenStable().then(() => { const startBtn = fixture.nativeElement.querySelector('#button-start'); expect(startBtn.disabled).toBe(true); + expect(component.isProcessFormValid()).toBe(false); + }); + })); + + it('should have start button disabled when name not filled out', async(() => { + component.name = ''; + component.processDefinitionName = 'processwithoutform2'; + fixture.detectChanges(); + + const change = new SimpleChange(null, 'MyApp', true); + component.ngOnChanges({ 'appName': change }); + fixture.detectChanges(); + + fixture.whenStable().then(() => { + const startBtn = fixture.nativeElement.querySelector('#button-start'); + expect(startBtn.disabled).toBe(true); + expect(component.isProcessFormValid()).toBe(false); }); })); }); @@ -218,6 +278,29 @@ describe('StartProcessCloudComponent', () => { expect(startBtn.disabled).toBe(true); }); })); + + it('should create a process instance if the selection is valid', fakeAsync(() => { + component.values = [{'name': 'firstName', 'value': 'FakeName'}, {'name': 'lastName', 'value': 'FakeLastName'}]; + component.name = 'testFormWithProcess'; + component.processDefinitionName = 'processwithoutform2'; + getDefinitionsSpy.and.returnValue(of(fakeSingleProcessDefinition(component.processDefinitionName))); + fixture.detectChanges(); + formDefinitionSpy = spyOn(formCloudService, 'getForm').and.returnValue(of(fakeStartForm)); + + const change = new SimpleChange(null, 'MyApp', true); + component.ngOnChanges({ 'appName': change }); + fixture.detectChanges(); + fixture.whenStable(); + tick(450); + + const startBtn = fixture.nativeElement.querySelector('#button-start'); + expect(startBtn.disabled).toBe(false); + expect(component.formCloud.isValid).toBe(true); + expect(component.isProcessFormValid()).toBe(true); + expect(createProcessSpy).toHaveBeenCalledWith('MyApp', component.processPayloadCloud); + expect(component.currentCreatedProcess.status).toBe('CREATED'); + expect(component.currentCreatedProcess.startDate).toBeNull(); + })); }); describe('process definitions list', () => { @@ -459,7 +542,7 @@ describe('StartProcessCloudComponent', () => { }); it('should call service to start process if required fields provided', async(() => { - component.processPayloadCloud = fakeProcessPayload; + component.currentCreatedProcess = fakeProcessInstance; component.startProcess(); fixture.whenStable().then(() => { expect(startProcessSpy).toHaveBeenCalled(); @@ -467,10 +550,10 @@ describe('StartProcessCloudComponent', () => { })); it('should call service to start process with the correct parameters', async(() => { - component.processPayloadCloud = fakeProcessPayload; + component.currentCreatedProcess = fakeProcessInstance; component.startProcess(); fixture.whenStable().then(() => { - expect(startProcessSpy).toHaveBeenCalledWith('myApp', fakeProcessPayload); + expect(startProcessSpy).toHaveBeenCalledWith(component.appName, fakeProcessInstance.id); }); })); @@ -479,7 +562,7 @@ describe('StartProcessCloudComponent', () => { inputProcessVariable['name'] = {value: 'Josh'}; component.variables = inputProcessVariable; - component.processPayloadCloud = fakeProcessPayload; + component.currentCreatedProcess = fakeProcessInstance; component.startProcess(); fixture.whenStable().then(() => { @@ -489,7 +572,7 @@ describe('StartProcessCloudComponent', () => { it('should output start event when process started successfully', async(() => { const emitSpy = spyOn(component.success, 'emit'); - component.processPayloadCloud = fakeProcessPayload; + component.currentCreatedProcess = fakeProcessInstance; component.startProcess(); fixture.whenStable().then(() => { expect(emitSpy).toHaveBeenCalledWith(fakeProcessInstance); @@ -500,7 +583,7 @@ describe('StartProcessCloudComponent', () => { const errorSpy = spyOn(component.error, 'emit'); const error = { message: 'My error' }; startProcessSpy = startProcessSpy.and.returnValue(throwError(error)); - component.processPayloadCloud = fakeProcessPayload; + component.currentCreatedProcess = fakeProcessInstance; component.startProcess(); fixture.whenStable().then(() => { expect(errorSpy).toHaveBeenCalledWith(error); @@ -510,6 +593,7 @@ describe('StartProcessCloudComponent', () => { it('should indicate an error to the user if process cannot be started', async(() => { getDefinitionsSpy.and.returnValue(of(fakeProcessDefinitions)); const change = new SimpleChange('myApp', 'myApp1', true); + component.currentCreatedProcess = fakeProcessInstance; component.ngOnChanges({ appName: change }); startProcessSpy = startProcessSpy.and.returnValue(throwError({})); component.startProcess(); @@ -526,7 +610,7 @@ describe('StartProcessCloudComponent', () => { done(); }); - component.processPayloadCloud = fakeProcessPayload; + component.currentCreatedProcess = fakeProcessInstance; component.name = 'NewProcess 1'; component.startProcess(); fixture.detectChanges(); @@ -540,7 +624,7 @@ describe('StartProcessCloudComponent', () => { disposableStart.unsubscribe(); done(); }); - + component.currentCreatedProcess = fakeProcessInstance; component.startProcess(); }); diff --git a/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts b/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts index e0753299c1..251fd289dd 100755 --- a/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts @@ -26,9 +26,9 @@ import { FormControl, Validators, FormGroup, AbstractControl, FormBuilder, Valid import { FormModel, ContentLinkModel } from '@alfresco/adf-core'; import { MatAutocompleteTrigger } from '@angular/material'; import { ProcessPayloadCloud } from '../models/process-payload-cloud.model'; -import { debounceTime, takeUntil } from 'rxjs/operators'; +import { debounceTime, takeUntil, switchMap, filter, distinctUntilChanged } from 'rxjs/operators'; import { ProcessDefinitionCloud } from '../models/process-definition-cloud.model'; -import { Subject } from 'rxjs'; +import { Subject, Observable } from 'rxjs'; import { TaskVariableCloud } from '../../../form/models/task-variable-cloud.model'; @Component({ @@ -100,6 +100,7 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy isLoading = false; isFormCloudLoaded = false; formCloud: FormModel; + currentCreatedProcess: any; protected onDestroy$ = new Subject(); constructor(private startProcessCloudService: StartProcessCloudService, @@ -109,15 +110,32 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy ngOnInit() { this.processForm = this.formBuilder.group({ processInstanceName: new FormControl(this.name, [Validators.required, Validators.maxLength(this.getMaxNameLength()), this.whitespaceValidator]), - processDefinition: new FormControl(this.processDefinitionName, [Validators.required, this.processDefinitionNameValidator()]) + processDefinition: new FormControl('', [Validators.required, this.processDefinitionNameValidator()]) }); this.processDefinition.valueChanges .pipe(debounceTime(300)) .pipe(takeUntil(this.onDestroy$)) .subscribe((processDefinitionName) => { - this.filteredProcesses = this.getProcessDefinitionList(processDefinitionName); - }); + this.selectProcessDefinitionByProcesDefinitionName(processDefinitionName); + }); + + this.processForm.valueChanges + .pipe( + debounceTime(400), + distinctUntilChanged(), + filter(() => this.isProcessSelectionValid()), + switchMap(() => this.generateProcessInstance()) + ).pipe(takeUntil(this.onDestroy$)) + .subscribe((res) => { + this.currentCreatedProcess = res; + }); + + if (this.processDefinitionName) { + this.processDefinition.setValue(this.processDefinitionName); + this.processDefinition.markAsDirty(); + this.processDefinition.markAsTouched(); + } } ngOnChanges(changes: SimpleChanges) { @@ -139,11 +157,28 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy this.formCloud = form; } + private isProcessSelectionValid(): boolean { + return this.processForm.valid && this.isProcessPayloadValid(); + } + private getMaxNameLength(): number { return this.maxNameLength > StartProcessCloudComponent.MAX_NAME_LENGTH ? StartProcessCloudComponent.MAX_NAME_LENGTH : this.maxNameLength; } + private generateProcessInstance(): Observable { + this.buildProcessCloudPayload(); + return this.startProcessCloudService.createProcess(this.appName, this.processPayloadCloud); + } + + private selectProcessDefinitionByProcesDefinitionName(processDefinitionName: string): void { + this.filteredProcesses = this.getProcessDefinitionList(processDefinitionName); + if (this.isProcessFormValid() && + this.filteredProcesses && this.filteredProcesses.length === 1) { + this.setProcessDefinitionOnForm(this.filteredProcesses[0].name); + } + } + setProcessDefinitionOnForm(selectedProcessDefinitionName: string) { this.processDefinitionCurrent = this.filteredProcesses.find( (process: ProcessDefinitionCloud) => process.name === selectedProcessDefinitionName || process.key === selectedProcessDefinitionName ); @@ -210,6 +245,10 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy } } + private isProcessPayloadValid(): boolean { + return !!this.processPayloadCloud.processDefinitionKey; + } + private getProcessDefinition(option: ProcessDefinitionCloud, processDefinition: string): boolean { return (this.isValidName(option.name) && option.name.toLowerCase().includes(processDefinition.toLowerCase())) || (option.key && option.key.toLowerCase().includes(processDefinition.toLowerCase())); @@ -219,9 +258,7 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy return this.processDefinitionList.length === 0; } - startProcess() { - this.isLoading = true; - + buildProcessCloudPayload() { this.processPayloadCloud.name = this.processInstanceName.value; if (this.variables) { this.processPayloadCloud.variables = this.variables; @@ -230,8 +267,14 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy if (this.hasForm()) { this.processPayloadCloud.variables = Object.assign(this.processPayloadCloud.variables, this.formCloud.values); } + } - this.startProcessCloudService.startProcess(this.appName, this.processPayloadCloud).subscribe( + startProcess() { + this.isLoading = true; + + this.buildProcessCloudPayload(); + + this.startProcessCloudService.startCreatedProcess(this.appName, this.currentCreatedProcess.id).subscribe( (res) => { this.success.emit(res); this.isLoading = false; @@ -245,6 +288,7 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy } cancelStartProcess() { + this.currentCreatedProcess = null; this.cancel.emit(); } diff --git a/lib/process-services-cloud/src/lib/process/start-process/mock/start-process.component.mock.ts b/lib/process-services-cloud/src/lib/process/start-process/mock/start-process.component.mock.ts index 0c79992604..bf0d6976c7 100755 --- a/lib/process-services-cloud/src/lib/process/start-process/mock/start-process.component.mock.ts +++ b/lib/process-services-cloud/src/lib/process/start-process/mock/start-process.component.mock.ts @@ -31,6 +31,18 @@ export let fakeProcessInstance = new ProcessInstanceCloud({ processDefinitionKey: 'BasicProcess' }); +export let fakeCreatedProcessInstance = new ProcessInstanceCloud({ + appName: 'simple-app', + appVersion: '', + id: 'd0b30377-dc5a-11e8-ae24-0a58646001fa', + name: 'My Process Name', + startDate: null, + initiator: 'usermock', + status: 'CREATED', + processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa', + processDefinitionKey: 'BasicProcess' +}); + export let fakeProcessDefinitions: ProcessDefinitionCloud[] = [ new ProcessDefinitionCloud({ appName: 'myApp', diff --git a/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.spec.ts b/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.spec.ts index 12368d6812..70ec5eedda 100755 --- a/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.spec.ts +++ b/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.spec.ts @@ -18,7 +18,7 @@ import { TestBed } from '@angular/core/testing'; import { of, throwError } from 'rxjs'; import { - setupTestBed, CoreModule, + setupTestBed, AlfrescoApiService, AppConfigService, LogService, @@ -27,16 +27,15 @@ import { import { StartProcessCloudService } from './start-process-cloud.service'; import { fakeProcessPayload } from '../mock/start-process.component.mock'; import { ProcessInstanceCloud } from '../models/process-instance-cloud.model'; -import { HttpErrorResponse } from '@angular/common/http'; +import { HttpErrorResponse, HttpClientModule } from '@angular/common/http'; import { ProcessDefinitionCloud } from '../models/process-definition-cloud.model'; -import { ProcessCloudModule } from '../../process-cloud.module'; describe('StartProcessCloudService', () => { let service: StartProcessCloudService; setupTestBed({ - imports: [CoreModule.forRoot(), ProcessCloudModule], + imports: [HttpClientModule], providers: [StartProcessCloudService, AlfrescoApiService, AppConfigService, LogService, StorageService] }); @@ -108,4 +107,32 @@ describe('StartProcessCloudService', () => { } ); }); + + it('should be able to create a new process instance without starting it', (done) => { + spyOn(service, 'createProcess').and.returnValue(of({ id: 'fake-id', name: 'fake-name', status: 'CREATED' })); + service.createProcess('appName1', fakeProcessPayload) + .subscribe( + (res: ProcessInstanceCloud) => { + expect(res).toBeDefined(); + expect(res.id).toEqual('fake-id'); + expect(res.name).toEqual('fake-name'); + expect(res.status).toEqual('CREATED'); + done(); + } + ); + }); + + it('should be able to start a created new process instance', (done) => { + spyOn(service, 'startCreatedProcess').and.returnValue(of({ id: 'fake-id', name: 'fake-name', status: 'RUNNING' })); + service.startCreatedProcess('appName1', 'fake-id') + .subscribe( + (res: ProcessInstanceCloud) => { + expect(res).toBeDefined(); + expect(res.id).toEqual('fake-id'); + expect(res.name).toEqual('fake-name'); + expect(res.status).toEqual('RUNNING'); + done(); + } + ); + }); }); diff --git a/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts b/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts index 735b2bcd2b..6e35b39c53 100755 --- a/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts +++ b/lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts @@ -55,6 +55,35 @@ export class StartProcessCloudService extends BaseCloudService { } } + /** + * Create a process based on a process definition, name, form values or variables. + * @param appName name of the Application + * @param payload Details of the process (definition key, name, variables, etc) + * @returns Details of the process instance just created + */ + createProcess(appName: string, payload: ProcessPayloadCloud): Observable { + const url = `${this.getBasePath(appName)}/rb/v1/process-instances/create`; + + return this.post(url, payload).pipe( + map((result: any) => result.entry), + map(processInstance => new ProcessInstanceCloud(processInstance)) + ); + } + + /** + * Starts an already created process using the process instance id. + * @param createdProcessInstanceId process instance id of the process previously created + * @returns Details of the process instance just started + */ + startCreatedProcess(appName: string, createdProcessInstanceId: string): Observable { + const url = `${this.getBasePath(appName)}/rb/v1/process-instances/${createdProcessInstanceId}/start`; + + return this.post(url).pipe( + map((result: any) => result.entry), + map(processInstance => new ProcessInstanceCloud(processInstance.entry)) + ); + } + /** * Starts a process based on a process definition, name, form values or variables. * @param appName name of the Application diff --git a/lib/process-services/src/lib/process-list/components/process-filters.component.spec.ts b/lib/process-services/src/lib/process-list/components/process-filters.component.spec.ts index a9aaafd799..c8c28c2cc1 100644 --- a/lib/process-services/src/lib/process-list/components/process-filters.component.spec.ts +++ b/lib/process-services/src/lib/process-list/components/process-filters.component.spec.ts @@ -69,10 +69,6 @@ describe('ProcessFiltersComponent', () => { }) ]); - mockErrorFilterPromise = Promise.reject({ - error: 'wrong request' - }); - processFilterService = TestBed.get(ProcessFilterService); appsProcessService = TestBed.get(AppsProcessService); }); @@ -153,6 +149,9 @@ describe('ProcessFiltersComponent', () => { }); it('should emit an error with a bad response', (done) => { + mockErrorFilterPromise = Promise.reject({ + error: 'wrong request' + }); spyOn(processFilterService, 'getProcessFilters').and.returnValue(from(mockErrorFilterPromise)); const appId = '1';