[AAE-4995] Expand ADF PeopleContentService to create new person (#6931)

* [AAE-4995] Expose create/list content users API in ADF PeopleContentService

* * Updated documentation

* * Removed listPeople api

* * Added unit tests and improved old tests

* * Updated doc with js-api doc link

* *Fixed lint errors

* * Fixed failing unit tests
This commit is contained in:
siva kumar
2021-04-21 19:17:54 +05:30
committed by GitHub
parent cd349361d0
commit bf70e471ce
4 changed files with 118 additions and 76 deletions

View File

@@ -20,6 +20,10 @@ Gets information about a Content Services user.
Gets information about a user identified by their username. Gets information about a user identified by their username.
- _personId:_ `string` - ID of the target user - _personId:_ `string` - ID of the target user
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<any>` - User information - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<any>` - User information
- **createPerson**(newPerson: [PersonBodyCreate](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/content-rest-api/docs/PersonBodyCreate.md)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../../core/models/ecm-user.model.md)`>`<br/>
Creates new person.
- _newPerson:_ `<`[PersonBodyCreate](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/content-rest-api/docs/PersonBodyCreate.md)`>` - Object containing the new person details
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html) `<`[`EcmUserModel`](../../core/models/ecm-user.model.md)`[]>` - Created new person.
## Details ## Details
@@ -32,6 +36,10 @@ See the
[getPerson](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/PeopleApi.md#getPerson) [getPerson](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/PeopleApi.md#getPerson)
method in the Alfresco JS API for more information about the REST calls used by this service. method in the Alfresco JS API for more information about the REST calls used by this service.
See the
[createPerson](https://github.com/Alfresco/alfresco-js-api/blob/master/src/api/content-rest-api/docs/PeopleApi.md#createPerson)
method in the Alfresco JS API for more information about the REST calls used by this service.
## See also ## See also
- [People process service](people-process.service.md) - [People process service](people-process.service.md)

View File

@@ -90,3 +90,12 @@ export let fakeEcmEditedUser = {
enabled: true, enabled: true,
emailNotificationsEnabled: true emailNotificationsEnabled: true
}; };
export const createNewPersonMock = {
id: 'fake-id',
firstName: 'fake-ecm-first-name',
lastName: 'fake-ecm-last-name',
description: 'i am a fake user for test',
password: 'fake-avatar-id',
email: 'fakeEcm@ecmUser.com'
};

View File

@@ -15,87 +15,90 @@
* limitations under the License. * limitations under the License.
*/ */
import { async, inject, TestBed } from '@angular/core/testing'; import { fakeEcmUser, createNewPersonMock } from '../mock/ecm-user.service.mock';
import { AlfrescoApiService } from './alfresco-api.service'; import { AlfrescoApiServiceMock } from '../mock/alfresco-api.service.mock';
import { CoreTestingModule } from '../testing/core.testing.module';
import { PeopleContentService } from './people-content.service'; import { PeopleContentService } from './people-content.service';
import { AlfrescoApiService } from './alfresco-api.service';
import { setupTestBed } from '../testing/setup-test-bed';
import { TranslateModule } from '@ngx-translate/core';
import { TestBed } from '@angular/core/testing';
import { LogService } from './log.service';
class PeopleContentServiceTest { describe('PeopleContentService', () => {
service: any = null;
setup: any = {
rejectGetPerson: false
};
constructor(setup: any = {}) { let service: PeopleContentService;
Object.assign(this.setup, setup); let logService: LogService;
const { alfrescoApiServiceMock } = this; setupTestBed({
imports: [
TranslateModule.forRoot(),
CoreTestingModule
],
providers: [
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }
]
});
const alfrescoApiServiceProvider = { beforeEach(() => {
provide: AlfrescoApiService, service = TestBed.inject(PeopleContentService);
useValue: alfrescoApiServiceMock logService = TestBed.inject(LogService);
}; });
TestBed.configureTestingModule({ it('should be able to fetch person details based on id', (done) => {
providers: [ spyOn(service.peopleApi, 'getPerson').and.returnValue(Promise.resolve({ entry: fakeEcmUser }));
alfrescoApiServiceProvider, service.getPerson('fake-id').subscribe((person) => {
PeopleContentService expect(person.entry.id).toEqual('fake-id');
] expect(person.entry.email).toEqual('fakeEcm@ecmUser.com');
done();
}); });
});
inject([ PeopleContentService ], (service) => { it('calls getPerson api method by an id', (done) => {
this.service = service; const getPersonSpy = spyOn(service.peopleApi, 'getPerson').and.returnValue(Promise.resolve({}));
})(); service.getPerson('fake-id').subscribe(() => {
} expect(getPersonSpy).toHaveBeenCalledWith('fake-id');
done();
});
});
private get alfrescoApiServiceMock(): any { it('calls getPerson api method with "-me-"', (done) => {
const { setup } = this; const getPersonSpy = spyOn(service.peopleApi, 'getPerson').and.returnValue(Promise.resolve({}));
service.getPerson('-me-').subscribe(() => {
expect(getPersonSpy).toHaveBeenCalledWith('-me-');
done();
});
});
const peopleApiMock = { it('should be able to create new person', (done) => {
getPerson: jasmine.createSpy('getPersonSpy').and.callFake((personId) => { spyOn(service.peopleApi, 'createPerson').and.returnValue(Promise.resolve({ entry: fakeEcmUser }));
return new Promise((resolve, reject) => { service.createPerson(createNewPersonMock).subscribe((person) => {
setup.rejectGetPerson expect(person.id).toEqual('fake-id');
? reject() expect(person.email).toEqual('fakeEcm@ecmUser.com');
: resolve({ id: personId }); done();
}); });
}) });
};
return { it('should be able to call createPerson api with new person details', (done) => {
getInstance: () => { const createPersonSpy = spyOn(service.peopleApi, 'createPerson').and.returnValue(Promise.resolve({ entry: fakeEcmUser }));
return { service.createPerson(createNewPersonMock).subscribe((person) => {
core: { peopleApi: peopleApiMock } expect(person.id).toEqual('fake-id');
}; expect(person.email).toEqual('fakeEcm@ecmUser.com');
} expect(createPersonSpy).toHaveBeenCalledWith(createNewPersonMock, undefined);
}; done();
} });
});
get peopleApiGetPersonSpy() { it('should be able to throw an error if createPerson api failed', (done) => {
return this.service.peopleApi.getPerson; const createPersonSpy = spyOn(service.peopleApi, 'createPerson').and.returnValue(Promise.reject({ message: 'failed to create new person' }));
} const logErrorSpy = spyOn(logService, 'error');
service.createPerson(createNewPersonMock).subscribe(
get peopleApiGetPersonArguments() { () => {},
return this.peopleApiGetPersonSpy.calls.mostRecent().args; (error) => {
} expect(error).toEqual({ message: 'failed to create new person' });
} expect(createPersonSpy).toHaveBeenCalled();
expect(logErrorSpy).toHaveBeenCalledWith({ message: 'failed to create new person' });
describe('PeopleAPI', () => { done();
describe('Get persons', () => { });
it('calls method by an id', async(() => {
const test = new PeopleContentServiceTest();
test.service.getPerson('person-1').subscribe(() => {
expect(test.peopleApiGetPersonArguments[0])
.toBe('person-1');
});
}));
it('calls method with "-me-"', async(() => {
const test = new PeopleContentServiceTest();
test.service.getCurrentPerson().subscribe(() => {
expect(test.peopleApiGetPersonArguments[0])
.toBe('-me-');
});
}));
}); });
}); });

