From 2acb55f58a66120b0c1bc1b75ccbab237cf47d4f Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Wed, 30 Jan 2019 13:47:14 +0100 Subject: [PATCH] 59415: Browse-by page component tests --- .../browse-by-metadata-page.component.spec.ts | 145 ++++++++++++++++++ .../browse-by-metadata-page.component.ts | 4 +- .../browse-by-title-page.component.spec.ts | 67 ++++++++ 3 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts create mode 100644 src/app/+browse-by/+browse-by-title-page/browse-by-title-page.component.spec.ts diff --git a/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts b/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts new file mode 100644 index 0000000000..c11fa009aa --- /dev/null +++ b/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts @@ -0,0 +1,145 @@ +import { BrowseByMetadataPageComponent, browseParamsToOptions } from './browse-by-metadata-page.component'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { BrowseService } from '../../core/browse/browse.service'; +import { CommonModule } from '@angular/common'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { EnumKeysPipe } from '../../shared/utils/enum-keys-pipe'; +import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRouteStub } from '../../shared/testing/active-router-stub'; +import { of as observableOf } from 'rxjs/internal/observable/of'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { Observable } from 'rxjs/internal/Observable'; +import { RemoteData } from '../../core/data/remote-data'; +import { PaginatedList } from '../../core/data/paginated-list'; +import { PageInfo } from '../../core/shared/page-info.model'; +import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-options.model'; +import { SortDirection } from '../../core/cache/models/sort-options.model'; +import { Item } from '../../core/shared/item.model'; + +describe('BrowseByMetadataPageComponent', () => { + let comp: BrowseByMetadataPageComponent; + let fixture: ComponentFixture; + let browseService: BrowseService; + let route: ActivatedRoute; + + const mockEntries = [ + { + type: 'author', + authority: null, + value: 'John Doe', + language: 'en', + count: 1 + }, + { + type: 'author', + authority: null, + value: 'James Doe', + language: 'en', + count: 3 + }, + { + type: 'subject', + authority: null, + value: 'Fake subject', + language: 'en', + count: 2 + } + ]; + + const mockItems = [ + Object.assign(new Item(), { + id: 'fakeId' + }) + ]; + + const mockBrowseService = { + getBrowseEntriesFor: (options: BrowseEntrySearchOptions) => toRemoteData(mockEntries.filter((entry) => entry.type === options.metadataDefinition)), + getBrowseItemsFor: (value: string, options: BrowseEntrySearchOptions) => toRemoteData(mockItems) + }; + + const activatedRouteStub = Object.assign(new ActivatedRouteStub(), { + params: observableOf({}) + }); + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule.forRoot()], + declarations: [BrowseByMetadataPageComponent, EnumKeysPipe], + providers: [ + { provide: ActivatedRoute, useValue: activatedRouteStub }, + { provide: BrowseService, useValue: mockBrowseService } + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BrowseByMetadataPageComponent); + comp = fixture.componentInstance; + fixture.detectChanges(); + browseService = (comp as any).browseService; + route = (comp as any).route; + route.params = observableOf({}); + comp.ngOnInit(); + fixture.detectChanges(); + }); + + it('should fetch the correct entries depending on the metadata definition', () => { + comp.browseEntries$.subscribe((result) => { + expect(result.payload.page).toEqual(mockEntries.filter((entry) => entry.type === 'author')); + }); + }); + + it('should not fetch any items when no value is provided', () => { + expect(comp.items$).toBeUndefined(); + }); + + describe('when a value is provided', () => { + beforeEach(() => { + const paramsWithValue = { + metadata: 'author', + value: 'John Doe' + }; + + route.params = observableOf(paramsWithValue); + comp.ngOnInit(); + }); + + it('should fetch items', () => { + comp.items$.subscribe((result) => { + expect(result.payload.page).toEqual(mockItems); + }); + }) + }); + + describe('when calling browseParamsToOptions', () => { + let result: BrowseEntrySearchOptions; + + beforeEach(() => { + const paramsWithPaginationAndScope = { + page: 5, + pageSize: 10, + sortDirection: SortDirection.ASC, + sortField: 'fake-field', + scope: 'fake-scope' + }; + + result = browseParamsToOptions(paramsWithPaginationAndScope, Object.assign({}), Object.assign({}), 'author'); + }); + + it('should return BrowseEntrySearchOptions with the correct properties', () => { + expect(result.metadataDefinition).toEqual('author'); + expect(result.pagination.currentPage).toEqual(5); + expect(result.pagination.pageSize).toEqual(10); + expect(result.sort.direction).toEqual(SortDirection.ASC); + expect(result.sort.field).toEqual('fake-field'); + expect(result.scope).toEqual('fake-scope'); + }) + }); +}); + +export function toRemoteData(objects: any[]): Observable>> { + return observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), objects))); +} diff --git a/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.ts b/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.ts index 48f9c8b6ca..31e8878d7c 100644 --- a/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.ts +++ b/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.ts @@ -3,7 +3,6 @@ import {combineLatest as observableCombineLatest, Observable, Subscription } fr import { Component, OnInit } from '@angular/core'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list'; -import { ItemDataService } from '../../core/data/item-data.service'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { ActivatedRoute } from '@angular/router'; @@ -71,8 +70,7 @@ export class BrowseByMetadataPageComponent implements OnInit { */ value = ''; - public constructor(private itemDataService: ItemDataService, - private route: ActivatedRoute, + public constructor(private route: ActivatedRoute, private browseService: BrowseService) { } diff --git a/src/app/+browse-by/+browse-by-title-page/browse-by-title-page.component.spec.ts b/src/app/+browse-by/+browse-by-title-page/browse-by-title-page.component.spec.ts new file mode 100644 index 0000000000..530e57e3bb --- /dev/null +++ b/src/app/+browse-by/+browse-by-title-page/browse-by-title-page.component.spec.ts @@ -0,0 +1,67 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { Item } from '../../core/shared/item.model'; +import { ActivatedRouteStub } from '../../shared/testing/active-router-stub'; +import { of as observableOf } from 'rxjs/internal/observable/of'; +import { CommonModule } from '@angular/common'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { EnumKeysPipe } from '../../shared/utils/enum-keys-pipe'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { toRemoteData } from '../+browse-by-metadata-page/browse-by-metadata-page.component.spec'; +import { BrowseByTitlePageComponent } from './browse-by-title-page.component'; +import { ItemDataService } from '../../core/data/item-data.service'; + +describe('BrowseByTitlePageComponent', () => { + let comp: BrowseByTitlePageComponent; + let fixture: ComponentFixture; + let itemDataService: ItemDataService; + let route: ActivatedRoute; + + const mockItems = [ + Object.assign(new Item(), { + id: 'fakeId', + metadata: [ + { + key: 'dc.title', + value: 'Fake Title' + } + ] + }) + ]; + + const mockItemDataService = { + findAll: () => toRemoteData(mockItems) + }; + + const activatedRouteStub = Object.assign(new ActivatedRouteStub(), { + params: observableOf({}) + }); + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule.forRoot()], + declarations: [BrowseByTitlePageComponent, EnumKeysPipe], + providers: [ + { provide: ActivatedRoute, useValue: activatedRouteStub }, + { provide: ItemDataService, useValue: mockItemDataService } + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BrowseByTitlePageComponent); + comp = fixture.componentInstance; + fixture.detectChanges(); + itemDataService = (comp as any).itemDataService; + route = (comp as any).route; + }); + + it('should initialize the list of items', () => { + comp.items$.subscribe((result) => { + expect(result.payload.page).toEqual(mockItems); + }); + }); +});