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': [