From 4bee113e363a5769fb140f3215aadac382011214 Mon Sep 17 00:00:00 2001 From: Vito Date: Fri, 7 Apr 2017 07:43:47 -0700 Subject: [PATCH] #1426 - Checklist task delete action (#1812) * #1426 - added remove checklist feature on task details * #1426 - Improved test for tasklist service * 426 - added component test for deleting a checklist --- .../activiti/activiti-demo.component.html | 3 +- .../activiti/activiti-demo.component.ts | 4 + .../src/assets/tasklist-service.mock.ts | 226 ++++ .../activiti-checklist.component.html | 6 +- .../activiti-checklist.component.spec.ts | 36 + .../activiti-checklist.component.ts | 14 + .../activiti-task-details.component.html | 3 +- .../activiti-task-details.component.ts | 7 + .../activiti-tasklist.service.spec.ts | 1117 ++++++++--------- .../src/services/activiti-tasklist.service.ts | 13 + 10 files changed, 840 insertions(+), 589 deletions(-) create mode 100644 ng2-components/ng2-activiti-tasklist/src/assets/tasklist-service.mock.ts diff --git a/demo-shell-ng2/app/components/activiti/activiti-demo.component.html b/demo-shell-ng2/app/components/activiti/activiti-demo.component.html index 46e3349d22..a5a3a62348 100644 --- a/demo-shell-ng2/app/components/activiti/activiti-demo.component.html +++ b/demo-shell-ng2/app/components/activiti/activiti-demo.component.html @@ -61,7 +61,8 @@ [taskId]="currentTaskId" (formCompleted)="onFormCompleted($event)" (formContentClicked)="onFormContentClick($event)" - (taskCreated)="onTaskCreated($event)"> + (taskCreated)="onTaskCreated($event)" + (taskDeleted)="onTaskDeleted($event)"> diff --git a/demo-shell-ng2/app/components/activiti/activiti-demo.component.ts b/demo-shell-ng2/app/components/activiti/activiti-demo.component.ts index 147ef8ee6a..e74a6390d2 100644 --- a/demo-shell-ng2/app/components/activiti/activiti-demo.component.ts +++ b/demo-shell-ng2/app/components/activiti/activiti-demo.component.ts @@ -264,6 +264,10 @@ export class ActivitiDemoComponent implements AfterViewInit { this.taskList.reload(); } + onTaskDeleted(data: any) { + this.taskList.reload(); + } + ngAfterViewInit() { // workaround for MDL issues with dynamic components if (componentHandler) { diff --git a/ng2-components/ng2-activiti-tasklist/src/assets/tasklist-service.mock.ts b/ng2-components/ng2-activiti-tasklist/src/assets/tasklist-service.mock.ts new file mode 100644 index 0000000000..810bfd5e47 --- /dev/null +++ b/ng2-components/ng2-activiti-tasklist/src/assets/tasklist-service.mock.ts @@ -0,0 +1,226 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + FilterRepresentationModel, + AppDefinitionRepresentationModel +} from '../models/filter.model'; + +export var fakeFilters = { + size: 2, total: 2, start: 0, + data: [ + new AppDefinitionRepresentationModel( + { + id: '1', name: 'FakeInvolvedTasks', recent: false, icon: 'glyphicon-align-left', + filter: { sort: 'created-desc', name: '', state: 'open', assignment: 'fake-involved' } + } + ), + { + id: '2', name: 'FakeMyTasks', recent: false, icon: 'glyphicon-align-left', + filter: { sort: 'created-desc', name: '', state: 'open', assignment: 'fake-assignee' } + } + ] +}; + +export var fakeAppFilter = { + size: 1, total: 1, start: 0, + data: [ + { + id: 1, name: 'FakeInvolvedTasks', recent: false, icon: 'glyphicon-align-left', + filter: { sort: 'created-desc', name: '', state: 'open', assignment: 'fake-involved' } + } + ] +}; + +export var fakeApps = { + size: 2, total: 2, start: 0, + data: [ + { + id: 1, defaultAppId: null, name: 'Sales-Fakes-App', description: 'desc-fake1', modelId: 22, + theme: 'theme-1-fake', icon: 'glyphicon-asterisk', 'deploymentId': '111', 'tenantId': null + }, + { + id: 2, defaultAppId: null, name: 'health-care-Fake', description: 'desc-fake2', modelId: 33, + theme: 'theme-2-fake', icon: 'glyphicon-asterisk', 'deploymentId': '444', 'tenantId': null + } + ] +}; + +export var fakeFilter = { + sort: 'created-desc', text: '', state: 'open', assignment: 'fake-assignee' +}; + +export var fakeFilterWithProcessDefinitionKey = { + sort: 'created-desc', text: '', state: 'open', assignment: 'fake-assignee', processDefinitionKey: '1' +}; + +export var fakeUser = { id: 1, email: 'fake-email@dom.com', firstName: 'firstName', lastName: 'lastName' }; + +export var fakeTaskList = { + size: 1, total: 1, start: 0, + data: [ + { + id: '1', name: 'FakeNameTask', description: null, category: null, + assignee: fakeUser, + created: '2016-07-15T11:19:17.440+0000' + } + ] +}; + +export var fakeTaskListDifferentProcessDefinitionKey = { + size: 1, total: 1, start: 0, + data: [ + { + id: '1', name: 'FakeNameTask', description: null, category: null, + assignee: fakeUser, + processDefinitionKey: '1', + created: '2016-07-15T11:19:17.440+0000' + }, + { + id: '2', name: 'FakeNameTask2', description: null, category: null, + assignee: fakeUser, + processDefinitionKey: '2', + created: '2016-07-15T11:19:17.440+0000' + } + ] +}; + +export var secondFakeTaskList = { + size: 1, total: 1, start: 0, + data: [ + { + id: '200', name: 'FakeNameTask', description: null, category: null, + assignee: fakeUser, + created: '2016-07-15T11:19:17.440+0000' + } + ] +}; + +export var fakeErrorTaskList = { + error: 'wrong request' +}; + +export var fakeTaskDetails = { id: '999', name: 'fake-task-name', formKey: '99', assignee: fakeUser }; + +export var fakeTasksComment = { + size: 2, total: 2, start: 0, + data: [ + { + id: 1, message: 'fake-message-1', created: '', createdBy: fakeUser + }, + { + id: 2, message: 'fake-message-2', created: '', createdBy: fakeUser + } + ] +}; + +export var fakeTasksChecklist = { + size: 1, total: 1, start: 0, + data: [ + { + id: 1, name: 'FakeCheckTask1', description: null, category: null, + assignee: fakeUser, + created: '2016-07-15T11:19:17.440+0000' + }, + { + id: 2, name: 'FakeCheckTask2', description: null, category: null, + assignee: fakeUser, + created: '2016-07-15T11:19:17.440+0000' + } + ] +}; + +export var fakeRepresentationFilter1: FilterRepresentationModel = new FilterRepresentationModel({ + appId: 1, + name: 'CONTAIN FILTER', + recent: true, + icon: 'glyphicon-align-left', + filter: { + processDefinitionId: null, + processDefinitionKey: null, + name: null, + state: 'open', + sort: 'created-desc', + assignment: 'involved', + dueAfter: null, + dueBefore: null + } +}); + +export var fakeRepresentationFilter2: FilterRepresentationModel = new FilterRepresentationModel({ + appId: 2, + name: 'NO TASK FILTER', + recent: false, + icon: 'glyphicon-inbox', + filter: { + processDefinitionId: null, + processDefinitionKey: null, + name: null, + state: 'open', + sort: 'created-desc', + assignment: 'assignee', + dueAfter: null, + dueBefore: null + } +}); + +export var fakeAppPromise = new Promise(function (resolve, reject) { + resolve(fakeAppFilter); +}); + +export var fakeFormList = { + size: 2, + total: 2, + start: 0, + data: [{ + id: 1, + name: 'form with all widgets', + description: '', + createdBy: 2, + createdByFullName: 'Admin Admin', + lastUpdatedBy: 2, + lastUpdatedByFullName: 'Admin Admin', + lastUpdated: 1491400951205, + latestVersion: true, + version: 4, + comment: null, + stencilSet: null, + referenceId: null, + modelType: 2, + favorite: null, + permission: 'write', + tenantId: null + }, { + id: 2, + name: 'uppy', + description: '', + createdBy: 2, + createdByFullName: 'Admin Admin', + lastUpdatedBy: 2, + lastUpdatedByFullName: 'Admin Admin', + lastUpdated: 1490951054477, + latestVersion: true, + version: 2, + comment: null, + stencilSet: null, + referenceId: null, + modelType: 2, + favorite: null, + permission: 'write', + tenantId: null + }] +}; diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-checklist.component.html b/ng2-components/ng2-activiti-tasklist/src/components/activiti-checklist.component.html index 1f74274e2b..108de506ea 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-checklist.component.html +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-checklist.component.html @@ -7,9 +7,9 @@ diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts index 88b0b24d7a..c926163d75 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts @@ -96,6 +96,9 @@ export class ActivitiTaskDetails implements OnInit, OnChanges { @Output() taskCreated: EventEmitter = new EventEmitter(); + @Output() + taskDeleted: EventEmitter = new EventEmitter(); + @Output() onError: EventEmitter = new EventEmitter(); @@ -258,6 +261,10 @@ export class ActivitiTaskDetails implements OnInit, OnChanges { this.taskCreated.emit(task); } + onChecklistTaskDeleted(taskId: string) { + this.taskDeleted.emit(taskId); + } + onFormError(error: any) { this.errorDialog.nativeElement.showModal(); this.onError.emit(error); diff --git a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts index cc15443832..ae979abe6f 100644 --- a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts +++ b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts @@ -15,173 +15,65 @@ * limitations under the License. */ -import { TestBed, async } from '@angular/core/testing'; -import { CoreModule } from 'ng2-alfresco-core'; +import { ReflectiveInjector } from '@angular/core'; +import { async } from '@angular/core/testing'; +import { + AlfrescoAuthenticationService, + AlfrescoSettingsService, + AlfrescoApiService, + StorageService, + LogService +} from 'ng2-alfresco-core'; import { ActivitiTaskListService } from './activiti-tasklist.service'; import { TaskDetailsModel } from '../models/task-details.model'; import { FilterRepresentationModel, - AppDefinitionRepresentationModel, TaskQueryRequestRepresentationModel } from '../models/filter.model'; import { Comment } from '../models/comment.model'; +import { + fakeFilters, + fakeAppPromise, + fakeAppFilter, + fakeFilter, + fakeTaskList, + fakeErrorTaskList, + fakeTasksComment, + fakeTasksChecklist, + fakeTaskDetails, + fakeUser, + fakeApps, + fakeRepresentationFilter1, + secondFakeTaskList, + fakeRepresentationFilter2, + fakeFormList, + fakeTaskListDifferentProcessDefinitionKey, + fakeFilterWithProcessDefinitionKey +} from '../assets/tasklist-service.mock'; declare let jasmine: any; -describe('ActivitiTaskListService', () => { - - let fakeFilters = { - size: 2, total: 2, start: 0, - data: [ - new AppDefinitionRepresentationModel( - { - id: '1', name: 'FakeInvolvedTasks', recent: false, icon: 'glyphicon-align-left', - filter: { sort: 'created-desc', name: '', state: 'open', assignment: 'fake-involved' } - } - ), - { - id: '2', name: 'FakeMyTasks', recent: false, icon: 'glyphicon-align-left', - filter: { sort: 'created-desc', name: '', state: 'open', assignment: 'fake-assignee' } - } - ] - }; - - let fakeAppFilter = { - size: 1, total: 1, start: 0, - data: [ - { - id: 1, name: 'FakeInvolvedTasks', recent: false, icon: 'glyphicon-align-left', - filter: { sort: 'created-desc', name: '', state: 'open', assignment: 'fake-involved' } - } - ] - }; - - let fakeApps = { - size: 2, total: 2, start: 0, - data: [ - { - id: 1, defaultAppId: null, name: 'Sales-Fakes-App', description: 'desc-fake1', modelId: 22, - theme: 'theme-1-fake', icon: 'glyphicon-asterisk', 'deploymentId': '111', 'tenantId': null - }, - { - id: 2, defaultAppId: null, name: 'health-care-Fake', description: 'desc-fake2', modelId: 33, - theme: 'theme-2-fake', icon: 'glyphicon-asterisk', 'deploymentId': '444', 'tenantId': null - } - ] - }; - - let fakeFilter = { - sort: 'created-desc', text: '', state: 'open', assignment: 'fake-assignee' - }; - - let fakeUser = { id: 1, email: 'fake-email@dom.com', firstName: 'firstName', lastName: 'lastName' }; - - let fakeTaskList = { - size: 1, total: 1, start: 0, - data: [ - { - id: '1', name: 'FakeNameTask', description: null, category: null, - assignee: fakeUser, - created: '2016-07-15T11:19:17.440+0000' - } - ] - }; - - let secondFakeTaskList = { - size: 1, total: 1, start: 0, - data: [ - { - id: '200', name: 'FakeNameTask', description: null, category: null, - assignee: fakeUser, - created: '2016-07-15T11:19:17.440+0000' - } - ] - }; - - let fakeErrorTaskList = { - error: 'wrong request' - }; - - let fakeTaskDetails = { id: '999', name: 'fake-task-name', formKey: '99', assignee: fakeUser }; - - let fakeTasksComment = { - size: 2, total: 2, start: 0, - data: [ - { - id: 1, message: 'fake-message-1', created: '', createdBy: fakeUser - }, - { - id: 2, message: 'fake-message-2', created: '', createdBy: fakeUser - } - ] - }; - - let fakeTasksChecklist = { - size: 1, total: 1, start: 0, - data: [ - { - id: 1, name: 'FakeCheckTask1', description: null, category: null, - assignee: fakeUser, - created: '2016-07-15T11:19:17.440+0000' - }, - { - id: 2, name: 'FakeCheckTask2', description: null, category: null, - assignee: fakeUser, - created: '2016-07-15T11:19:17.440+0000' - } - ] - }; - - let fakeRepresentationFilter1: FilterRepresentationModel = new FilterRepresentationModel({ - appId: 1, - name: 'CONTAIN FILTER', - recent: true, - icon: 'glyphicon-align-left', - filter: { - processDefinitionId: null, - processDefinitionKey: null, - name: null, - state: 'open', - sort: 'created-desc', - assignment: 'involved', - dueAfter: null, - dueBefore: null - } - }); - - let fakeRepresentationFilter2: FilterRepresentationModel = new FilterRepresentationModel({ - appId: 2, - name: 'NO TASK FILTER', - recent: false, - icon: 'glyphicon-inbox', - filter: { - processDefinitionId: null, - processDefinitionKey: null, - name: null, - state: 'open', - sort: 'created-desc', - assignment: 'assignee', - dueAfter: null, - dueBefore: null - } - }); - - let fakeAppPromise = new Promise(function (resolve, reject) { - resolve(fakeAppFilter); - }); +describe('Activiti TaskList Service', () => { let service: ActivitiTaskListService; + let injector; + + beforeEach(() => { + injector = ReflectiveInjector.resolveAndCreate([ + AlfrescoSettingsService, + AlfrescoApiService, + AlfrescoAuthenticationService, + ActivitiTaskListService, + StorageService, + LogService + ]); + }); + + beforeEach(() => { + service = injector.get(ActivitiTaskListService); + }); beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - CoreModule.forRoot() - ], - providers: [ - ActivitiTaskListService - ] - }); - service = TestBed.get(ActivitiTaskListService); jasmine.Ajax.install(); }); @@ -189,461 +81,518 @@ describe('ActivitiTaskListService', () => { jasmine.Ajax.uninstall(); }); - it('should return the task list filters', (done) => { - service.getTaskListFilters().subscribe( - (res) => { - expect(res).toBeDefined(); - expect(res.length).toEqual(2); - expect(res[0].name).toEqual('FakeInvolvedTasks'); - expect(res[1].name).toEqual('FakeMyTasks'); - done(); - } - ); + describe('Content tests', () => { - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeFilters) - }); - }); + it('should return the task list filters', (done) => { + service.getTaskListFilters().subscribe( + (res) => { + expect(res).toBeDefined(); + expect(res.length).toEqual(2); + expect(res[0].name).toEqual('FakeInvolvedTasks'); + expect(res[1].name).toEqual('FakeMyTasks'); + done(); + } + ); - it('should call the api withthe appId', (done) => { - spyOn(service, 'callApiTaskFilters').and.returnValue((fakeAppPromise)); - - let appId = '1'; - service.getTaskListFilters(appId).subscribe( - (res) => { - expect(service.callApiTaskFilters).toHaveBeenCalledWith(appId); - done(); - } - ); - }); - - it('should return the app filter by id', (done) => { - let appId = '1'; - service.getTaskListFilters(appId).subscribe( - (res) => { - expect(res).toBeDefined(); - expect(res.length).toEqual(1); - expect(res[0].name).toEqual('FakeInvolvedTasks'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeAppFilter) - }); - }); - - it('should return the task list filtered', (done) => { - service.getTasks(fakeFilter).subscribe( - res => { - expect(res).toBeDefined(); - expect(res.length).toEqual(1); - expect(res[0].name).toEqual('FakeNameTask'); - expect(res[0].assignee.email).toEqual('fake-email@dom.com'); - expect(res[0].assignee.firstName).toEqual('firstName'); - expect(res[0].assignee.lastName).toEqual('lastName'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeTaskList) - }); - }); - - it('should throw an exception when the response is wrong', () => { - service.getTasks(fakeFilter).subscribe( - (res) => { - }, - (err: any) => { - expect(err).toBeDefined(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 404, - contentType: 'application/json', - responseText: JSON.stringify(fakeErrorTaskList) - }); - }); - - it('should return the task details ', (done) => { - service.getTaskDetails('999').subscribe( - (res: TaskDetailsModel) => { - expect(res).toBeDefined(); - expect(res.id).toEqual('999'); - expect(res.name).toEqual('fake-task-name'); - expect(res.formKey).toEqual('99'); - expect(res.assignee).toBeDefined(); - expect(res.assignee.email).toEqual('fake-email@dom.com'); - expect(res.assignee.firstName).toEqual('firstName'); - expect(res.assignee.lastName).toEqual('lastName'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeTaskDetails) - }); - }); - - it('should return the tasks comments ', (done) => { - service.getTaskComments('999').subscribe( - (res: Comment[]) => { - expect(res).toBeDefined(); - expect(res.length).toEqual(2); - expect(res[0].message).toEqual('fake-message-1'); - expect(res[1].message).toEqual('fake-message-2'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeTasksComment) - }); - }); - - it('should return the tasks checklists ', (done) => { - service.getTaskChecklist('999').subscribe( - (res: TaskDetailsModel[]) => { - expect(res).toBeDefined(); - expect(res.length).toEqual(2); - expect(res[0].name).toEqual('FakeCheckTask1'); - expect(res[0].assignee.email).toEqual('fake-email@dom.com'); - expect(res[0].assignee.firstName).toEqual('firstName'); - expect(res[0].assignee.lastName).toEqual('lastName'); - expect(res[1].name).toEqual('FakeCheckTask2'); - expect(res[1].assignee.email).toEqual('fake-email@dom.com'); - expect(res[1].assignee.firstName).toEqual('firstName'); - expect(res[0].assignee.lastName).toEqual('lastName'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeTasksChecklist) - }); - }); - - it('should add a task ', (done) => { - let taskFake = new TaskDetailsModel({ - id: 123, - parentTaskId: 456, - name: 'FakeNameTask', - description: null, - category: null, - assignee: fakeUser, - created: '' + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeFilters) + }); }); - service.addTask(taskFake).subscribe( - (res: TaskDetailsModel) => { - expect(res).toBeDefined(); - expect(res.id).not.toEqual(''); - expect(res.name).toEqual('FakeNameTask'); - expect(res.created).not.toEqual(''); - done(); - } - ); + it('should call the api withthe appId', (done) => { + spyOn(service, 'callApiTaskFilters').and.returnValue((fakeAppPromise)); - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '777', name: 'FakeNameTask', description: null, category: null, - assignee: fakeUser, - created: '2016-07-15T11:19:17.440+0000' - }) - }); - }); - - it('should add a comment task ', (done) => { - service.addTaskComment('999', 'fake-comment-message').subscribe( - (res: Comment) => { - expect(res).toBeDefined(); - expect(res.id).not.toEqual(''); - expect(res.message).toEqual('fake-comment-message'); - expect(res.created).not.toEqual(''); - expect(res.createdBy.email).toEqual('fake-email@dom.com'); - expect(res.createdBy.firstName).toEqual('firstName'); - expect(res.createdBy.lastName).toEqual('lastName'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '111', message: 'fake-comment-message', - createdBy: fakeUser, - created: '2016-07-15T11:19:17.440+0000' - }) - }); - }); - - it('should complete the task ', (done) => { - service.completeTask('999').subscribe( - (res: any) => { - expect(res).toBeDefined(); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({}) - }); - }); - - it('should return the total number of tasks', (done) => { - service.getTotalTasks(fakeFilter).subscribe( - res => { - expect(res).toBeDefined(); - expect(res.size).toEqual(1); - expect(res.total).toEqual(1); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeTaskList) - }); - }); - - it('should return the default filters', (done) => { - service.createDefaultFilters('1234').subscribe( - (res: FilterRepresentationModel []) => { - expect(res).toBeDefined(); - expect(res.length).toEqual(4); - expect(res[0].name).toEqual('Involved Tasks'); - expect(res[1].name).toEqual('My Tasks'); - expect(res[2].name).toEqual('Queued Tasks'); - expect(res[3].name).toEqual('Completed Tasks'); - done(); - } - ); - - jasmine.Ajax.requests.at(0).respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '111', name: 'Involved Tasks', filter: { assignment: 'fake-involved' } - }) + let appId = '1'; + service.getTaskListFilters(appId).subscribe( + (res) => { + expect(service.callApiTaskFilters).toHaveBeenCalledWith(appId); + done(); + } + ); }); - jasmine.Ajax.requests.at(1).respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '222', name: 'My Tasks', filter: { assignment: 'fake-assignee' } - }) + it('should return the app filter by id', (done) => { + let appId = '1'; + service.getTaskListFilters(appId).subscribe( + (res) => { + expect(res).toBeDefined(); + expect(res.length).toEqual(1); + expect(res[0].name).toEqual('FakeInvolvedTasks'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeAppFilter) + }); }); - jasmine.Ajax.requests.at(2).respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '333', name: 'Queued Tasks', filter: { assignment: 'fake-candidate' } - }) + it('should return the task list filtered', (done) => { + service.getTasks(fakeFilter).subscribe( + res => { + expect(res).toBeDefined(); + expect(res.length).toEqual(1); + expect(res[0].name).toEqual('FakeNameTask'); + expect(res[0].assignee.email).toEqual('fake-email@dom.com'); + expect(res[0].assignee.firstName).toEqual('firstName'); + expect(res[0].assignee.lastName).toEqual('lastName'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTaskList) + }); }); - jasmine.Ajax.requests.at(3).respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '444', name: 'Completed Tasks', filter: { assignment: 'fake-involved' } - }) - }); - }); + it('should return the task list filtered by processDefinitionKey', (done) => { + service.getTasks(fakeFilterWithProcessDefinitionKey).subscribe( + res => { + expect(res).toBeDefined(); + expect(res.length).toEqual(1); + expect(res[0].name).toEqual('FakeNameTask'); + expect(res[0].assignee.email).toEqual('fake-email@dom.com'); + expect(res[0].assignee.firstName).toEqual('firstName'); + expect(res[0].assignee.lastName).toEqual('lastName'); + expect(res[0].processDefinitionKey).toEqual('1'); + done(); + } + ); - it('should add a filter ', (done) => { - let filterFake = new FilterRepresentationModel({ - name: 'FakeNameFilter', - assignment: 'fake-assignement' + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTaskListDifferentProcessDefinitionKey) + }); }); - service.addFilter(filterFake).subscribe( - (res: FilterRepresentationModel) => { - expect(res).toBeDefined(); - expect(res.id).not.toEqual(''); - expect(res.name).toEqual('FakeNameFilter'); - expect(res.filter.assignment).toEqual('fake-assignement'); - done(); - } - ); + it('should throw an exception when the response is wrong', () => { + service.getTasks(fakeFilter).subscribe( + (res) => { + }, + (err: any) => { + expect(err).toBeDefined(); + } + ); - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '2233', name: 'FakeNameFilter', filter: { assignment: 'fake-assignement' } - }) - }); - }); - - it('should get the deployed apps ', (done) => { - service.getDeployedApplications().subscribe( - (res: any) => { - expect(res).toBeDefined(); - expect(res.length).toEqual(2); - expect(res[0].name).toEqual('Sales-Fakes-App'); - expect(res[0].description).toEqual('desc-fake1'); - expect(res[0].deploymentId).toEqual('111'); - expect(res[1].name).toEqual('health-care-Fake'); - expect(res[1].description).toEqual('desc-fake2'); - expect(res[1].deploymentId).toEqual('444'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeApps) - }); - }); - - it('should get the filter deployed app ', (done) => { - let name = 'health-care-Fake'; - service.getDeployedApplications(name).subscribe( - (res: any) => { - expect(res).toBeDefined(); - expect(res.name).toEqual('health-care-Fake'); - expect(res.description).toEqual('desc-fake2'); - expect(res.deploymentId).toEqual('444'); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeApps) - }); - }); - - it('should create a new standalone task ', (done) => { - let taskFake = new TaskDetailsModel({ - name: 'FakeNameTask', - description: 'FakeDescription', - category: '3' + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 404, + contentType: 'application/json', + responseText: JSON.stringify(fakeErrorTaskList) + }); }); - service.createNewTask(taskFake).subscribe( - (res: TaskDetailsModel) => { - expect(res).toBeDefined(); - expect(res.id).not.toEqual(''); - expect(res.name).toEqual('FakeNameTask'); - expect(res.description).toEqual('FakeDescription'); - expect(res.category).toEqual('3'); - expect(res.created).not.toEqual(''); - done(); - } - ); + it('should return the task details ', (done) => { + service.getTaskDetails('999').subscribe( + (res: TaskDetailsModel) => { + expect(res).toBeDefined(); + expect(res.id).toEqual('999'); + expect(res.name).toEqual('fake-task-name'); + expect(res.formKey).toEqual('99'); + expect(res.assignee).toBeDefined(); + expect(res.assignee.email).toEqual('fake-email@dom.com'); + expect(res.assignee.firstName).toEqual('firstName'); + expect(res.assignee.lastName).toEqual('lastName'); + done(); + } + ); - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({ - id: '777', + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTaskDetails) + }); + }); + + it('should return the tasks comments ', (done) => { + service.getTaskComments('999').subscribe( + (res: Comment[]) => { + expect(res).toBeDefined(); + expect(res.length).toEqual(2); + expect(res[0].message).toEqual('fake-message-1'); + expect(res[1].message).toEqual('fake-message-2'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTasksComment) + }); + }); + + it('should return the tasks checklists ', (done) => { + service.getTaskChecklist('999').subscribe( + (res: TaskDetailsModel[]) => { + expect(res).toBeDefined(); + expect(res.length).toEqual(2); + expect(res[0].name).toEqual('FakeCheckTask1'); + expect(res[0].assignee.email).toEqual('fake-email@dom.com'); + expect(res[0].assignee.firstName).toEqual('firstName'); + expect(res[0].assignee.lastName).toEqual('lastName'); + expect(res[1].name).toEqual('FakeCheckTask2'); + expect(res[1].assignee.email).toEqual('fake-email@dom.com'); + expect(res[1].assignee.firstName).toEqual('firstName'); + expect(res[0].assignee.lastName).toEqual('lastName'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTasksChecklist) + }); + }); + + it('should add a task ', (done) => { + let taskFake = new TaskDetailsModel({ + id: 123, + parentTaskId: 456, name: 'FakeNameTask', - description: 'FakeDescription', - category: '3', + description: null, + category: null, assignee: fakeUser, - created: '2016-07-15T11:19:17.440+0000' - }) - }); - }); - - it('should claim a task', (done) => { - let taskId = '111'; - - service.claimTask(taskId).subscribe( - (res: any) => { - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify({}) - }); - }); - - it('should return the filter if it contains task id', (done) => { - let taskId = '1'; - let filterFake = new FilterRepresentationModel({ - name: 'FakeNameFilter', - assignment: 'fake-assignement', - filter: { - processDefinitionKey: '1', - assignment: 'fake', - state: 'none', - sort: 'asc' - } - }); - - service.isTaskRelatedToFilter(taskId, filterFake).subscribe( - (res: any) => { - expect(res).toBeDefined(); - expect(res).not.toBeNull(); - done(); - } - ); - - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeTaskList) - }); - }); - - it('should return the filters if it contains task id', async(() => { - let taskId = '1'; - - let fakeFilterList: FilterRepresentationModel[] = []; - fakeFilterList.push(fakeRepresentationFilter1, fakeRepresentationFilter2); - let resultFilter = null; - service.getFilterForTaskById(taskId, fakeFilterList).subscribe( - (res: FilterRepresentationModel) => { - resultFilter = res; - }, - () => { - }, - () => { - expect(resultFilter).toBeDefined(); - expect(resultFilter).not.toBeNull(); - expect(resultFilter.name).toBe('CONTAIN FILTER'); + created: '' }); - jasmine.Ajax.requests.at(0).respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(fakeTaskList) + service.addTask(taskFake).subscribe( + (res: TaskDetailsModel) => { + expect(res).toBeDefined(); + expect(res.id).not.toEqual(''); + expect(res.name).toEqual('FakeNameTask'); + expect(res.created).not.toEqual(''); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '777', name: 'FakeNameTask', description: null, category: null, + assignee: fakeUser, + created: '2016-07-15T11:19:17.440+0000' + }) + }); }); - jasmine.Ajax.requests.at(1).respondWith({ - 'status': 200, - contentType: 'application/json', - responseText: JSON.stringify(secondFakeTaskList) + it('should remove a checklist task ', (done) => { + service.deleteTask('999').subscribe( + () => { + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json' + }); }); - })); + + it('should add a comment task ', (done) => { + service.addTaskComment('999', 'fake-comment-message').subscribe( + (res: Comment) => { + expect(res).toBeDefined(); + expect(res.id).not.toEqual(''); + expect(res.message).toEqual('fake-comment-message'); + expect(res.created).not.toEqual(''); + expect(res.createdBy.email).toEqual('fake-email@dom.com'); + expect(res.createdBy.firstName).toEqual('firstName'); + expect(res.createdBy.lastName).toEqual('lastName'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '111', message: 'fake-comment-message', + createdBy: fakeUser, + created: '2016-07-15T11:19:17.440+0000' + }) + }); + }); + + it('should complete the task ', (done) => { + service.completeTask('999').subscribe( + (res: any) => { + expect(res).toBeDefined(); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('should return the total number of tasks', (done) => { + service.getTotalTasks(fakeFilter).subscribe( + res => { + expect(res).toBeDefined(); + expect(res.size).toEqual(1); + expect(res.total).toEqual(1); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTaskList) + }); + }); + + it('should return the default filters', (done) => { + service.createDefaultFilters('1234').subscribe( + (res: FilterRepresentationModel []) => { + expect(res).toBeDefined(); + expect(res.length).toEqual(4); + expect(res[0].name).toEqual('Involved Tasks'); + expect(res[1].name).toEqual('My Tasks'); + expect(res[2].name).toEqual('Queued Tasks'); + expect(res[3].name).toEqual('Completed Tasks'); + done(); + } + ); + + jasmine.Ajax.requests.at(0).respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '111', name: 'Involved Tasks', filter: { assignment: 'fake-involved' } + }) + }); + + jasmine.Ajax.requests.at(1).respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '222', name: 'My Tasks', filter: { assignment: 'fake-assignee' } + }) + }); + + jasmine.Ajax.requests.at(2).respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '333', name: 'Queued Tasks', filter: { assignment: 'fake-candidate' } + }) + }); + + jasmine.Ajax.requests.at(3).respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '444', name: 'Completed Tasks', filter: { assignment: 'fake-involved' } + }) + }); + }); + + it('should add a filter ', (done) => { + let filterFake = new FilterRepresentationModel({ + name: 'FakeNameFilter', + assignment: 'fake-assignement' + }); + + service.addFilter(filterFake).subscribe( + (res: FilterRepresentationModel) => { + expect(res).toBeDefined(); + expect(res.id).not.toEqual(''); + expect(res.name).toEqual('FakeNameFilter'); + expect(res.filter.assignment).toEqual('fake-assignement'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '2233', name: 'FakeNameFilter', filter: { assignment: 'fake-assignement' } + }) + }); + }); + + it('should get the deployed apps ', (done) => { + service.getDeployedApplications().subscribe( + (res: any) => { + expect(res).toBeDefined(); + expect(res.length).toEqual(2); + expect(res[0].name).toEqual('Sales-Fakes-App'); + expect(res[0].description).toEqual('desc-fake1'); + expect(res[0].deploymentId).toEqual('111'); + expect(res[1].name).toEqual('health-care-Fake'); + expect(res[1].description).toEqual('desc-fake2'); + expect(res[1].deploymentId).toEqual('444'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeApps) + }); + }); + + it('should get the filter deployed app ', (done) => { + let name = 'health-care-Fake'; + service.getDeployedApplications(name).subscribe( + (res: any) => { + expect(res).toBeDefined(); + expect(res.name).toEqual('health-care-Fake'); + expect(res.description).toEqual('desc-fake2'); + expect(res.deploymentId).toEqual('444'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeApps) + }); + }); + + it('should create a new standalone task ', (done) => { + let taskFake = new TaskDetailsModel({ + name: 'FakeNameTask', + description: 'FakeDescription', + category: '3' + }); + + service.createNewTask(taskFake).subscribe( + (res: TaskDetailsModel) => { + expect(res).toBeDefined(); + expect(res.id).not.toEqual(''); + expect(res.name).toEqual('FakeNameTask'); + expect(res.description).toEqual('FakeDescription'); + expect(res.category).toEqual('3'); + expect(res.created).not.toEqual(''); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({ + id: '777', + name: 'FakeNameTask', + description: 'FakeDescription', + category: '3', + assignee: fakeUser, + created: '2016-07-15T11:19:17.440+0000' + }) + }); + }); + + it('should claim a task', (done) => { + let taskId = '111'; + + service.claimTask(taskId).subscribe( + (res: any) => { + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('should return the filter if it contains task id', (done) => { + let taskId = '1'; + let filterFake = new FilterRepresentationModel({ + name: 'FakeNameFilter', + assignment: 'fake-assignement', + filter: { + processDefinitionKey: '1', + assignment: 'fake', + state: 'none', + sort: 'asc' + } + }); + + service.isTaskRelatedToFilter(taskId, filterFake).subscribe( + (res: any) => { + expect(res).toBeDefined(); + expect(res).not.toBeNull(); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTaskList) + }); + }); + + it('should return the filters if it contains task id', async(() => { + let taskId = '1'; + + let fakeFilterList: FilterRepresentationModel[] = []; + fakeFilterList.push(fakeRepresentationFilter1, fakeRepresentationFilter2); + let resultFilter = null; + service.getFilterForTaskById(taskId, fakeFilterList).subscribe( + (res: FilterRepresentationModel) => { + resultFilter = res; + }, + () => { + }, + () => { + expect(resultFilter).toBeDefined(); + expect(resultFilter).not.toBeNull(); + expect(resultFilter.name).toBe('CONTAIN FILTER'); + }); + + jasmine.Ajax.requests.at(0).respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeTaskList) + }); + + jasmine.Ajax.requests.at(1).respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(secondFakeTaskList) + }); + })); + + it('should get possibile form list', (done) => { + service.getFormList().subscribe( + (res: any) => { + expect(res).toBeDefined(); + expect(res.length).toBe(2); + expect(res[0].id).toBe(1); + expect(res[0].name).toBe('form with all widgets'); + expect(res[1].id).toBe(2); + expect(res[1].name).toBe('uppy'); + done(); + } + ); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(fakeFormList) + }); + }); + }); }); diff --git a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts index d2ea8f94c2..82ea6fe045 100644 --- a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts +++ b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts @@ -256,6 +256,15 @@ export class ActivitiTaskListService { }).catch(err => this.handleError(err)); } + /** + * Delete a task + * @param taskId - string + */ + deleteTask(taskId: string): Observable { + return Observable.fromPromise(this.callApiDeleteTask(taskId)) + .catch(err => this.handleError(err)); + } + /** * Add a filter * @param filter - FilterRepresentationModel @@ -357,6 +366,10 @@ export class ActivitiTaskListService { return this.apiService.getInstance().activiti.taskApi.addSubtask(task.parentTaskId, task); } + private callApiDeleteTask(taskId: string) { + return this.apiService.getInstance().activiti.taskApi.deleteTask(taskId); + } + private callApiAddFilter(filter: FilterRepresentationModel) { return this.apiService.getInstance().activiti.userFiltersApi.createUserTaskFilter(filter); }