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'; describe('EPeopleRegistryComponent', () => { let component: EPeopleRegistryComponent; let fixture: ComponentFixture<EPeopleRegistryComponent>; let translateService: TranslateService; let builderService: FormBuilderService; const mockEPeople = [EPersonMock, EPersonMock2]; let ePersonDataServiceStub: any; beforeEach(async(() => { ePersonDataServiceStub = { activeEPerson: null, allEpeople: mockEPeople, getEPeople(): Observable<RemoteData<PaginatedList<EPerson>>> { return createSuccessfulRemoteDataObject$(new PaginatedList(null, this.allEpeople)); }, getActiveEPerson(): Observable<EPerson> { return observableOf(this.activeEPerson); }, searchByScope(scope: string, query: string, options: FindListOptions = {}): Observable<RemoteData<PaginatedList<EPerson>>> { 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<boolean> { 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], 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('toggleEditEPerson', () => { 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('editEPerson form is toggled', () => { const ePeopleIds = fixture.debugElement.queryAll(By.css('#epeople tr td:first-child')); ePersonDataServiceStub.getActiveEPerson().subscribe((activeEPerson: EPerson) => { if (activeEPerson === ePeopleIds[0].nativeElement.textContent) { expect(component.isEPersonFormShown).toEqual(false); } else { expect(component.isEPersonFormShown).toEqual(true); } }) }); }); }); 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 !== ePeopleIdsFoundBeforeDelete[0].nativeElement.textContent).toBeTrue(); }); }); }); }); });