From 07c1771b0d77fe111e216441d8e5c53483cc0372 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Tue, 21 May 2024 11:53:49 +0200 Subject: [PATCH] OZG-5012 adjust getItems function - use other linkRel --- .../src/lib/bescheid.service.ts | 3 +- .../list-resource.service.itcase.spec.ts | 2 + .../resource/list-resource.service.spec.ts | 56 ++++++++++++++++--- .../src/lib/resource/list-resource.service.ts | 14 +++-- .../src/lib/resource/resource.model.ts | 1 + .../src/lib/resource/resource.service.ts | 12 ++++ 6 files changed, 72 insertions(+), 16 deletions(-) diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts index 2a1800665c..51939bd892 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -50,7 +50,7 @@ import { import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resource.repository'; import { ResourceService } from '../../../tech-shared/src/lib/resource/resource.service'; import { BescheidFacade } from './+state/bescheid.facade'; -import { BescheidLinkRel } from './bescheid.linkrel'; +import { BescheidLinkRel, BescheidListLinkRel } from './bescheid.linkrel'; import { Bescheid, BescheidListResource, @@ -131,6 +131,7 @@ export class BescheidService { return { baseResource: this.vorgangService.getVorgangWithEingang(), listLinkRel: VorgangWithEingangLinkRel.BESCHEIDE, + listResourceListLinkRel: BescheidListLinkRel.BESCHEID_LIST, }; } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts index 3d0235dc49..9e8d68e04c 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts @@ -21,6 +21,7 @@ describe.skip('ResourceListService ITCase', () => { let resourceRepository: Mock<ResourceRepository>; const listLinkRel: string = DummyListLinkRel.LIST; + const listResourceListLinkRel: string = DummyListLinkRel.LIST; const createLinkRel: string = DummyLinkRel.DUMMY; const baseResource: StateResource<Resource> = createStateResource(createDummyResource()); @@ -134,6 +135,7 @@ describe.skip('ResourceListService ITCase', () => { return { baseResource, listLinkRel, + listResourceListLinkRel, createLinkRel, }; } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts index 9d784df215..9983f8acf6 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts @@ -12,7 +12,12 @@ import { import { BehaviorSubject, Observable, of } from 'rxjs'; import { singleCold, singleHot } from '../../../test/marbles'; import { ResourceListService } from './list-resource.service'; -import { CreateResourceData, ListItemResource, ListResourceServiceConfig } from './resource.model'; +import { + CreateResourceData, + LinkRelationName, + ListItemResource, + ListResourceServiceConfig, +} from './resource.model'; import { ResourceRepository } from './resource.repository'; import { ListResource, @@ -21,6 +26,8 @@ import { createStateResource, } from './resource.util'; +import { EMPTY_ARRAY } from '../tech.util'; + import * as ResourceUtil from './resource.util'; describe('ListResourceService', () => { @@ -28,8 +35,9 @@ describe('ListResourceService', () => { let config: ListResourceServiceConfig<Resource>; let resourceRepository: Mock<ResourceRepository>; - const listLinkRel: string = DummyListLinkRel.LIST; - const createLinkRel: string = DummyLinkRel.DUMMY; + const listLinkRel: LinkRelationName = DummyListLinkRel.LIST; + const createLinkRel: LinkRelationName = DummyLinkRel.DUMMY; + const listResourceListLinkRel: LinkRelationName = DummyListLinkRel.LIST; const listResource: ListResource = createDummyListResource([listLinkRel, createLinkRel]); const baseResource: Resource = createDummyResource(); @@ -42,6 +50,7 @@ describe('ListResourceService', () => { config = { baseResource: baseResourceSubj, listLinkRel, + listResourceListLinkRel, createLinkRel, }; resourceRepository = mock(ResourceRepository); @@ -475,23 +484,52 @@ describe('ListResourceService', () => { }); describe('get items', () => { + const listResourceItems: ListItemResource[] = [createDummyResource()]; + const stateListResource: StateResource<ListResource> = createStateResource( + createFilledDummyListResource(listResourceItems), + ); + let getListSpy: jest.SpyInstance; + + beforeEach(() => { + getListSpy = service.getList = jest.fn().mockReturnValue(of(stateListResource)); + }); + + it('should get list', () => { + service.getItems(); + + expect(getListSpy).toHaveBeenCalled(); + }); + + it('should call get embedded resources', () => { + const spy = jest.spyOn(ResourceUtil, 'getEmbeddedResources'); + service.getItems().subscribe(); + + expect(spy).toHaveBeenCalledWith(stateListResource, listResourceListLinkRel); + }); + it('should return empty array on empty stateResource', (done) => { - service.listResource.next(createEmptyStateResource()); + service.getList = jest.fn().mockReturnValue(of(createEmptyStateResource())); service.getItems().subscribe((items) => { - expect(items).toEqual([]); + expect(items).toEqual(EMPTY_ARRAY); done(); }); }); it('should return listresource items', (done) => { - const listIems: Resource[] = [createDummyResource()]; - service.listResource.next(createStateResource(createFilledDummyListResource(listIems))); - service.getItems().subscribe((items) => { - expect(items).toEqual(listIems); + expect(items).toEqual(listResourceItems); done(); }); }); + + it('should not emit on loading state resource', () => { + service.getList = jest.fn().mockReturnValue(of(createEmptyStateResource(true))); + + const spy = jest.spyOn(ResourceUtil, 'getEmbeddedResources').mockClear(); + service.getItems().subscribe(); + + expect(spy).not.toHaveBeenCalled(); + }); }); }); diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts index 76cefcf0b5..631e1c685e 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts @@ -231,12 +231,14 @@ export class ResourceListService< } public getItems(): Observable<ListItemResource[]> { - return this.listResource - .asObservable() - .pipe( - map((listStateResource: StateResource<T>) => - getEmbeddedResources<ListItemResource>(listStateResource, this.config.listLinkRel), + return this.getList().pipe( + filter((listStateResource: StateResource<T>) => !listStateResource.loading), + map((listStateResource: StateResource<T>) => + getEmbeddedResources<ListItemResource>( + listStateResource, + this.config.listResourceListLinkRel, ), - ); + ), + ); } } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts index e7e4b3264d..5fa5264f32 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts @@ -5,6 +5,7 @@ import { StateResource } from './resource.util'; export interface ListResourceServiceConfig<B> { baseResource: Observable<StateResource<B>>; listLinkRel: LinkRelationName; + listResourceListLinkRel: LinkRelationName; createLinkRel?: LinkRelationName; } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts index b3c8dca21b..b87ef49e8d 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts @@ -156,6 +156,9 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { this.stateResource.next({ ...this.stateResource.value, reload: true }); } + /** + * @deprecated + */ public canEdit(): boolean { return this.hasLinkRel(this.config.edit.linkRel); } @@ -164,10 +167,16 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { return hasLink(this.getResource(), linkRel); } + /** + * @deprecated + */ public getResource(): T { return this.stateResource.value.resource; } + /** + * @deprecated + */ public canDelete(): boolean { return this.hasLinkRel(this.config.delete.linkRel); } @@ -176,6 +185,9 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { throwErrorOn(!this.canDelete(), 'No delete link exists on current stateresource.'); } + /** + * @deprecated + */ public exists(): boolean { return isNotNull(this.stateResource.value.resource); } -- GitLab