diff --git a/src/app/core/data/data.service.spec.ts b/src/app/core/data/data.service.spec.ts index 64efd58418..dc661e12d7 100644 --- a/src/app/core/data/data.service.spec.ts +++ b/src/app/core/data/data.service.spec.ts @@ -894,6 +894,26 @@ describe('DataService', () => { expectObservable(done$).toBe('------(t|)', BOOLEAN); }); }); + + it('should only fire for the current state of the object (instead of tracking it)', () => { + testScheduler.run(({ cold, flush }) => { + getByHrefSpy.and.returnValue(cold('a---b---c---', { + a: { requestUUIDs: ['request1'] }, // this is the state at the moment we're invalidating the cache + b: { requestUUIDs: ['request2'] }, // we shouldn't keep tracking the state + c: { requestUUIDs: ['request3'] }, // because we may invalidate when we shouldn't + })); + + service.invalidateByHref('some-href'); + flush(); + + // requests from the first state are marked as stale + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request1'); + + // request from subsequent states are ignored + expect(requestService.setStaleByUUID).not.toHaveBeenCalledWith('request2'); + expect(requestService.setStaleByUUID).not.toHaveBeenCalledWith('request3'); + }); + }); }); describe('delete', () => { diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index 1cd9731a65..6176694d9d 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -595,6 +595,7 @@ export abstract class DataService implements UpdateDa const done$ = new AsyncSubject(); this.objectCache.getByHref(href).pipe( + take(1), switchMap((oce: ObjectCacheEntry) => observableFrom(oce.requestUUIDs).pipe( mergeMap((requestUUID: string) => this.requestService.setStaleByUUID(requestUUID)), toArray(),