From ed1d6ac2b11fb9dc4e23c17b3c0835f21eefc265 Mon Sep 17 00:00:00 2001 From: Albert <Albert.Bruns@mgm-tp.com> Date: Tue, 8 Apr 2025 10:30:15 +0200 Subject: [PATCH] OZG-3563 fix reload issue --- .../src/lib/bescheid.service.spec.ts | 24 +++++++++++++++++-- .../src/lib/bescheid.service.ts | 18 ++++++++++---- .../libs/tech-shared/src/lib/ngrx/actions.ts | 2 +- .../src/lib/resource/resource.loader.ts | 1 - .../src/lib/resource/resource.service.spec.ts | 8 +++++++ .../src/lib/resource/resource.service.ts | 4 ++++ 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts index 1597dacfb9..547d5e3c89 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts @@ -40,6 +40,7 @@ import { PostfachService } from '@alfa-client/postfach-shared'; import { createEmptyStateResource, createErrorStateResource, + createLoadSuccessAction, createStateResource, EMPTY_STRING, getEmbeddedResources, @@ -51,11 +52,12 @@ import { Mock, mock } from '@alfa-client/test-utils'; import { VorgangCommandService, VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { TestBed } from '@angular/core/testing'; import { faker } from '@faker-js/faker'; +import { Actions } from '@ngrx/effects'; import { getUrl, LinkRel, ResourceUri } from '@ngxp/rest'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createProblemDetail } from 'libs/tech-shared/test/error'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; -import { EMPTY, Observable, of } from 'rxjs'; +import { EMPTY, Observable, of, ReplaySubject } from 'rxjs'; import { createBinaryFileListResource, createBinaryFileResource } from '../../../binary-file-shared/test/binary-file'; import { createCommandErrorStateResource, @@ -95,8 +97,10 @@ import { createBescheidResourceService, } from '@alfa-client/bescheid-shared'; import { expect } from '@jest/globals'; +import { Action } from '@ngrx/store'; import { cold } from 'jest-marbles'; import * as DateUtil from '../../../tech-shared/src/lib/date.util'; +import { BESCHEID_DRAFT_PATH, BESCHEID_FEATURE_KEY } from './+state/bescheid.reducer'; jest.mock('@alfa-client/bescheid-shared', () => { const originalModule = jest.requireActual('@alfa-client/bescheid-shared'); @@ -123,6 +127,7 @@ describe('BescheidService', () => { let postfachService: Mock<PostfachService>; let bescheidResourceService: Mock<BescheidResourceService>; let bescheidListResourceService: Mock<BescheidListResourceService>; + let actions$: ReplaySubject<Action>; const vorgangWithEingangResource: VorgangWithEingangResource = createVorgangWithEingangResource(); const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = @@ -142,6 +147,7 @@ describe('BescheidService', () => { postfachService = mock(PostfachService); bescheidResourceService = mock(CommandResourceService); bescheidListResourceService = mock(CommandListResourceService); + actions$ = new ReplaySubject<Action>(1); (createBescheidResourceService as jest.Mock).mockReturnValue(bescheidResourceService); (createBescheidListResourceService as jest.Mock).mockReturnValue(bescheidListResourceService); @@ -155,6 +161,8 @@ describe('BescheidService', () => { { provide: BinaryFileService, useValue: binaryFileService }, { provide: PostfachService, useValue: postfachService }, { provide: StateService, useValue: stateService }, + { provide: Actions, useValue: new Actions(actions$) }, + BescheidService, ], }); @@ -800,9 +808,13 @@ describe('BescheidService', () => { }); describe('sendBescheid', () => { + const bescheidDraftStateInfo = { name: BESCHEID_FEATURE_KEY, path: BESCHEID_DRAFT_PATH }; + beforeEach(() => { service.getBescheidDraft = jest.fn().mockReturnValue(of(createStateResource(bescheidResource))); commandService.createCommandByProps.mockReturnValue(EMPTY); + bescheidResourceService.getConfig = jest.fn().mockReturnValue({ stateInfo: bescheidDraftStateInfo }); + actions$.next(createLoadSuccessAction(bescheidDraftStateInfo)); }); it('should get bescheid draft', () => { @@ -811,6 +823,14 @@ describe('BescheidService', () => { expect(service.getBescheidDraft).toHaveBeenCalled(); }); + it('should not get bescheid draft when reload is not finished', () => { + actions$.next(null); + + service.sendBescheidManually().subscribe(); + + expect(service.getBescheidDraft).not.toHaveBeenCalled(); + }); + it('should create command', () => { service.sendBescheid(BescheidLinkRel.BESCHEIDEN).subscribe(); @@ -833,7 +853,7 @@ describe('BescheidService', () => { BescheidLinkRel.BESCHEIDEN, ); - expect(sendCommandStateResource$).toBeObservable(singleColdCompleted(commandStateResource)); + expect(sendCommandStateResource$).toBeObservable(singleCold(commandStateResource)); }); }); 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 4c5fdd5b4b..343846a311 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -61,6 +61,7 @@ import { import { PostfachService } from '@alfa-client/postfach-shared'; import { createEmptyStateResource, + createLoadSuccessAction, createStateResource, filterIsLoadedOrHasError, getEmbeddedResources, @@ -75,6 +76,7 @@ import { } from '@alfa-client/tech-shared'; import { VorgangCommandService, VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { inject, Injectable } from '@angular/core'; +import { Actions, ofType } from '@ngrx/effects'; import { getUrl, hasLink, LinkRel, Resource, ResourceUri } from '@ngxp/rest'; import { isNil } from 'lodash-es'; import { BehaviorSubject, filter, first, map, Observable, startWith, switchMap } from 'rxjs'; @@ -91,6 +93,7 @@ export class BescheidService { private readonly postfachService = inject(PostfachService); private readonly vorgangService = inject(VorgangService); private readonly stateService = inject(StateService); + private readonly actions = inject(Actions); // The injection of this services is problematic. // It must be analysed how to inject BescheidService via providers in BescheidSharedModule. private readonly bescheidResourceService = createBescheidResourceService( @@ -310,11 +313,16 @@ export class BescheidService { } sendBescheid(linkRel: BescheidLinkRel): Observable<StateResource<CommandResource>> { - return this.getBescheidDraft().pipe( - filter(isLoaded), - map((stateResource: StateResource<BescheidResource>) => stateResource.resource), - switchMap((bescheidResource: BescheidResource) => - this.commandService.createCommandByProps(buildSendBescheidCommandProps(bescheidResource, linkRel)), + return this.actions.pipe( + ofType(createLoadSuccessAction(this.bescheidResourceService.getConfig().stateInfo)), + switchMap(() => + this.getBescheidDraft().pipe( + filter(isLoaded), + map((stateResource: StateResource<BescheidResource>) => stateResource.resource), + switchMap((bescheidResource: BescheidResource) => + this.commandService.createCommandByProps(buildSendBescheidCommandProps(bescheidResource, linkRel)), + ), + ), ), ); } diff --git a/alfa-client/libs/tech-shared/src/lib/ngrx/actions.ts b/alfa-client/libs/tech-shared/src/lib/ngrx/actions.ts index b5bacca2af..c0c19eff84 100644 --- a/alfa-client/libs/tech-shared/src/lib/ngrx/actions.ts +++ b/alfa-client/libs/tech-shared/src/lib/ngrx/actions.ts @@ -63,7 +63,7 @@ export function createSingleResourceActions(stateInfo: StateInfo): SingleResourc return { ...actions, loadSuccessAction: createLoadSuccessAction(stateInfo) }; } -function createLoadSuccessAction(stateInfo: StateInfo): TypedActionCreatorWithProps<LoadResourceSuccessProps> { +export function createLoadSuccessAction(stateInfo: StateInfo): TypedActionCreatorWithProps<LoadResourceSuccessProps> { return createAction( createActionType(stateInfo.name, `Load ${stateInfo.path} Resource Success`), props<LoadResourceSuccessProps>(), diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.loader.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.loader.ts index d93c635a6a..5ad5a168b3 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.loader.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.loader.ts @@ -35,7 +35,6 @@ export class ResourceLoader<B extends Resource, T extends Resource> { } handleResourceChanges(stateResource: StateResource<T>, configResource: B): void { - console.log(this.config); if (!isEqual(this.configResource, configResource)) { this.handleConfigResourceChanges(stateResource, configResource); } else if (this.shouldLoadResource(stateResource, configResource)) { diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts index de222da17f..a93cac36f8 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts @@ -138,6 +138,14 @@ describe('ResourceService', () => { expect(service.resourceStateService.clearResource).toHaveBeenCalled(); }); }); + + describe('getConfig', () => { + it('should return config', () => { + const configFromService: ResourceServiceConfig<Resource> = service.getConfig(); + + expect(configFromService).toEqual(config); + }); + }); }); export class DummyResourceService<B extends Resource, T extends Resource> extends ResourceService<B, T> { 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 8eaa149bd7..1694dbb623 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 @@ -75,4 +75,8 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { public clearResource(): void { this.resourceStateService.clearResource(); } + + public getConfig(): ResourceServiceConfig<B> { + return this.config; + } } -- GitLab