diff --git a/src/app/core/data/request.service.spec.ts b/src/app/core/data/request.service.spec.ts index b70f2dc47d..cfb3611fc6 100644 --- a/src/app/core/data/request.service.spec.ts +++ b/src/app/core/data/request.service.spec.ts @@ -140,13 +140,21 @@ describe('RequestService', () => { describe('getByUUID', () => { describe('if the request with the specified UUID exists in the store', () => { beforeEach(() => { + let callCounter = 0; + const responses = [ + cold('a', { // A direct hit in the request cache + a: { + completed: true + } + }), + cold('b', { b: undefined }), // No hit in the index + cold('c', { c: undefined }) // So no mapped hit in the request cache + ]; selectSpy.and.callFake(() => { return () => { - return () => hot('a', { - a: { - completed: true - } - }); + const response = responses[callCounter]; + callCounter++; + return () => response; }; }); }); @@ -165,17 +173,25 @@ describe('RequestService', () => { describe(`if the request with the specified UUID doesn't exist in the store `, () => { beforeEach(() => { + let callCounter = 0; + const responses = [ + cold('a', { a: undefined }), // No direct hit in the request cache + cold('b', { b: undefined }), // No hit in the index + cold('c', { c: undefined }), // So no mapped hit in the request cache + ]; selectSpy.and.callFake(() => { return () => { - return () => hot('a', { a: undefined }); + const response = responses[callCounter]; + callCounter++; + return () => response; }; }); }); - it(`it shouldn't return anything`, () => { + it('should return an Observable of undefined', () => { const result = service.getByUUID(testUUID); - scheduler.expectObservable(result).toBe(''); + scheduler.expectObservable(result).toBe('a', { a: undefined }); }); }); @@ -183,12 +199,11 @@ describe('RequestService', () => { beforeEach(() => { let callCounter = 0; const responses = [ - cold('a', { a: undefined }), // No hit in the request cache with that UUID + cold('a', { a: undefined }), // No direct hit in the request cache with that UUID cold('b', { b: 'otherRequestUUID' }), // A hit in the index, which returns the uuid of the cached request - cold('c', { c: { // the call to retrieve the cached request using the UUID from the index - c: { - completed: true - } + cold('c', { // the call to retrieve the cached request using the UUID from the index + c: { + completed: true } }) ]; @@ -204,10 +219,9 @@ describe('RequestService', () => { it(`it should return the cached request`, () => { const result = service.getByUUID(testUUID); - scheduler.expectObservable(result).toBe('c', { c: { - c: { - completed: true - } + scheduler.expectObservable(result).toBe('c', { + c: { + completed: true } }); }); diff --git a/src/app/core/data/request.service.ts b/src/app/core/data/request.service.ts index f69ad646f7..105d84cf4a 100644 --- a/src/app/core/data/request.service.ts +++ b/src/app/core/data/request.service.ts @@ -2,8 +2,8 @@ import { Injectable } from '@angular/core'; import { HttpHeaders } from '@angular/common/http'; import { createSelector, MemoizedSelector, select, Store } from '@ngrx/store'; -import { Observable, race as observableRace } from 'rxjs'; -import { filter, map, mergeMap, take, switchMap } from 'rxjs/operators'; +import { Observable, combineLatest as observableCombineLatest } from 'rxjs'; +import { filter, map, mergeMap, take, switchMap, startWith } from 'rxjs/operators'; import { cloneDeep, remove } from 'lodash'; import { hasValue, isEmpty, isNotEmpty, hasValueOperator } from '../../shared/empty.util'; import { CacheableObject } from '../cache/object-cache.reducer'; @@ -110,24 +110,19 @@ export class RequestService { * Retrieve a RequestEntry based on their uuid */ getByUUID(uuid: string): Observable { - return observableRace( + return observableCombineLatest([ this.store.pipe( - select(entryFromUUIDSelector(uuid)), - hasValueOperator() + select(entryFromUUIDSelector(uuid)) ), this.store.pipe( select(originalRequestUUIDFromRequestUUIDSelector(uuid)), switchMap((originalUUID) => { - if (hasValue(originalUUID)) { return this.store.pipe(select(entryFromUUIDSelector(originalUUID))) - } else { - return [] - } }, ), - hasValueOperator() - ) - ).pipe( + ), + ]).pipe( + map((entries: RequestEntry[]) => entries.find((entry: RequestEntry) => hasValue(entry))), map((entry: RequestEntry) => { // Headers break after being retrieved from the store (because of lazy initialization) // Combining them with a new object fixes this issue