diff --git a/src/app/+admin/admin-access-control/epeople-registry/epeople-registry.component.html b/src/app/+admin/admin-access-control/epeople-registry/epeople-registry.component.html
index 3220c73a25..185900930b 100644
--- a/src/app/+admin/admin-access-control/epeople-registry/epeople-registry.component.html
+++ b/src/app/+admin/admin-access-control/epeople-registry/epeople-registry.component.html
@@ -62,12 +62,12 @@
{{eperson.email}} |
-
diff --git a/src/app/+admin/admin-access-control/epeople-registry/epeople-registry.component.spec.ts b/src/app/+admin/admin-access-control/epeople-registry/epeople-registry.component.spec.ts
new file mode 100644
index 0000000000..bc24894145
--- /dev/null
+++ b/src/app/+admin/admin-access-control/epeople-registry/epeople-registry.component.spec.ts
@@ -0,0 +1,199 @@
+import { of as observableOf } from 'rxjs';
+import { CommonModule } from '@angular/common';
+import { NO_ERRORS_SCHEMA } from '@angular/core';
+import { async, ComponentFixture, fakeAsync, inject, TestBed, tick } from '@angular/core/testing';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { BrowserModule, By } from '@angular/platform-browser';
+import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
+import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
+import { Observable } from 'rxjs/internal/Observable';
+import { PaginatedList } from '../../../core/data/paginated-list';
+import { RemoteData } from '../../../core/data/remote-data';
+import { FindListOptions } from '../../../core/data/request.models';
+import { EPersonDataService } from '../../../core/eperson/eperson-data.service';
+import { EPerson } from '../../../core/eperson/models/eperson.model';
+import { PageInfo } from '../../../core/shared/page-info.model';
+import { FormBuilderService } from '../../../shared/form/builder/form-builder.service';
+import { getMockFormBuilderService } from '../../../shared/mocks/mock-form-builder-service';
+import { MockTranslateLoader } from '../../../shared/mocks/mock-translate-loader';
+import { getMockTranslateService } from '../../../shared/mocks/mock-translate.service';
+import { NotificationsService } from '../../../shared/notifications/notifications.service';
+import { EPersonMock, EPersonMock2 } from '../../../shared/testing/eperson-mock';
+import { NotificationsServiceStub } from '../../../shared/testing/notifications-service-stub';
+import { createSuccessfulRemoteDataObject$ } from '../../../shared/testing/utils';
+import { EPeopleRegistryComponent } from './epeople-registry.component';
+import { EPersonFormComponent } from './eperson-form/eperson-form.component';
+
+describe('EPeopleRegistryComponent', () => {
+ let component: EPeopleRegistryComponent;
+ let fixture: ComponentFixture;
+ let translateService: TranslateService;
+ let builderService: FormBuilderService;
+
+ const mockEPeople = [EPersonMock, EPersonMock2];
+ let ePersonDataServiceStub: any;
+
+ beforeEach(async(() => {
+ ePersonDataServiceStub = {
+ activeEPerson: null,
+ allEpeople: mockEPeople,
+ getEPeople(): Observable>> {
+ return createSuccessfulRemoteDataObject$(new PaginatedList(null, this.allEpeople));
+ },
+ getActiveEPerson(): Observable {
+ return observableOf(this.activeEPerson);
+ },
+ searchByScope(scope: string, query: string, options: FindListOptions = {}): Observable>> {
+ if (scope === 'email') {
+ const result = this.allEpeople.find((ePerson: EPerson) => {
+ return ePerson.email === query
+ });
+ return createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [result]));
+ }
+ if (scope === 'metadata') {
+ const result = this.allEpeople.find((ePerson: EPerson) => {
+ return (ePerson.name.includes(query) || ePerson.email.includes(query))
+ });
+ return createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [result]));
+ }
+ return createSuccessfulRemoteDataObject$(new PaginatedList(null, this.allEpeople));
+ },
+ deleteEPerson(ePerson: EPerson): Observable {
+ this.allEpeople = this.allEpeople.filter((ePerson2: EPerson) => {
+ return (ePerson2.uuid !== ePerson.uuid);
+ });
+ return observableOf(true);
+ },
+ editEPerson(ePerson: EPerson) {
+ this.activeEPerson = ePerson;
+ },
+ cancelEditEPerson() {
+ this.activeEPerson = null;
+ },
+ clearEPersonRequests(): void {
+ // empty
+ }
+ };
+ builderService = getMockFormBuilderService();
+ translateService = getMockTranslateService();
+ TestBed.configureTestingModule({
+ imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule,
+ TranslateModule.forRoot({
+ loader: {
+ provide: TranslateLoader,
+ useClass: MockTranslateLoader
+ }
+ }),
+ ],
+ declarations: [EPeopleRegistryComponent, EPersonFormComponent],
+ providers: [EPeopleRegistryComponent,
+ { provide: EPersonDataService, useValue: ePersonDataServiceStub },
+ { provide: NotificationsService, useValue: new NotificationsServiceStub() },
+ { provide: FormBuilderService, useValue: builderService },
+ EPeopleRegistryComponent
+ ],
+ schemas: [NO_ERRORS_SCHEMA]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(EPeopleRegistryComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create EPeopleRegistryComponent', inject([EPeopleRegistryComponent], (comp: EPeopleRegistryComponent) => {
+ expect(comp).toBeDefined();
+ }));
+
+ it('should display list of ePeople', () => {
+ const ePeopleIdsFound = fixture.debugElement.queryAll(By.css('#epeople tr td:first-child'));
+ expect(ePeopleIdsFound.length).toEqual(2);
+ mockEPeople.map((ePerson: EPerson) => {
+ expect(ePeopleIdsFound.find((foundEl) => {
+ return (foundEl.nativeElement.textContent.trim() === ePerson.uuid);
+ })).toBeTruthy();
+ })
+ });
+
+ describe('search', () => {
+ describe('when searching with scope/query (scope metadata)', () => {
+ let ePeopleIdsFound;
+ beforeEach(fakeAsync(() => {
+ component.search({ scope: 'metadata', query: EPersonMock2.name });
+ tick();
+ fixture.detectChanges();
+ ePeopleIdsFound = fixture.debugElement.queryAll(By.css('#epeople tr td:first-child'));
+ }));
+
+ it('should display search result', () => {
+ expect(ePeopleIdsFound.length).toEqual(1);
+ expect(ePeopleIdsFound.find((foundEl) => {
+ return (foundEl.nativeElement.textContent.trim() === EPersonMock2.uuid);
+ })).toBeTruthy();
+ });
+ });
+
+ describe('when searching with scope/query (scope email)', () => {
+ let ePeopleIdsFound;
+ beforeEach(fakeAsync(() => {
+ component.search({ scope: 'email', query: EPersonMock.email });
+ tick();
+ fixture.detectChanges();
+ ePeopleIdsFound = fixture.debugElement.queryAll(By.css('#epeople tr td:first-child'));
+ }));
+
+ it('should display search result', () => {
+ expect(ePeopleIdsFound.length).toEqual(1);
+ expect(ePeopleIdsFound.find((foundEl) => {
+ return (foundEl.nativeElement.textContent.trim() === EPersonMock.uuid);
+ })).toBeTruthy();
+ });
+ });
+ });
+
+ describe('editEPerson', () => {
+ describe('when you click on first edit eperson button', () => {
+ beforeEach(fakeAsync(() => {
+ const editButtons = fixture.debugElement.queryAll(By.css('.access-control-editEPersonButton'));
+ editButtons[0].triggerEventHandler('click', {
+ preventDefault: () => {/**/
+ }
+ });
+ tick();
+ fixture.detectChanges();
+ }));
+
+ it('edit eperson form shows', () => {
+ const editFormTitle = fixture.debugElement.queryAll(By.css('ds-eperson-form h4'));
+ expect(editFormTitle[0]).toBeDefined();
+ });
+ });
+ });
+
+ describe('deleteEPerson', () => {
+ describe('when you click on first delete eperson button', () => {
+ let ePeopleIdsFoundBeforeDelete;
+ let ePeopleIdsFoundAfterDelete;
+ beforeEach(fakeAsync(() => {
+ ePeopleIdsFoundBeforeDelete = fixture.debugElement.queryAll(By.css('#epeople tr td:first-child'));
+ const deleteButtons = fixture.debugElement.queryAll(By.css('.access-control-deleteEPersonButton'));
+ deleteButtons[0].triggerEventHandler('click', {
+ preventDefault: () => {/**/
+ }
+ });
+ tick();
+ fixture.detectChanges();
+ ePeopleIdsFoundAfterDelete = fixture.debugElement.queryAll(By.css('#epeople tr td:first-child'));
+ }));
+
+ it('first ePerson is deleted', () => {
+ expect(ePeopleIdsFoundBeforeDelete.length === ePeopleIdsFoundAfterDelete + 1);
+ ePeopleIdsFoundAfterDelete.forEach((epersonElement) => {
+ expect(epersonElement.nativeElement.textContent !== ePeopleIdsFoundBeforeDelete[0].nativeElement.textContent).toBeTrue();
+ });
+ });
+ });
+ });
+
+});
diff --git a/src/app/shared/testing/eperson-mock.ts b/src/app/shared/testing/eperson-mock.ts
index 73bdd56b0b..81a5a48a2c 100644
--- a/src/app/shared/testing/eperson-mock.ts
+++ b/src/app/shared/testing/eperson-mock.ts
@@ -81,7 +81,7 @@ export const EPersonMock2: EPerson = Object.assign(new EPerson(), {
'eperson.lastname': [
{
language: null,
- value: 'Test2'
+ value: 'MeepMeep'
},
],
'eperson.language': [
|