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 bb5149c4a69fe064abed82a848a63e0318b88cf9..abd5f0d05bd073f54ed85352b565fa1df62350d3 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 @@ -17,6 +17,10 @@ import { import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resource.repository'; import { CommandOrder, CommandService, CreateCommand } from '@alfa-client/command-shared'; import faker from '@faker-js/faker'; +import { createBescheidStateResource } from '../test/bescheid'; +import { createCommandStateResource } from '../../../command-shared/test/command'; +import { CommandLinkRel } from '../../../command-shared/src/lib/command.linkrel'; +import { cold } from 'jest-marbles'; describe('BescheidService', () => { let service: BescheidService; @@ -74,31 +78,70 @@ describe('BescheidService', () => { describe('bescheiderstellungUeberspringen', () => { let vorgang: VorgangWithEingangResource; + let getBescheidDraft: jest.Mock; + let deleteBescheid: jest.Mock; beforeEach(() => { vorgang = createVorgangWithEingangResource(); + getBescheidDraft = service.getBescheidDraft = jest.fn(); + deleteBescheid = service.deleteBescheid = jest.fn(); }); - it('should create command', () => { - service.bescheiderstellungUeberspringen(vorgang); + it('should get bescheid draft', (done) => { + getBescheidDraft.mockReturnValue(of(createBescheidStateResource())); + commandService.createCommand.mockReturnValue(of(createCommandStateResource())); + deleteBescheid.mockReturnValue(of(createCommandStateResource())); - expect(commandService.createCommand).toHaveBeenCalledWith( - vorgang, - VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, - { - order: CommandOrder.VORGANG_ABSCHLIESSEN, - body: null, - } as CreateCommand, - ); + const command$ = service.bescheiderstellungUeberspringen(vorgang); + + command$.subscribe(() => { + expect(getBescheidDraft).toHaveBeenCalled(); + done(); + }); + }); + + it('should vorgang abschliessen', (done) => { + getBescheidDraft.mockReturnValue(of(createBescheidStateResource())); + commandService.createCommand.mockReturnValue(of(createCommandStateResource())); + deleteBescheid.mockReturnValue(of(createCommandStateResource())); + + const command$ = service.bescheiderstellungUeberspringen(vorgang); + + command$.subscribe(() => { + expect(commandService.createCommand).toHaveBeenCalledWith( + vorgang, + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + { + order: CommandOrder.VORGANG_ABSCHLIESSEN, + body: null, + } as CreateCommand, + ); + done(); + }); + }); + + it('should delete bescheid', (done) => { + getBescheidDraft.mockReturnValue(of(createBescheidStateResource())); + commandService.createCommand.mockReturnValue(of(createCommandStateResource())); + deleteBescheid.mockReturnValue(of(createCommandStateResource())); + + const command$ = service.bescheiderstellungUeberspringen(vorgang); + + command$.subscribe(() => { + expect(deleteBescheid).toHaveBeenCalled(); + done(); + }); }); it('should return command', () => { - const command = createEmptyStateResource(); - commandService.createCommand.mockReturnValue(command); + const deleteBescheidCommand = createCommandStateResource([CommandLinkRel.EFFECTED_RESOURCE]); + getBescheidDraft.mockReturnValue(of(createBescheidStateResource())); + commandService.createCommand.mockReturnValue(of(createCommandStateResource())); + deleteBescheid.mockReturnValue(of(deleteBescheidCommand)); - const createdCommand = service.bescheiderstellungUeberspringen(vorgang); + const command$ = service.bescheiderstellungUeberspringen(vorgang); - expect(createdCommand).toEqual(command); + expect(command$).toBeObservable(cold('(a|)', { a: deleteBescheidCommand })); }); }); 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 ecb47bcb7af8a4f29c20685c00fed5202aebbe24..e46d23967d0db4151df9ed34471ce1d760dca9f9 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -6,7 +6,7 @@ import { VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { Observable, of, switchMap } from 'rxjs'; import { ResourceServiceConfig } from '../../../tech-shared/src/lib/resource/resource.model'; import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resource.repository'; import { ResourceService } from '../../../tech-shared/src/lib/resource/resource.service'; @@ -63,13 +63,23 @@ export class BescheidService { public bescheiderstellungUeberspringen( vorgangWithEingangResource: VorgangWithEingangResource, ): Observable<StateResource<CommandResource>> { - return this.commandService.createCommand( - vorgangWithEingangResource, - VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, - { - order: CommandOrder.VORGANG_ABSCHLIESSEN, - body: null, - }, + return this.getBescheidDraft().pipe( + switchMap((bescheidStateResource) => + this.commandService + .createCommand( + vorgangWithEingangResource, + VorgangWithEingangLinkRel.UEBERSPRINGEN_UND_ABSCHLIESSEN, + { + order: CommandOrder.VORGANG_ABSCHLIESSEN, + body: null, + }, + ) + .pipe( + switchMap(() => + this.deleteBescheid(bescheidStateResource.resource.id, vorgangWithEingangResource), + ), + ), + ), ); } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.spec.ts index d0f1d93894ddd296120031904fba446c59416c7e..4c10e6dd53054a691a86f3dd75cb5bc07b079c73 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.spec.ts @@ -8,14 +8,12 @@ import { MatIcon } from '@angular/material/icon'; import { BescheidService } from '@alfa-client/bescheid-shared'; import { createVorgangWithEingangResource } from '../../../../../../../../vorgang-shared/test/vorgang'; import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; -import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { BescheiderstellungUeberspringenDailogData } from '@alfa-client/vorgang-detail'; import { createCommandStateResource } from '../../../../../../../../command-shared/test/command'; import { lastValueFrom, of } from 'rxjs'; -import { BescheiderstellungUeberspringenDailogData } from '@alfa-client/vorgang-detail'; import { cold } from 'jest-marbles'; -import { createBescheidStateResource } from '../../../../../../../../bescheid-shared/src/test/bescheid'; +import { createEmptyStateResource } from '@alfa-client/tech-shared'; import { CommandLinkRel } from '../../../../../../../../command-shared/src/lib/command.linkrel'; -import { CommandResource } from '@alfa-client/command-shared'; describe('VorgangDetailBescheidenUeberspringenButtonComponent', () => { let component: VorgangDetailBescheidenUeberspringenDialogComponent; @@ -79,98 +77,57 @@ describe('VorgangDetailBescheidenUeberspringenButtonComponent', () => { }); describe('onConfirm', () => { - it('should get bescheid draft', async () => { - const lastValue = givenSuccessfullyLoadedResources(); - - when(); - - await lastValueToEmit(lastValue); - expect(bescheidService.getBescheidDraft).toHaveBeenCalled(); - }); - - it('should überspringen Bescheiderstellung', async () => { - const lastValue = givenSuccessfullyLoadedResources(); - - when(); - - await lastValueToEmit(lastValue); - expect(bescheidService.bescheiderstellungUeberspringen).toHaveBeenCalled(); - }); + it('should Bescheiderstellung Überspringen', async () => { + bescheidService.bescheiderstellungUeberspringen.mockReturnValue( + of(createCommandStateResource()), + ); - it('should delete Bescheid', async () => { - const lastValue = givenSuccessfullyLoadedResources(); + component.onConfirm(); - when(); + await lastValueFrom(component.bescheiderstellungUeberspringen$); - await lastValueToEmit(lastValue); - expect(bescheidService.deleteBescheid).toHaveBeenCalled(); + expect(bescheidService.bescheiderstellungUeberspringen).toHaveBeenCalledWith( + vorgangWithEingangResource, + ); }); - it('should emit commands', () => { - const ueberspringenCommandStateResource = createCommandStateResource(); - const deleteCommandStateResource = createCommandStateResource(); - bescheidService.getBescheidDraft.mockReturnValue( - cold('a', { a: createBescheidStateResource() }), - ); + it('should emit values', () => { + const loadingCommand = createEmptyStateResource(true); + const bescheiderstellungUeberspringenCommand = createCommandStateResource(); bescheidService.bescheiderstellungUeberspringen.mockReturnValue( - cold('a', { a: ueberspringenCommandStateResource }), + cold('-a', { a: bescheiderstellungUeberspringenCommand }), ); - bescheidService.deleteBescheid.mockReturnValue(cold('-a', { a: deleteCommandStateResource })); - when(); + component.onConfirm(); expect(component.bescheiderstellungUeberspringen$).toBeObservable( - cold('ab', { - a: createEmptyStateResource(true), - b: deleteCommandStateResource, - }), + cold('ab', { a: loadingCommand, b: bescheiderstellungUeberspringenCommand }), ); }); it('should close all dialogs on success', async () => { - const lastValue = givenSuccessfullyLoadedResources(); - - when(); - - await lastValueToEmit(lastValue); - expect(ozgcloudDialogService.closeAll).toHaveBeenCalled(); - }); - - it('should not close all dialogs on get bescheid draft failure', async () => { - bescheidService.getBescheidDraft.mockReturnValue(of(createBescheidStateResource())); bescheidService.bescheiderstellungUeberspringen.mockReturnValue( of(createCommandStateResource([CommandLinkRel.EFFECTED_RESOURCE])), ); - const lastValue = createCommandStateResource(); - bescheidService.deleteBescheid.mockReturnValue(of(lastValue)); - when(); + component.onConfirm(); - await expect(lastValueFrom(component.bescheiderstellungUeberspringen$)).resolves.toEqual( - lastValue, - ); - expect(ozgcloudDialogService.closeAll).not.toHaveBeenCalled(); + await lastValueFrom(component.bescheiderstellungUeberspringen$); + + expect(ozgcloudDialogService.closeAll).toHaveBeenCalled(); }); - function givenSuccessfullyLoadedResources(): StateResource<CommandResource> { - bescheidService.getBescheidDraft.mockReturnValue(of(createBescheidStateResource())); + it('should not close all dialogs on failure', async () => { bescheidService.bescheiderstellungUeberspringen.mockReturnValue( - of(createCommandStateResource([CommandLinkRel.EFFECTED_RESOURCE])), + of(createCommandStateResource()), ); - const lastValue = createCommandStateResource([CommandLinkRel.EFFECTED_RESOURCE]); - bescheidService.deleteBescheid.mockReturnValue(of(lastValue)); - return lastValue; - } - function when(): void { component.onConfirm(); - } - async function lastValueToEmit(lastValue: StateResource<CommandResource>) { - await expect(lastValueFrom(component.bescheiderstellungUeberspringen$)).resolves.toEqual( - lastValue, - ); - } + await lastValueFrom(component.bescheiderstellungUeberspringen$); + + expect(ozgcloudDialogService.closeAll).not.toHaveBeenCalled(); + }); }); describe('onClose', () => { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.ts index 1de2673a968c331d0055a71acb4e414c8f1c6698..6af40f56481e52fe3a1ecfacf3ac8fabbe9765e3 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-ueberspringen-dialog/vorgang-detail-bescheiden-ueberspringen-dialog.component.ts @@ -2,7 +2,7 @@ import { Component, Inject } from '@angular/core'; import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog'; import { OzgcloudDialogService } from '@alfa-client/ui'; import { BescheidService } from '@alfa-client/bescheid-shared'; -import { Observable, startWith, switchMap, tap } from 'rxjs'; +import { Observable, startWith, tap } from 'rxjs'; import { CommandResource, isSuccessfulDone } from '@alfa-client/command-shared'; import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { BescheiderstellungUeberspringenDailogData } from '@alfa-client/vorgang-detail'; @@ -26,29 +26,16 @@ export class VorgangDetailBescheidenUeberspringenDialogComponent { } onConfirm() { - this.bescheiderstellungUeberspringen$ = this.bescheidService.getBescheidDraft().pipe( - switchMap((bescheidStateResource) => - this.bescheidService - .bescheiderstellungUeberspringen(this.dialogData.vorgangWithEingangResource) - .pipe( - switchMap(() => - this.bescheidService - .deleteBescheid( - bescheidStateResource.resource.id, - this.dialogData.vorgangWithEingangResource, - ) - .pipe( - tap((command) => { - if (isSuccessfulDone(command.resource)) { - this.ozgcloudDialogService.closeAll(); - } - }), - ), - ), - ), - ), - startWith(createEmptyStateResource<CommandResource>(true)), - ); + this.bescheiderstellungUeberspringen$ = this.bescheidService + .bescheiderstellungUeberspringen(this.dialogData.vorgangWithEingangResource) + .pipe( + startWith(createEmptyStateResource<CommandResource>(true)), + tap((command) => { + if (isSuccessfulDone(command.resource)) { + this.ozgcloudDialogService.closeAll(); + } + }), + ); } onClose() {