diff --git a/ng2-components/ng2-activiti-form/src/components/activiti-form.component.ts b/ng2-components/ng2-activiti-form/src/components/activiti-form.component.ts index dc700a10cb..9481157b5e 100644 --- a/ng2-components/ng2-activiti-form/src/components/activiti-form.component.ts +++ b/ng2-components/ng2-activiti-form/src/components/activiti-form.component.ts @@ -403,7 +403,7 @@ export class ActivitiForm implements OnInit, AfterViewChecked, OnChanges { this.formService.searchFrom(nodeType).subscribe( form => { if (!form) { - this.formService.createFormFromNodeType(nodeType).subscribe(formMetadata => { + this.formService.createFormFromANode(nodeType).subscribe(formMetadata => { this.loadFormFromFormId(formMetadata.id); }); } else { diff --git a/ng2-components/ng2-activiti-form/src/services/ecm-model.service.spec.ts b/ng2-components/ng2-activiti-form/src/services/ecm-model.service.spec.ts new file mode 100644 index 0000000000..d0fd973113 --- /dev/null +++ b/ng2-components/ng2-activiti-form/src/services/ecm-model.service.spec.ts @@ -0,0 +1,341 @@ +/*! + * @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 { it, inject, describe, expect, beforeEach, beforeEachProviders, afterEach } from '@angular/core/testing'; +import { AlfrescoAuthenticationService, AlfrescoSettingsService, AlfrescoApiService } from 'ng2-alfresco-core'; +import { NodeService } from './node.service'; +import { EcmModelService } from './ecm-model.service'; +import { HTTP_PROVIDERS } from '@angular/http'; +import { FormModel } from '../components/widgets/core/form.model'; +import { Observable } from 'rxjs/Rx'; + +declare let jasmine: any; + +describe('EcmModelService', () => { + + let ecmModelService: EcmModelService; + + beforeEachProviders(() => { + return [ + AlfrescoAuthenticationService, + AlfrescoSettingsService, + NodeService, + EcmModelService, + HTTP_PROVIDERS, + AlfrescoApiService + ]; + }); + + beforeEach(inject([EcmModelService], (service: EcmModelService) => { + jasmine.Ajax.install(); + ecmModelService = service; + })); + + afterEach(() => { + jasmine.Ajax.uninstall(); + }); + + it('Should fetch ECM models', (done) => { + ecmModelService.getEcmModels().subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('alfresco/versions/1/cmm')).toBeTruthy(); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should fetch ECM types', (done) => { + + let modelName = 'modelTest'; + + ecmModelService.getEcmType(modelName).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('versions/1/cmm/' + modelName + '/types')).toBeTruthy(); + + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should create ECM types', (done) => { + + let typeName = 'typeTest'; + + ecmModelService.createEcmType(typeName, EcmModelService.MODEL_NAME, EcmModelService.TYPE_MODEL).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('versions/1/cmm/' + EcmModelService.MODEL_NAME + '/types')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).name).toEqual(typeName); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).title).toEqual(typeName); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).parentName).toEqual(EcmModelService.TYPE_MODEL); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should create ECM types with a clean and preserv real name in the title', (done) => { + + let typeName = 'typeTest:testName@#$*!'; + let cleanName = 'testName'; + + ecmModelService.createEcmType(typeName, EcmModelService.MODEL_NAME, EcmModelService.TYPE_MODEL).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('versions/1/cmm/' + EcmModelService.MODEL_NAME + '/types')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).name).toEqual(cleanName); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).title).toEqual(typeName); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).parentName).toEqual(EcmModelService.TYPE_MODEL); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should add propery to a type', (done) => { + + let typeName = 'typeTest'; + let formFields = { + values: { + test: 'test', + test2: 'test2' + } + }; + + ecmModelService.addPropertyToAType(EcmModelService.MODEL_NAME, typeName, formFields).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('1/cmm/' + EcmModelService.MODEL_NAME + '/types/' + typeName + '?select=props')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).name).toEqual(typeName); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).properties).toEqual([{ + name: 'test', + title: 'test', + description: 'test', + dataType: 'd:text', + multiValued: false, + mandatory: false, + mandatoryEnforced: false + }, { + name: 'test2', + title: 'test2', + description: 'test2', + dataType: 'd:text', + multiValued: false, + mandatory: false, + mandatoryEnforced: false + }]); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should add propery to a type and clean name type', (done) => { + + let typeName = 'typeTest:testName@#$*!'; + let cleanName = 'testName'; + let formFields = { + values: { + test: 'test', + test2: 'test2' + } + }; + + ecmModelService.addPropertyToAType(EcmModelService.MODEL_NAME, typeName, formFields).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('1/cmm/' + EcmModelService.MODEL_NAME + '/types/' + cleanName + '?select=props')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).name).toEqual(cleanName); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).properties).toEqual([{ + name: 'test', + title: 'test', + description: 'test', + dataType: 'd:text', + multiValued: false, + mandatory: false, + mandatoryEnforced: false + }, { + name: 'test2', + title: 'test2', + description: 'test2', + dataType: 'd:text', + multiValued: false, + mandatory: false, + mandatoryEnforced: false + }]); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should create ECM model', (done) => { + + ecmModelService.createEcmModel(EcmModelService.MODEL_NAME, EcmModelService.MODEL_NAMESPACE).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('alfresco/versions/1/cmm')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).status).toEqual('DRAFT'); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should activate ECM model', (done) => { + + ecmModelService.activeEcmModel(EcmModelService.MODEL_NAME).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('alfresco/versions/1/cmm/' + EcmModelService.MODEL_NAME + '?select=status')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).status).toEqual('ACTIVE'); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should create an ECM type with properties', (done) => { + spyOn(ecmModelService, 'createEcmType').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + spyOn(ecmModelService, 'addPropertyToAType').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + ecmModelService.createEcmTypeWithProperties('nameType', new FormModel()).subscribe(result => { + expect(ecmModelService.createEcmType).toHaveBeenCalled(); + expect(ecmModelService.addPropertyToAType).toHaveBeenCalled(); + done(); + }); + }); + + it('Should return the already existing type', (done) => { + spyOn(ecmModelService, 'searchEcmType').and.callFake(() => { + return Observable.create(observer => { + observer.next({test: 'I-EXIST'}); + observer.complete(); + }); + }); + + spyOn(ecmModelService, 'createEcmTypeWithProperties').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + ecmModelService.saveFomType('nameType', new FormModel()).subscribe(result => { + expect(ecmModelService.searchEcmType).toHaveBeenCalled(); + expect(ecmModelService.createEcmTypeWithProperties).not.toHaveBeenCalled(); + done(); + }); + }); + + it('Should create an ECM type with properties if the ecm Type is not defined already', (done) => { + spyOn(ecmModelService, 'searchEcmType').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + spyOn(ecmModelService, 'createEcmTypeWithProperties').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + ecmModelService.saveFomType('nameType', new FormModel()).subscribe(result => { + expect(ecmModelService.searchEcmType).toHaveBeenCalled(); + expect(ecmModelService.createEcmTypeWithProperties).toHaveBeenCalled(); + done(); + }); + }); + + it('Should create an ECM model for the activiti if not defined already', (done) => { + spyOn(ecmModelService, 'seachActivitiEcmModel').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + spyOn(ecmModelService, 'createActivitiEcmModel').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + ecmModelService.createEcmTypeForActivitiForm('nameType', new FormModel()).subscribe(result => { + expect(ecmModelService.seachActivitiEcmModel).toHaveBeenCalled(); + expect(ecmModelService.createActivitiEcmModel).toHaveBeenCalled(); + done(); + }); + }); + + it('If a model for the activiti is already define has to save the new type', (done) => { + spyOn(ecmModelService, 'seachActivitiEcmModel').and.callFake(() => { + return Observable.create(observer => { + observer.next({test: 'I-EXIST'}); + observer.complete(); + }); + }); + + spyOn(ecmModelService, 'saveFomType').and.callFake(() => { + return Observable.create(observer => { + observer.next(); + observer.complete(); + }); + }); + + ecmModelService.createEcmTypeForActivitiForm('nameType', new FormModel()).subscribe(result => { + expect(ecmModelService.seachActivitiEcmModel).toHaveBeenCalled(); + expect(ecmModelService.saveFomType).toHaveBeenCalled(); + done(); + }); + }); +}); diff --git a/ng2-components/ng2-activiti-form/src/services/ecm-model.service.ts b/ng2-components/ng2-activiti-form/src/services/ecm-model.service.ts index 9c9f4437d3..63d24590bb 100644 --- a/ng2-components/ng2-activiti-form/src/services/ecm-model.service.ts +++ b/ng2-components/ng2-activiti-form/src/services/ecm-model.service.ts @@ -45,7 +45,7 @@ export class EcmModelService { observer.complete(); }); } else { - this.createFomType(formName, form).subscribe(typeForm => { + this.saveFomType(formName, form).subscribe(typeForm => { observer.next(typeForm); observer.complete(); }); @@ -57,13 +57,13 @@ export class EcmModelService { } - private seachActivitiEcmModel() { + seachActivitiEcmModel() { return this.getEcmModels().map(function (ecmModels: any) { return ecmModels.list.entries.find(model => model.entry.name === EcmModelService.MODEL_NAME); }); } - private createActivitiEcmModel(formName: string, form: FormModel): Observable { + createActivitiEcmModel(formName: string, form: FormModel): Observable { return Observable.create(observer => { this.createEcmModel(EcmModelService.MODEL_NAME, EcmModelService.MODEL_NAMESPACE).subscribe( model => { @@ -84,7 +84,7 @@ export class EcmModelService { }); } - private createFomType(formName: string, form: FormModel): Observable { + saveFomType(formName: string, form: FormModel): Observable { return Observable.create(observer => { this.searchEcmType(formName, EcmModelService.MODEL_NAME).subscribe( ecmType => { diff --git a/ng2-components/ng2-activiti-form/src/services/form.service.spec.ts b/ng2-components/ng2-activiti-form/src/services/form.service.spec.ts index 577963736e..7c3ed3fb4a 100644 --- a/ng2-components/ng2-activiti-form/src/services/form.service.spec.ts +++ b/ng2-components/ng2-activiti-form/src/services/form.service.spec.ts @@ -21,6 +21,7 @@ import { HTTP_PROVIDERS, Response, ResponseOptions } from '@angular/http'; import { FormService } from './form.service'; import { EcmModelService } from './ecm-model.service'; import { NodeService } from './node.service'; +import { FormDefinitionModel } from '../models/form-definition.model'; declare let jasmine: any; @@ -73,8 +74,8 @@ describe('FormService', () => { it('should fetch and parse tasks', (done) => { responseBody = { data: [ - { id: '1' }, - { id: '2' } + {id: '1'}, + {id: '2'} ] }; @@ -158,7 +159,7 @@ describe('FormService', () => { formService.completeTaskForm('1', values, 'custom').subscribe(() => { expect(jasmine.Ajax.requests.mostRecent().url.endsWith('/task-forms/1')).toBeTruthy(); expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).values.field2).toEqual(values.field2); - expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).outcome).toEqual('custom' ); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).outcome).toEqual('custom'); done(); }); @@ -171,7 +172,7 @@ describe('FormService', () => { }); it('should get task form by id', (done) => { - responseBody = { id: 1 }; + responseBody = {id: 1}; formService.getTaskForm('1').subscribe(result => { expect(jasmine.Ajax.requests.mostRecent().url.endsWith('/task-forms/1')).toBeTruthy(); @@ -187,7 +188,7 @@ describe('FormService', () => { }); it('should get form definition by id', (done) => { - responseBody = { id: 1 }; + responseBody = {id: 1}; formService.getFormDefinitionById('1').subscribe(result => { expect(jasmine.Ajax.requests.mostRecent().url.endsWith('/form-models/1')).toBeTruthy(); @@ -207,7 +208,7 @@ describe('FormService', () => { const formId = 1; responseBody = { data: [ - { id: formId } + {id: formId} ] }; @@ -225,16 +226,16 @@ describe('FormService', () => { }); it('should not get form id from response', () => { - let response = new Response(new ResponseOptions({ body: null })); + let response = new Response(new ResponseOptions({body: null})); expect(formService.getFormId(response)).toBeNull(); - response = new Response(new ResponseOptions({ body: {} })); + response = new Response(new ResponseOptions({body: {}})); expect(formService.getFormId(response)).toBeNull(); - response = new Response(new ResponseOptions({ body: { data: null } })); + response = new Response(new ResponseOptions({body: {data: null}})); expect(formService.getFormId(response)).toBeNull(); - response = new Response(new ResponseOptions({ body: { data: [] } })); + response = new Response(new ResponseOptions({body: {data: []}})); expect(formService.getFormId(response)).toBeNull(); expect(formService.getFormId(null)).toBeNull(); @@ -243,10 +244,10 @@ describe('FormService', () => { it('should fallback to empty json array', () => { expect(formService.toJsonArray(null)).toEqual([]); - let response = new Response(new ResponseOptions({ body: {} })); + let response = new Response(new ResponseOptions({body: {}})); expect(formService.toJsonArray(response)).toEqual([]); - response = new Response(new ResponseOptions({ body: { data: null } })); + response = new Response(new ResponseOptions({body: {data: null}})); expect(formService.toJsonArray(response)).toEqual([]); }); @@ -261,7 +262,7 @@ describe('FormService', () => { spyOn(console, 'error').and.stub(); const message = ''; - formService.handleError({ message: message }); + formService.handleError({message: message}); expect(console.error).toHaveBeenCalledWith(message); }); @@ -280,4 +281,138 @@ describe('FormService', () => { formService.handleError({}); expect(console.error).toHaveBeenCalledWith(FormService.GENERIC_ERROR_MESSAGE); }); + + it('should get all the forms with modelType=2', (done) => { + responseBody = {}; + + formService.getForms().subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('models?modelType=2')).toBeTruthy(); + expect(result).toEqual(responseBody); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(responseBody) + }); + }); + + it('should search for Form with modelType=2', (done) => { + responseBody = {data: [{id: 1, name: 'findme'}, {id: 2, name: 'testform'}]}; + + formService.searchFrom('findme').subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('models?modelType=2')).toBeTruthy(); + expect(result.name).toEqual('findme'); + expect(result.id).toEqual(1); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(responseBody) + }); + }); + + it('should create a Form with modelType=2', (done) => { + responseBody = {id: 1, modelType: 'test'}; + + formService.createForm('testName').subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('/models')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).modelType).toEqual(2); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).name).toEqual('testName'); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(responseBody) + }); + }); + + it('should add form fields to a form', (done) => { + responseBody = {id: 1, modelType: 'test'}; + + let formId = '100'; + let name = 'testName'; + let data = [{name: 'name'}, {name: 'email'}]; + let formDefinitionModel = new FormDefinitionModel(formId, name, 'testUserName', '2016-09-05T14:41:19.049Z', data); + + formService.addFieldsToAForm(formId, formDefinitionModel).subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('/form-models/' + formId)).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).formRepresentation.name).toEqual(name); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(responseBody) + }); + }); + + it('should create a Form form a Node', (done) => { + + let nameForm = 'testNode'; + + responseBody = {id: 1, modelType: 'test'}; + + let formId = 100; + + stubCreateForm(); + + stubGetEcmModel(); + + stubAddFieldsToAForm(); + + formService.createFormFromANode(nameForm).subscribe(result => { + expect(result.id).toEqual(formId); + done(); + }); + + function stubCreateForm() { + jasmine.Ajax.stubRequest( + 'http://localhost:9999/activiti-app/api/enterprise/models' + ).andReturn({ + status: 200, + statusText: 'HTTP/1.1 200 OK', + contentType: 'text/xml;charset=UTF-8', + responseText: {id: formId, name: 'test', lastUpdatedByFullName: 'uset', lastUpdated: '12-12-2016'} + }); + } + + function stubGetEcmModel() { + jasmine.Ajax.stubRequest( + 'http://localhost:8080/alfresco/api/-default-/private/alfresco/versions/1/cmm/activitiFormsModel/types' + ).andReturn({ + status: 200, + statusText: 'HTTP/1.1 200 OK', + contentType: 'text/xml;charset=UTF-8', + responseText: { + list: { + entries: [{ + entry: { + prefixedName: nameForm, + title: nameForm, + properties: [{name: 'name'}, {name: 'email'}] + } + }, {entry: {prefixedName: 'notme', title: 'notme'}}] + } + } + }); + } + + function stubAddFieldsToAForm() { + jasmine.Ajax.stubRequest( + 'http://localhost:9999/activiti-app/api/enterprise/editor/form-models/' + formId + ).andReturn({ + status: 200, + statusText: 'HTTP/1.1 200 OK', + contentType: 'text/xml;charset=UTF-8', + responseText: {id: formId, name: 'test', lastUpdatedByFullName: 'user', lastUpdated: '12-12-2016'} + }); + } + }); }); diff --git a/ng2-components/ng2-activiti-form/src/services/form.service.ts b/ng2-components/ng2-activiti-form/src/services/form.service.ts index 3ff37b215a..cd26ce0ca2 100644 --- a/ng2-components/ng2-activiti-form/src/services/form.service.ts +++ b/ng2-components/ng2-activiti-form/src/services/form.service.ts @@ -36,14 +36,14 @@ export class FormService { * Create a Form with a fields for each metadata properties * @returns {Observable} */ - public createFormFromNodeType(formName: string): Observable { + public createFormFromANode(formName: string): Observable { return Observable.create(observer => { this.createForm(formName).subscribe( form => { this.ecmModelService.searchEcmType(formName, EcmModelService.MODEL_NAME).subscribe( customType => { let formDefinitionModel = new FormDefinitionModel(form.id, form.name, form.lastUpdatedByFullName, form.lastUpdated, customType.entry.properties); - this.addFieldsNodeTypePropertiesToTheForm(form.id, formDefinitionModel).subscribe(formData => { + this.addFieldsToAForm(form.id, formDefinitionModel).subscribe(formData => { observer.next(formData); observer.complete(); }, this.handleError); @@ -68,14 +68,6 @@ export class FormService { return Observable.fromPromise(this.authService.getAlfrescoApi().activiti.modelsApi.createModel(dataModel)); } - /** - * Add Fields to A form from a metadata properties - * @returns {Observable} - */ - public addFieldsNodeTypePropertiesToTheForm(formId: string, formDefinitionModel: FormDefinitionModel): Observable { - return this.addFieldsToAForm(formId, formDefinitionModel); - } - /** * Add Fileds to A form * @returns {Observable} diff --git a/ng2-components/ng2-activiti-form/src/services/node.service.spec.ts b/ng2-components/ng2-activiti-form/src/services/node.service.spec.ts new file mode 100644 index 0000000000..028997d862 --- /dev/null +++ b/ng2-components/ng2-activiti-form/src/services/node.service.spec.ts @@ -0,0 +1,171 @@ +/*! + * @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 { it, inject, describe, expect, beforeEach, beforeEachProviders, afterEach } from '@angular/core/testing'; +import { AlfrescoAuthenticationService, AlfrescoSettingsService, AlfrescoApiService } from 'ng2-alfresco-core'; +import { NodeService } from './node.service'; +import { NodeMetadata } from '../models/node-metadata.model'; +import { EcmModelService } from './ecm-model.service'; + +declare let jasmine: any; + +describe('NodeService', () => { + + let nodeService: NodeService; + + beforeEachProviders(() => { + return [ + AlfrescoAuthenticationService, + AlfrescoSettingsService, + NodeService, + AlfrescoApiService + ]; + }); + + beforeEach(inject([NodeService], (service: NodeService) => { + jasmine.Ajax.install(); + nodeService = service; + })); + + afterEach(() => { + jasmine.Ajax.uninstall(); + }); + + it('Should fetch and node metadata', (done) => { + let responseBody = { + entry: { + id: '111-222-33-44-1123', + nodeType: 'typeTest', + properties: { + test: 'test', + testdata: 'testdata' + } + } + }; + + nodeService.getNodeMetadata('-nodeid-').subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('nodes/-nodeid-')).toBeTruthy(); + let node = new NodeMetadata({ + test: 'test', + testdata: 'testdata' + }, 'typeTest'); + expect(result).toEqual(node); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(responseBody) + }); + }); + + it('Should clean the metadata from :', (done) => { + let responseBody = { + entry: { + id: '111-222-33-44-1123', + nodeType: 'typeTest', + properties: { + 'metadata:test': 'test', + 'metadata:testdata': 'testdata' + } + } + }; + + nodeService.getNodeMetadata('-nodeid-').subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('nodes/-nodeid-')).toBeTruthy(); + let node = new NodeMetadata({ + test: 'test', + testdata: 'testdata' + }, 'typeTest'); + expect(result).toEqual(node); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(responseBody) + }); + }); + + it('Should create a node with metadata', (done) => { + let data = { + test: 'test', + testdata: 'testdata' + }; + + let responseBody = { + id: 'a74d91fb-ea8a-4812-ad98-ad878366b5be', + isFile: false, + isFolder: true + }; + + nodeService.createNodeMetadata('typeTest', EcmModelService.MODEL_NAMESPACE, data, '/Sites/swsdp/documentLibrary', 'testNode').subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('-root-/children')).toBeTruthy(); + expect(result).toEqual(responseBody); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify(responseBody) + }); + }); + + it('Should add activitiForms suffix to the metadata properties', (done) => { + let data = { + test: 'test', + testdata: 'testdata' + }; + + nodeService.createNodeMetadata('typeTest', EcmModelService.MODEL_NAMESPACE, data, '/Sites/swsdp/documentLibrary').subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('-root-/children')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).properties[EcmModelService.MODEL_NAMESPACE + ':test']).toBeDefined(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).properties[EcmModelService.MODEL_NAMESPACE + ':testdata']).toBeDefined(); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + + it('Should assign an UUID to the name when name not passed', (done) => { + let data = { + test: 'test', + testdata: 'testdata' + }; + + + nodeService.createNodeMetadata('typeTest', EcmModelService.MODEL_NAMESPACE, data, '/Sites/swsdp/documentLibrary').subscribe(result => { + expect(jasmine.Ajax.requests.mostRecent().url.endsWith('-root-/children')).toBeTruthy(); + expect(JSON.parse(jasmine.Ajax.requests.mostRecent().params).name).toBeDefined(); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'application/json', + responseText: JSON.stringify({}) + }); + }); + +}); diff --git a/ng2-components/ng2-activiti-form/src/services/node.service.ts b/ng2-components/ng2-activiti-form/src/services/node.service.ts index 7c52f703a0..860cdbb1c2 100644 --- a/ng2-components/ng2-activiti-form/src/services/node.service.ts +++ b/ng2-components/ng2-activiti-form/src/services/node.service.ts @@ -88,7 +88,11 @@ export class NodeService { if (data && data.properties) { for (let key in data.properties) { if (key) { - metadata [key.split(':')[1]] = data.properties[key]; + if (key.indexOf(':') !== -1) { + metadata [key.split(':')[1]] = data.properties[key]; + } else { + metadata [key] = data.properties[key]; + } } } } diff --git a/scripts/npm-build-all.sh b/scripts/npm-build-all.sh index 96bc696f73..6e0795721f 100755 --- a/scripts/npm-build-all.sh +++ b/scripts/npm-build-all.sh @@ -3,10 +3,10 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" for PACKAGE in \ + ng2-alfresco-core \ ng2-activiti-form \ ng2-activiti-tasklist \ ng2-activiti-processlist \ - ng2-alfresco-core \ ng2-alfresco-datatable \ ng2-alfresco-documentlist \ ng2-alfresco-login \ @@ -18,6 +18,7 @@ do DESTDIR="$DIR/../ng2-components/${PACKAGE}" echo "====== build components : ${PACKAGE} =====" cd "$DESTDIR" + npm update npm install --cache-min 9999999 npm run build done