View File

@@ -16,19 +16,24 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable, from, of } from 'rxjs'; import { Observable, from, throwError } from 'rxjs';
import { AlfrescoApiService } from './alfresco-api.service'; import { AlfrescoApiService } from './alfresco-api.service';
import { catchError } from 'rxjs/operators'; import { catchError, map } from 'rxjs/operators';
import { PersonEntry, PeopleApi, PersonBodyCreate } from '@alfresco/js-api';
import { EcmUserModel } from '../models/ecm-user.model';
import { LogService } from './log.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class PeopleContentService { export class PeopleContentService {
constructor(private apiService: AlfrescoApiService) {} private _peopleApi: PeopleApi;
private get peopleApi() { constructor(private apiService: AlfrescoApiService, private logService: LogService) {}
return this.apiService.getInstance().core.peopleApi;
get peopleApi() {
return this._peopleApi || (this._peopleApi = new PeopleApi(this.apiService.getInstance()));
} }
/** /**
@@ -40,7 +45,7 @@ export class PeopleContentService {
const promise = this.peopleApi.getPerson(personId); const promise = this.peopleApi.getPerson(personId);
return from(promise).pipe( return from(promise).pipe(
catchError((err) => of(err)) catchError((error) => this.handleError(error))
); );
} }
@@ -51,4 +56,21 @@ export class PeopleContentService {
getCurrentPerson(): Observable<any> { getCurrentPerson(): Observable<any> {
return this.getPerson('-me-'); return this.getPerson('-me-');
} }
/**
* Creates new person.
* @param newPerson Object containing the new person details.
* @returns Created new person
*/
createPerson(newPerson: PersonBodyCreate, opts?: any): Observable<EcmUserModel> {
return from(this.peopleApi.createPerson(newPerson, opts)).pipe(
map((res: PersonEntry) => <EcmUserModel> res?.entry),
catchError((error) => this.handleError(error))
);
}
private handleError(error: any) {
this.logService.error(error);
return throwError(error || 'Server error');
}
} }