From 91c6c60de8f8a50842ef9c6cf5fd3b1990b9885c Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Thu, 19 Oct 2017 13:30:13 +0200 Subject: [PATCH] added HalEndpointService spec --- src/app/core/data/item-data.service.spec.ts | 94 +++++++++++++++++++++ src/app/core/data/item-data.service.ts | 29 ++++--- 2 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 src/app/core/data/item-data.service.spec.ts diff --git a/src/app/core/data/item-data.service.spec.ts b/src/app/core/data/item-data.service.spec.ts new file mode 100644 index 0000000000..7d610bfaae --- /dev/null +++ b/src/app/core/data/item-data.service.spec.ts @@ -0,0 +1,94 @@ +import { Store } from '@ngrx/store'; +import { cold, getTestScheduler } from 'jasmine-marbles'; +import { TestScheduler } from 'rxjs/Rx'; +import { GlobalConfig } from '../../../config/global-config.interface'; +import { BrowseService } from '../browse/browse.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ResponseCacheService } from '../cache/response-cache.service'; +import { CoreState } from '../core.reducers'; +import { ItemDataService } from './item-data.service'; +import { RequestService } from './request.service'; + +describe('ItemDataService', () => { + let scheduler: TestScheduler; + let service: ItemDataService; + let bs: BrowseService; + + const requestService = {} as RequestService; + const responseCache = {} as ResponseCacheService; + const rdbService = {} as RemoteDataBuildService; + const store = {} as Store; + const EnvConfig = {} as GlobalConfig; + + const scopeID = '4af28e99-6a9c-4036-a199-e1b587046d39'; + const browsesEndpoint = 'https://rest.api/discover/browses'; + const itemBrowseEndpoint = `${browsesEndpoint}/author/items`; + const scopedEndpoint = `${itemBrowseEndpoint}?scope=${scopeID}`; + const serviceEndpoint = `https://rest.api/core/items`; + const browseError = new Error('getBrowseURL failed'); + + function initMockBrowseService(isSuccessful: boolean) { + const obs = isSuccessful ? + cold('--a-', { a: itemBrowseEndpoint }) : + cold('--#-', undefined, browseError); + return jasmine.createSpyObj('bs', { + getBrowseURLFor: obs + }); + } + + function initTestService() { + return new ItemDataService( + responseCache, + requestService, + rdbService, + store, + EnvConfig, + bs + ); + } + + describe('getScopedEndpoint', () => { + beforeEach(() => { + scheduler = getTestScheduler(); + }); + + it('should return the endpoint to fetch Items within the given scope', () => { + bs = initMockBrowseService(true); + service = initTestService(); + + const result = service.getScopedEndpoint(scopeID); + const expected = cold('--b-', { b: scopedEndpoint }); + + expect(result).toBeObservable(expected); + }); + + describe('if the dc.date.issue browse isn\'t configured for items', () => { + beforeEach(() => { + bs = initMockBrowseService(false); + service = initTestService(); + }); + it('should throw an error', () => { + const result = service.getScopedEndpoint(scopeID); + const expected = cold('--#-', undefined, browseError); + + expect(result).toBeObservable(expected); + }); + }); + + describe('if the scope is not specified', () => { + beforeEach(() => { + bs = initMockBrowseService(true); + service = initTestService(); + spyOn(service, 'getEndpoint').and.returnValue(cold('--b-', { b: serviceEndpoint })) + }); + + it('should return this.getEndpoint()', () => { + const result = service.getScopedEndpoint(undefined); + const expected = cold('--c-', { c: serviceEndpoint }); + + expect(result).toBeObservable(expected); + }); + }); + + }); +}); diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts index bbb03acb1d..addb290e90 100644 --- a/src/app/core/data/item-data.service.ts +++ b/src/app/core/data/item-data.service.ts @@ -1,18 +1,19 @@ import { Inject, Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; - -import { DataService } from './data.service'; -import { Item } from '../shared/item.model'; +import { Observable } from 'rxjs/Observable'; +import { GLOBAL_CONFIG, GlobalConfig } from '../../../config'; +import { isEmpty, isNotEmpty } from '../../shared/empty.util'; +import { BrowseService } from '../browse/browse.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { NormalizedItem } from '../cache/models/normalized-item.model'; import { ResponseCacheService } from '../cache/response-cache.service'; import { CoreState } from '../core.reducers'; -import { NormalizedItem } from '../cache/models/normalized-item.model'; +import { Item } from '../shared/item.model'; +import { URLCombiner } from '../url-combiner/url-combiner'; + +import { DataService } from './data.service'; import { RequestService } from './request.service'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { GLOBAL_CONFIG, GlobalConfig } from '../../../config'; -import { Observable } from 'rxjs/Observable'; -import { BrowseService } from '../browse/browse.service'; -import { isNotEmpty } from '../../shared/empty.util'; @Injectable() export class ItemDataService extends DataService { @@ -30,9 +31,13 @@ export class ItemDataService extends DataService { } public getScopedEndpoint(scopeID: string): Observable { - return this.bs.getBrowseURLFor('dc.date.issued', this.linkName) - .filter((href) => isNotEmpty(href)) - .distinctUntilChanged(); + if (isEmpty(scopeID)) { + return this.getEndpoint(); + } else { + return this.bs.getBrowseURLFor('dc.date.issued', this.linkName) + .filter((href: string) => isNotEmpty(href)) + .distinctUntilChanged(); + } } }