diff --git a/alfa-client/libs/bescheid-shared/src/index.ts b/alfa-client/libs/bescheid-shared/src/index.ts index 16fde03966472be2f75f8d5f4a47fa8a21d4aa44..8a8af5864bd07257774992c864fd03fc821143b8 100644 --- a/alfa-client/libs/bescheid-shared/src/index.ts +++ b/alfa-client/libs/bescheid-shared/src/index.ts @@ -2,3 +2,4 @@ export * from './lib/bescheid-shared.module'; export * from './lib/bescheid.linkrel'; export * from './lib/bescheid.model'; export * from './lib/bescheid.service'; +export * from './lib/document.model'; diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts index d10b73f178585ebb0fa151c3deaed33317cdc87b..e964530ec152d458c7c979b460358c81476df685 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.linkrel.ts @@ -3,7 +3,8 @@ export enum BescheidLinkRel { UPLOAD_BESCHEID_FILE = 'uploadBescheidFile', UPLOAD_ATTACHMENT = 'uploadAttachment', UPDATE = 'update', - CREATE_BESCHEID_DOCUMENT = 'createBescheidDocument', + CREATE_DOCUMENT = 'createDocument', + CREATE_DOCUMENT_FROM_FILE = 'createDocumentFromFile', ATTACHMENTS = 'attachments', BESCHEID_DOCUMENT = 'bescheidDocument', SEND = 'send', 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 36017a1d4c3902340caa53f61d7f472a1605b781..da86ebb7e3c336964c3fd85aed986db3f8662a54 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 @@ -21,6 +21,7 @@ import { import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { VorgangCommandService, + VorgangHeaderLinkRel, VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource, @@ -257,7 +258,8 @@ describe('BescheidService', () => { }); it('should emit state resources', () => { - const bescheid$ = service.getBescheidDraftIfExists(); + const bescheid$: Observable<StateResource<BescheidResource>> = + service.getBescheidDraftIfExists(); expect(bescheid$).toBeObservable( cold('(ab|)', { a: createEmptyStateResource(), b: bescheidStateResource }), @@ -561,7 +563,7 @@ describe('BescheidService', () => { }); it('should return embedded resources', () => { - const attachments$ = service.getAttachments(); + const attachments$: Observable<BinaryFileResource[]> = service.getAttachments(); expect(attachments$).toBeObservable(singleColdCompleted([binaryFileResource])); }); @@ -589,7 +591,7 @@ describe('BescheidService', () => { createStateResource(binaryFile); service.bescheidDocumentFile$.next(binaryFileStateResource); - service.getBescheidDocumentFile().subscribe((result) => { + service.getBescheidDocumentFile().subscribe((result: StateResource<BinaryFileResource>) => { expect(result).toBe(binaryFileStateResource); done(); }); @@ -1025,10 +1027,10 @@ describe('BescheidService', () => { }); it('should return command', () => { - const command = createCommandStateResource(); + const command: StateResource<CommandResource> = createCommandStateResource(); service.deleteBescheid = jest.fn().mockReturnValue(singleCold(command)); - const command$ = service.bescheidVerwerfen(); + const command$: Observable<StateResource<CommandResource>> = service.bescheidVerwerfen(); expect(command$).toBeObservable(singleCold(command)); }); @@ -1066,4 +1068,61 @@ describe('BescheidService', () => { expect(service.createBescheidDocumentInProgress$.value.loading).toBeFalsy(); }); }); + + describe('getBescheidDocument', () => { + it('should return bescheid document', () => { + const documentStateResource: StateResource<DocumentResource> = + createStateResource(createDocumentResource()); + service.bescheidDocument$.next(documentStateResource); + + const bescheidDocument$: Observable<StateResource<DocumentResource>> = + service.getBescheidDocument(); + + expect(bescheidDocument$).toBeObservable(singleCold(documentStateResource)); + }); + }); + + describe('getEmpfaenger', () => { + it('should return Empfänger', () => { + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); + const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = + createStateResource(vorgangWithEingangResource); + vorgangService.getVorgangWithEingang.mockReturnValue(of(vorgangWithEingangStateResource)); + + const empfaenger$: Observable<string> = service.getEmpfaenger(); + + expect(empfaenger$).toBeObservable( + singleColdCompleted( + `${vorgangWithEingangResource.eingang.antragsteller.vorname} ${vorgangWithEingangResource.eingang.antragsteller.nachname}`, + ), + ); + }); + }); + + describe('isPostfachConfigured', () => { + it('should return true', () => { + vorgangService.getVorgangWithEingang.mockReturnValue( + of( + createStateResource( + createVorgangWithEingangResource([VorgangHeaderLinkRel.POSTFACH_MAILS]), + ), + ), + ); + + const isPostfachConfigured$: Observable<boolean> = service.isPostfachConfigured(); + + expect(isPostfachConfigured$).toBeObservable(singleColdCompleted(true)); + }); + + it('should return false', () => { + vorgangService.getVorgangWithEingang.mockReturnValue( + of(createStateResource(createVorgangWithEingangResource())), + ); + + const isPostfachConfigured$: Observable<boolean> = service.isPostfachConfigured(); + + expect(isPostfachConfigured$).toBeObservable(singleColdCompleted(false)); + }); + }); }); 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 87398ad33d8859581f6b62c41c0150233fa3ba49..2474203852ea6c55a58eb19c3844b6ce1bf43c3b 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -23,10 +23,12 @@ import { } from '@alfa-client/tech-shared'; import { VorgangCommandService, + VorgangHeaderLinkRel, VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; import { Injectable } from '@angular/core'; import { ResourceUri, getUrl, hasLink } from '@ngxp/rest'; import { @@ -236,6 +238,10 @@ export class BescheidService { return this.bescheidDocumentFile$.asObservable(); } + public getBescheidDocument(): Observable<StateResource<DocumentResource>> { + return this.bescheidDocument$.asObservable(); + } + public loadBescheidDocument(resourceUri: ResourceUri): void { this.setBescheidDocumentFileLoading(); this.loadBescheidDocumentSubscription = this.repository @@ -403,4 +409,19 @@ export class BescheidService { public reloadCurrentVorgang(): void { this.vorgangService.reloadCurrentVorgang(); } + + public getEmpfaenger(): Observable<string> { + return this.vorgangService.getVorgangWithEingang().pipe( + filter(isLoaded), + map((stateResource) => stateResource.resource), + map(getEmpfaenger), + ); + } + + public isPostfachConfigured(): Observable<boolean> { + return this.vorgangService.getVorgangWithEingang().pipe( + filter(isLoaded), + map((stateResource) => hasLink(stateResource.resource, VorgangHeaderLinkRel.POSTFACH_MAILS)), + ); + } } diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts index 755f071d49ee06d084e0f352723b14e585ba6756..a6ba05191512ec2c4ad936eb85d756dd2836dd51 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.spec.ts @@ -66,7 +66,7 @@ describe('BescheidUtil', () => { binaryFileResource, ); - expect(props.linkRel).toBe(BescheidLinkRel.CREATE_BESCHEID_DOCUMENT); + expect(props.linkRel).toBe(BescheidLinkRel.CREATE_DOCUMENT_FROM_FILE); }); describe('command', () => { @@ -195,7 +195,7 @@ describe('BescheidUtil', () => { it('should have linkRel', () => { const props: CreateCommandProps = buildCreateBescheidDocumentCommandProps(bescheidResource); - expect(props.linkRel).toBe(BescheidLinkRel.CREATE_BESCHEID_DOCUMENT); + expect(props.linkRel).toBe(BescheidLinkRel.CREATE_DOCUMENT); }); describe('command', () => { diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts index e3cd07a88f6b2be5932030f5ee0057fc3aec537f..ee496fe13667e8281da29458f5a698391bfc0497 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.util.ts @@ -28,7 +28,7 @@ export function buildCreateBescheidDocumentFromFileProps( ): CreateCommandProps { return { resource: bescheid, - linkRel: BescheidLinkRel.CREATE_BESCHEID_DOCUMENT, + linkRel: BescheidLinkRel.CREATE_DOCUMENT_FROM_FILE, command: buildCreateBescheidDocumentFromFileCommand(binaryFile), snackBarMessage: EMPTY_STRING, }; @@ -67,7 +67,7 @@ export function buildCreateBescheidDocumentCommandProps( ): CreateCommandProps { return { resource, - linkRel: BescheidLinkRel.CREATE_BESCHEID_DOCUMENT, + linkRel: BescheidLinkRel.CREATE_DOCUMENT, command: { order: CommandOrder.CREATE_BESCHEID_DOCUMENT, body: null, diff --git a/alfa-client/libs/bescheid-shared/src/test/document.ts b/alfa-client/libs/bescheid-shared/src/test/document.ts index 1c88004f87bcc6b198a9ac3a453a3c9839326e1e..38fa7d022856d8c7ad33c9a5ba88ba4f0b4a3737 100644 --- a/alfa-client/libs/bescheid-shared/src/test/document.ts +++ b/alfa-client/libs/bescheid-shared/src/test/document.ts @@ -1,6 +1,16 @@ +import faker from '@faker-js/faker'; import { toResource } from 'libs/tech-shared/test/resource'; -import { DocumentResource } from '../lib/document.model'; +import { Document, DocumentResource } from '../lib/document.model'; + +export function createDocument(): Document { + return { + type: 'Bescheid', + fileId: faker.internet.url(), + nachrichtSubject: faker.datatype.string(10), + nachrichtText: faker.lorem.text(), + }; +} export function createDocumentResource(linkRel: string[] = []): DocumentResource { - return toResource({}, linkRel); + return toResource(createDocument(), linkRel); } diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts index 81dbf91bfdc2657a53bbcdbc6e10089f0ffa4f24..ff10996f5a08bcb16c51b9fafc0a0b5ec736e549 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.spec.ts @@ -21,8 +21,12 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { PostfachMailListResource, PostfachService } from '@alfa-client/postfach-shared'; +import { PostfachMailFormComponent } from '@alfa-client/postfach'; +import { + PostfachMailFormDialogData, + PostfachMailListResource, + PostfachService, +} from '@alfa-client/postfach-shared'; import { HasLinkPipe, StateResource, @@ -32,6 +36,9 @@ import { import { mock } from '@alfa-client/test-utils'; import { DialogService } from '@alfa-client/ui'; import { VorgangHeaderLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import faker from '@faker-js/faker'; import { createCommandResource } from 'libs/command-shared/test/command'; import { createPostfachMailListResource } from 'libs/postfach-shared/test/postfach'; import { createApiError } from 'libs/tech-shared/test/error'; @@ -41,6 +48,9 @@ import { of } from 'rxjs'; import { PostfachMailButtonContainerComponent } from './postfach-mail-button-container.component'; import { PostfachMailButtonComponent } from './postfach-mail-button/postfach-mail-button.component'; +jest.mock('@alfa-client/vorgang-shared-ui'); +const getEmpfaengerMock = getEmpfaenger as jest.Mock; + describe('PostfachMailButtonContainerComponent', () => { let component: PostfachMailButtonContainerComponent; let fixture: ComponentFixture<PostfachMailButtonContainerComponent>; @@ -173,13 +183,45 @@ describe('PostfachMailButtonContainerComponent', () => { }); }); - describe('getEmpfaenger', () => { - it('should return antragsteller name', () => { - const antragsteller = component.getEmpfaenger(); + describe('buildDialogData', () => { + const postfachMailListStateResource: StateResource<PostfachMailListResource> = + createStateResource(createPostfachMailListResource()); - expect(antragsteller).toEqual( - `${vorgang.eingang.antragsteller.vorname} ${vorgang.eingang.antragsteller.nachname}`, + it('should get empfänger', () => { + component.buildDialogData(postfachMailListStateResource); + + expect(getEmpfaengerMock).toHaveBeenCalled(); + }); + + it('should set empfänger', () => { + const empfanger: string = faker.name.firstName(); + getEmpfaengerMock.mockReturnValue(empfanger); + + const dialogData: PostfachMailFormDialogData = component.buildDialogData( + postfachMailListStateResource, ); + + expect(dialogData.empfaenger).toEqual(empfanger); + }); + + it('should set component', () => { + const dialogData = component.buildDialogData(postfachMailListStateResource); + + expect(dialogData.component).toBe(PostfachMailFormComponent); + }); + + it('should set title', () => { + const dialogData: PostfachMailFormDialogData = component.buildDialogData( + postfachMailListStateResource, + ); + + expect(dialogData.title).toEqual(PostfachMailButtonContainerComponent.TITLE); + }); + + it('should set state resource', () => { + const dialogData = component.buildDialogData(postfachMailListStateResource); + + expect(dialogData.postfachMailListStateResource).toEqual(postfachMailListStateResource); }); }); }); diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts index dde104c79cf00b344d836312072bf0963f96bbf1..6a4d16d49caa38d8901b8f352fded1be89bd7b59 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts @@ -21,8 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Input } from '@angular/core'; -import { MatDialogRef } from '@angular/material/dialog'; import { CommandResource } from '@alfa-client/command-shared'; import { PostfachMailFormDialogData, @@ -30,15 +28,12 @@ import { PostfachMailListResource, PostfachService, } from '@alfa-client/postfach-shared'; -import { - EMPTY_STRING, - StateResource, - hasError, - isNotNull, - isNotUndefined, -} from '@alfa-client/tech-shared'; +import { StateResource, hasError, isNotNull, isNotUndefined } from '@alfa-client/tech-shared'; import { DialogService, FixedDialogComponent } from '@alfa-client/ui'; import { VorgangHeaderLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; +import { Component, Input } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; import { hasLink } from '@ngxp/rest'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @@ -50,6 +45,8 @@ import { PostfachMailFormComponent } from '../postfach-mail-form/postfach-mail-f styleUrls: ['./postfach-mail-button-container.component.scss'], }) export class PostfachMailButtonContainerComponent { + static readonly TITLE = 'Neue Nachricht'; + private _vorgang: VorgangWithEingangResource; public get vorgang(): VorgangWithEingangResource { return this._vorgang; @@ -108,24 +105,14 @@ export class PostfachMailButtonContainerComponent { ); } - private buildDialogData( + buildDialogData( postfachMailListStateResource: StateResource<PostfachMailListResource>, ): PostfachMailFormDialogData { return { component: PostfachMailFormComponent, - title: 'Neue Nachricht', - empfaenger: this.getEmpfaenger(), + title: PostfachMailButtonContainerComponent.TITLE, + empfaenger: getEmpfaenger(this.vorgang), postfachMailListStateResource: postfachMailListStateResource, }; } - - getEmpfaenger(): string { - return this.existsAntragsteller() ? - `${this.vorgang.eingang.antragsteller.vorname} ${this.vorgang.eingang.antragsteller.nachname}` - : EMPTY_STRING; - } - - private existsAntragsteller(): boolean { - return !!this.vorgang.eingang.antragsteller; - } } diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts index 9eb44a2c48f63bd3a8779a830445df2369eb1725..68f51e677db01f0005da3029089197ba2e37f4a6 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail.component.ts @@ -21,10 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Inject, Input } from '@angular/core'; import { ON_PAGE, PostfachMailLinkRel, PostfachMailResource } from '@alfa-client/postfach-shared'; import { StateResource } from '@alfa-client/tech-shared'; -import { VorgangResource } from '@alfa-client/vorgang-shared'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { Component, Inject, Input } from '@angular/core'; @Component({ selector: 'alfa-outgoing-mail', @@ -33,7 +33,7 @@ import { VorgangResource } from '@alfa-client/vorgang-shared'; }) export class OutgoingMailComponent { @Input() postfachMail: PostfachMailResource; - @Input() vorgangStateResource: StateResource<VorgangResource>; + @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>; readonly postfachNachrichtLinkRel = PostfachMailLinkRel; diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts index 58fb157e90d1021e84023f057cf096017b11d4b4..a7eaeaab39408e2db221bf4156d3b812cbcfd8b6 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.spec.ts @@ -1,20 +1,20 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostfachMailFormDialogData, PostfachMailResource } from '@alfa-client/postfach-shared'; -import { EMPTY_STRING, createStateResource } from '@alfa-client/tech-shared'; +import { createStateResource } from '@alfa-client/tech-shared'; import { Mock, dispatchEventFromFixture, getMockComponent, mock } from '@alfa-client/test-utils'; import { DialogService, OzgcloudIconComponent } from '@alfa-client/ui'; -import { Antragsteller, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import faker from '@faker-js/faker'; import { createPostfachMailResource } from 'libs/postfach-shared/test/postfach'; import { PostfachMailFormComponent } from 'libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; -import { - createAntragsteller, - createEingang, - createVorgangWithEingangResource, -} from 'libs/vorgang-shared/test/vorgang'; +import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; import { PostfachNachrichtEditButtonContainerComponent } from './postfach-nachricht-edit-button-container.component'; +jest.mock('@alfa-client/vorgang-shared-ui'); +const getEmpfaengerMock = getEmpfaenger as jest.Mock; + describe('PostfachNachrichtEditButtonContainerComponent', () => { let component: PostfachNachrichtEditButtonContainerComponent; let fixture: ComponentFixture<PostfachNachrichtEditButtonContainerComponent>; @@ -96,63 +96,19 @@ describe('PostfachNachrichtEditButtonContainerComponent', () => { expect(dialogData.postfachNachricht).toBe(postfachNachricht); }); - it('should get Empfaenger', () => { - component.getEmpfaenger = jest.fn(); - + it('should get empfänger', () => { component.buildDialogData(); - expect(component.getEmpfaenger).toHaveBeenCalled(); - }); - }); - - describe('getEmpfaenger', () => { - it('should return nachname only if exists', () => { - const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined }; - component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller)); - - const empfaenger: string = component.getEmpfaenger(); - - expect(empfaenger).toEqual(antragsteller.nachname); - }); - - it('should return vorname only if exists', () => { - const antragsteller: Antragsteller = { ...createAntragsteller(), nachname: undefined }; - component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller)); - - const empfaenger: string = component.getEmpfaenger(); - - expect(empfaenger).toEqual(antragsteller.vorname); - }); - - it('should return name and vorname if exists', () => { - const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource(); - component.vorgangStateResource = createStateResource(vorgangWithEingang); - - const empfaenger: string = component.getEmpfaenger(); - - expect(empfaenger).toEqual( - `${vorgangWithEingang.eingang.antragsteller.vorname} ${vorgangWithEingang.eingang.antragsteller.nachname}`, - ); + expect(getEmpfaengerMock).toHaveBeenCalled(); }); - it('should return empty string if none exists', () => { - const antragsteller: Antragsteller = { - ...createAntragsteller(), - nachname: undefined, - vorname: undefined, - }; - component.vorgangStateResource = createStateResource(createWithAntragsteller(antragsteller)); + it('should set empfänger', () => { + const empfanger: string = faker.name.firstName(); + getEmpfaengerMock.mockReturnValue(empfanger); - const empfaenger: string = component.getEmpfaenger(); + const dialogData: PostfachMailFormDialogData = component.buildDialogData(); - expect(empfaenger).toEqual(EMPTY_STRING); + expect(dialogData.empfaenger).toEqual(empfanger); }); - - function createWithAntragsteller(antragsteller: Antragsteller): VorgangWithEingangResource { - return { - ...createVorgangWithEingangResource(), - eingang: { ...createEingang(), antragsteller }, - }; - } }); }); diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts index 7d1aad74943eb34874ef94577135ba5a7dd8a13c..a7ee3b38e083aa4d9a800a7420a6e7e9dfed393d 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/postfach-nachricht-edit-button-container/postfach-nachricht-edit-button-container.component.ts @@ -1,7 +1,8 @@ import { PostfachMailFormDialogData, PostfachMailResource } from '@alfa-client/postfach-shared'; -import { EMPTY_STRING, StateResource, isNotNil } from '@alfa-client/tech-shared'; +import { StateResource } from '@alfa-client/tech-shared'; import { DialogService } from '@alfa-client/ui'; -import { Antragsteller, VorgangWithEingang } from '@alfa-client/vorgang-shared'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; import { Component, Input } from '@angular/core'; import { PostfachMailFormComponent } from '../../../../../postfach-mail-form/postfach-mail-form.component'; @@ -12,7 +13,7 @@ import { PostfachMailFormComponent } from '../../../../../postfach-mail-form/pos }) export class PostfachNachrichtEditButtonContainerComponent { @Input() postfachNachricht: PostfachMailResource; - @Input() vorgangStateResource: StateResource<VorgangWithEingang>; + @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>; constructor(private dialogService: DialogService) {} @@ -25,27 +26,7 @@ export class PostfachNachrichtEditButtonContainerComponent { title: 'Nachricht bearbeiten', component: PostfachMailFormComponent, postfachNachricht: this.postfachNachricht, - empfaenger: this.getEmpfaenger(), + empfaenger: getEmpfaenger(this.vorgangStateResource.resource), }; } - - getEmpfaenger(): string { - return `${this.getVorname()} ${this.getNachname()}`.trim(); - } - - private getVorname(): string { - return isNotNil(this.getAntragsteller()?.vorname) ? - this.getAntragsteller().vorname - : EMPTY_STRING; - } - - private getNachname(): string { - return isNotNil(this.getAntragsteller()?.nachname) ? - this.getAntragsteller().nachname - : EMPTY_STRING; - } - - private getAntragsteller(): Antragsteller { - return this.vorgangStateResource.resource.eingang.antragsteller; - } } diff --git a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts index 41f9e4879ce3133551800f72fc1eabc05d7966a4..51b14d26cd1aaca7c3b93a4ed8e1bbda2d482d16 100644 --- a/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts +++ b/alfa-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/postfach-mail.component.ts @@ -21,7 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Inject, Input } from '@angular/core'; import { ON_PAGE, PostfachMailLinkRel, @@ -29,7 +28,8 @@ import { isIncomingMail, } from '@alfa-client/postfach-shared'; import { StateResource } from '@alfa-client/tech-shared'; -import { VorgangResource } from '@alfa-client/vorgang-shared'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { Component, Inject, Input } from '@angular/core'; @Component({ selector: 'alfa-postfach-mail', @@ -38,7 +38,7 @@ import { VorgangResource } from '@alfa-client/vorgang-shared'; }) export class PostfachMailComponent { @Input() postfachMail: PostfachMailResource; - @Input() vorgangStateResource: StateResource<VorgangResource>; + @Input() vorgangStateResource: StateResource<VorgangWithEingangResource>; readonly postfachNachrichtLinkRel = PostfachMailLinkRel; diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts index 0b1990b314cf37d4afefdeed405b889a38b456a2..5b082c9a1a664ffc1aa4c5e37979a2834b24f520 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.spec.ts @@ -4,22 +4,31 @@ import { BescheidResource, BescheidSendBy, BescheidService, + DocumentResource, } from '@alfa-client/bescheid-shared'; +import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { CommandResource } from '@alfa-client/command-shared'; -import { StateResource, createStateResource, formatForDatabase } from '@alfa-client/tech-shared'; +import { + EMPTY_STRING, + StateResource, + createStateResource, + formatForDatabase, +} from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; import { fakeAsync, tick } from '@angular/core/testing'; import { UntypedFormBuilder } from '@angular/forms'; import faker from '@faker-js/faker'; -import { Resource } from '@ngxp/rest'; +import { Resource, ResourceUri } from '@ngxp/rest'; import { cold } from 'jest-marbles'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createCommandResource } from 'libs/command-shared/test/command'; import { toResource } from 'libs/tech-shared/test/resource'; import { of } from 'rxjs'; import { createBescheidResource } from '../../../../../bescheid-shared/src/test/bescheid'; +import { createDocumentResource } from '../../../../../bescheid-shared/src/test/document'; import { createBinaryFileResource } from '../../../../../binary-file-shared/test/binary-file'; import { singleCold } from '../../../../../tech-shared/src/lib/resource/marbles'; import { createVorgangWithEingangResource } from '../../../../../vorgang-shared/test/vorgang'; @@ -30,7 +39,7 @@ registerLocaleData(localeDe); describe('BescheidenFormService', () => { let service: BescheidenFormService; let bescheidService: Mock<BescheidService>; - const now = new Date(); + const now: Date = new Date(); Date.now = jest.fn().mockReturnValue(now); beforeEach(() => { @@ -82,6 +91,8 @@ describe('BescheidenFormService', () => { attachments: [], bescheidDocument: null, sendBy: BescheidSendBy.NACHRICHT, + nachrichtSubject: '', + nachrichtText: '', }, }), ); @@ -89,7 +100,7 @@ describe('BescheidenFormService', () => { }); describe('getValue', () => { - let getFormValue; + let getFormValue: jest.Mock; beforeEach(() => { getFormValue = service.getFormValue = jest.fn(); @@ -103,7 +114,7 @@ describe('BescheidenFormService', () => { }); it('should return bescheid', () => { - const value = service.getValue(); + const value: Bescheid = service.getValue(); expect(value).toEqual({ bewilligt: true, beschiedenAm: formatForDatabase(now) } as Bescheid); }); @@ -118,6 +129,8 @@ describe('BescheidenFormService', () => { attachments: [], bescheidDocument: null, sendBy: BescheidSendBy.NACHRICHT, + nachrichtSubject: '', + nachrichtText: '', }), ); }); @@ -144,7 +157,7 @@ describe('BescheidenFormService', () => { }); it('should call patch with undefined sendBy', () => { - const bescheidDocumentUri = faker.internet.url(); + const bescheidDocumentUri: ResourceUri = faker.internet.url(); service.patchValues({ ...bescheidResource, sendBy: undefined, @@ -159,6 +172,8 @@ describe('BescheidenFormService', () => { [BescheidenFormService.FIELD_BEWILLIGT]: String(bescheidResource.bewilligt), [BescheidenFormService.FIELD_SEND_BY]: BescheidSendBy.NACHRICHT, [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri, + [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: bescheidResource.nachrichtSubject, + [BescheidenFormService.FIELD_NACHRICHT_TEXT]: bescheidResource.nachrichtSubject, }); }); @@ -242,7 +257,8 @@ describe('BescheidenFormService', () => { describe('setVorgangWithEingangResource', () => { it('should set vorgangWithEingangResource', () => { - const vorgangWithEingangResource = createVorgangWithEingangResource(); + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); service.setVorgangWithEingangResource(vorgangWithEingangResource); @@ -252,10 +268,11 @@ describe('BescheidenFormService', () => { describe('getVorgangWithEingangResource', () => { it('should reutrn vorgangWithEingangResource', () => { - const vorgangWithEingangResource = createVorgangWithEingangResource(); + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); service.vorgangWithEingangResource = vorgangWithEingangResource; - const vorang = service.getVorgangWithEingangResource(); + const vorang: VorgangWithEingangResource = service.getVorgangWithEingangResource(); expect(vorang).toBe(vorgangWithEingangResource); }); @@ -263,9 +280,9 @@ describe('BescheidenFormService', () => { describe('deleteFile', () => { it('should emit binary file resource', (done) => { - const file = createBinaryFileResource(); + const file: BinaryFileResource = createBinaryFileResource(); - service.getFileDelete().subscribe((deletedFile) => { + service.getFileDelete().subscribe((deletedFile: BinaryFileResource) => { expect(deletedFile).toEqual(file); done(); }); @@ -273,4 +290,35 @@ describe('BescheidenFormService', () => { service.deleteFile(file); }); }); + + describe('setActiveStep', () => { + it('should emit step', () => { + service.setActiveStep(3); + + expect(service.getActiveStep()).toBeObservable(singleCold(3)); + }); + }); + + describe('patchNachricht', () => { + it('should patch values', () => { + const documentResource: DocumentResource = createDocumentResource(); + + service.patchNachricht(documentResource); + + expect(service.getValue().nachrichtSubject).toEqual(documentResource.nachrichtSubject); + expect(service.getValue().nachrichtText).toEqual(documentResource.nachrichtText); + }); + }); + + describe('clearNachricht', () => { + it('should patch values', () => { + const documentResource: DocumentResource = createDocumentResource(); + + service.patchNachricht(documentResource); + service.clearNachricht(); + + expect(service.getValue().nachrichtSubject).toEqual(EMPTY_STRING); + expect(service.getValue().nachrichtText).toEqual(EMPTY_STRING); + }); + }); }); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts index b044ee37f0ebced6f2c78b77780118210f1bb481..4780976bf07b0e69ee852dc317b19f6c785c1b7e 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/bescheiden.formservice.ts @@ -4,11 +4,13 @@ import { BescheidResource, BescheidSendBy, BescheidService, + DocumentResource, } from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { tapOnCommandSuccessfullyDone } from '@alfa-client/command-shared'; import { AbstractFormService, + EMPTY_STRING, HttpError, StateResource, asBoolean, @@ -36,15 +38,17 @@ export class BescheidenFormService extends AbstractFormService implements OnDest static readonly FIELD_BESCHEID_DOCUMENT = 'bescheidDocument'; static readonly FIELD_ATTACHMENTS = 'attachments'; public static readonly FIELD_SEND_BY = 'sendBy'; + static readonly FIELD_NACHRICHT_SUBJECT = 'nachrichtSubject'; + static readonly FIELD_NACHRICHT_TEXT = 'nachrichtText'; static readonly FIELD_PATH_PREFIX = 'command.body'; private readonly bescheidChanges$: BehaviorSubject<Bescheid>; - private attachmentUpload$: Subject<StateResource<BinaryFileResource>>; + private attachmentUpload$: BehaviorSubject<StateResource<BinaryFileResource>>; private bescheidFileUpload$: Observable<StateResource<BinaryFileResource>>; private readonly fileDelete$: Subject<BinaryFileResource>; - private readonly activeStep: BehaviorSubject<number> = new BehaviorSubject(1); + private readonly activeStep$: BehaviorSubject<number> = new BehaviorSubject(1); readonly sendByManual: BehaviorSubject<boolean> = new BehaviorSubject(false); vorgangWithEingangResource: VorgangWithEingangResource; @@ -67,7 +71,9 @@ export class BescheidenFormService extends AbstractFormService implements OnDest init(): void { this.formControlSubscriptions = this.subscribeToSendBy(); this.bescheidFileUpload$ = of(createEmptyStateResource<BinaryFileResource>()); - this.attachmentUpload$ = new Subject<StateResource<BinaryFileResource>>(); + this.attachmentUpload$ = new BehaviorSubject<StateResource<BinaryFileResource>>( + createEmptyStateResource(), + ); this.initializeFormChanges(); } @@ -116,6 +122,8 @@ export class BescheidenFormService extends AbstractFormService implements OnDest [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: bescheidDocumentUri, [BescheidenFormService.FIELD_SEND_BY]: isUndefined(bescheid.sendBy) ? BescheidSendBy.NACHRICHT : bescheid.sendBy, + [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: bescheid.nachrichtSubject, + [BescheidenFormService.FIELD_NACHRICHT_TEXT]: bescheid.nachrichtText, }); bescheid.attachments.forEach((attachmentLink) => (this.form.controls[BescheidenFormService.FIELD_ATTACHMENTS] as UntypedFormArray).push( @@ -138,6 +146,8 @@ export class BescheidenFormService extends AbstractFormService implements OnDest [BescheidenFormService.FIELD_SEND_BY]: new UntypedFormControl(BescheidSendBy.NACHRICHT), [BescheidenFormService.FIELD_BESCHEID_DOCUMENT]: new UntypedFormControl(null), [BescheidenFormService.FIELD_ATTACHMENTS]: new UntypedFormArray([]), + [BescheidenFormService.FIELD_NACHRICHT_SUBJECT]: new UntypedFormControl(''), + [BescheidenFormService.FIELD_NACHRICHT_TEXT]: new UntypedFormControl(''), }); } @@ -208,11 +218,11 @@ export class BescheidenFormService extends AbstractFormService implements OnDest } public setActiveStep(step: number) { - this.activeStep.next(step); + this.activeStep$.next(step); } public getActiveStep(): Observable<number> { - return this.activeStep.asObservable(); + return this.activeStep$.asObservable(); } public clearBescheidDocumentFile(): void { @@ -230,4 +240,21 @@ export class BescheidenFormService extends AbstractFormService implements OnDest public isSendByManual(): Observable<boolean> { return this.sendByManual.asObservable(); } + + public patchNachricht(documentResource: DocumentResource): void { + this.setNachrichtSubject(documentResource.nachrichtSubject); + this.setNachrichtText(documentResource.nachrichtText); + } + + public clearNachricht(): void { + this.setNachrichtSubject(EMPTY_STRING); + this.setNachrichtText(EMPTY_STRING); + } + + private setNachrichtSubject(value: string): void { + this.form.controls[BescheidenFormService.FIELD_NACHRICHT_SUBJECT].patchValue(value); + } + private setNachrichtText(value: string): void { + this.form.controls[BescheidenFormService.FIELD_NACHRICHT_TEXT].patchValue(value); + } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts index 7f2dfcf065308069b95c77fd4a2a8dc1164482cf..ba48a240982fb6f74a545cdf7b799a4c439277da 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts @@ -126,6 +126,14 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { expect(component.existingAttachments).toEqual([attachment]); }); + + it('should reset uploaded attachments', () => { + component.uploadedAttachments = [createStateResource(createBinaryFileResource())]; + + component.loadExistingAttachments(); + + expect(component.uploadedAttachments).toEqual([]); + }); }); describe('subscribeToAttachmentUpload', () => { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts index f4a2d246c43ae2a45efcdf5e5d21ffca38793f72..4fb7941eaf9e917d802f20e051e51194e8a88001 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.ts @@ -43,7 +43,10 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest this.bescheidService .getAttachments() .pipe(first()) - .subscribe((attachments) => (this.existingAttachments = attachments)); + .subscribe((attachments) => { + this.uploadedAttachments = []; + this.existingAttachments = attachments; + }); } subscribeToAttachmentUpload() { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html new file mode 100644 index 0000000000000000000000000000000000000000..44cf270aac5fb6dbb0e7fcef8505e1af8c43a68d --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.html @@ -0,0 +1,20 @@ +<h1>Neue Nachricht</h1> +<p *ngIf="empfaenger$ | async as empfaenger" data-test-id="bescheid-nachricht-empfaenger"> + An: {{ empfaenger }} +</p> +<div [formGroup]="form"> + <!-- TODO: neue Komponente oder stylen? --> + <ozgcloud-text-editor + [formControlName]="formServiceClass.FIELD_NACHRICHT_SUBJECT" + label="Betreff" + > + </ozgcloud-text-editor> + + <!-- TODO: neue Komponente oder stylen? --> + <ozgcloud-textarea-editor + [formControlName]="formServiceClass.FIELD_NACHRICHT_TEXT" + label="Text" + class="message-editor" + > + </ozgcloud-textarea-editor> +</div> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f6e11aa735e90c470e1f8e7a0a334ffe1f7e464 --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.spec.ts @@ -0,0 +1,135 @@ +import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared'; +import { + createEmptyStateResource, + createErrorStateResource, + createStateResource, + StateResource, +} from '@alfa-client/tech-shared'; +import { getElementFromFixture } from '@alfa-client/test-utils'; +import { TextAreaEditorComponent, TextEditorComponent } from '@alfa-client/ui'; +import { registerLocaleData } from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; +import { MatIcon } from '@angular/material/icon'; +import { MatIconTestingModule } from '@angular/material/icon/testing'; +import faker from '@faker-js/faker'; +import { Mock, mock, useFromMock } from 'libs/test-utils/src/lib/mocking'; +import { OzgcloudSvgIconComponent } from 'libs/ui/src/lib/ui/ozgcloud-svgicon/ozgcloud-svgicon.component'; +import { MockComponent } from 'ng-mocks'; +import { EMPTY, of } from 'rxjs'; +import { createDocumentResource } from '../../../../../../../bescheid-shared/src/test/document'; +import { singleColdCompleted } from '../../../../../../../tech-shared/src/lib/resource/marbles'; +import { getDataTestIdOf } from '../../../../../../../tech-shared/test/data-test'; +import { createApiError } from '../../../../../../../tech-shared/test/error'; +import { BescheidenFormService } from '../../bescheiden.formservice'; +import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-bescheiden-result-nachricht.component'; + +registerLocaleData(localeDe); + +describe('VorgangDetailBescheidenResultNachrichtComponent', () => { + let component: VorgangDetailBescheidenResultNachrichtComponent; + let fixture: ComponentFixture<VorgangDetailBescheidenResultNachrichtComponent>; + + let bescheidService: Mock<BescheidService>; + let formService: BescheidenFormService; + + const bescheidNachrichtEmpfaengerElement: string = getDataTestIdOf( + 'bescheid-nachricht-empfaenger', + ); + + beforeEach(async () => { + bescheidService = mock(BescheidService); + formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService)); + + await TestBed.configureTestingModule({ + imports: [ReactiveFormsModule, MatIconTestingModule], + declarations: [ + VorgangDetailBescheidenResultNachrichtComponent, + MatIcon, + MockComponent(OzgcloudSvgIconComponent), + MockComponent(TextEditorComponent), + MockComponent(TextAreaEditorComponent), + ], + providers: [ + { + provide: BescheidService, + useValue: bescheidService, + }, + { + provide: BescheidenFormService, + useValue: formService, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(VorgangDetailBescheidenResultNachrichtComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('render', () => { + it('should render Nachrichtenempfänger', () => { + const empfaenger: string = `${faker.name.firstName()} ${faker.name.lastName()}`; + bescheidService.getEmpfaenger.mockReturnValue(of(empfaenger)); + component.ngOnInit(); + + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, bescheidNachrichtEmpfaengerElement); + expect(element).toBeInstanceOf(HTMLElement); + }); + + it('should not render Nachrichtenempfänger', () => { + bescheidService.getEmpfaenger.mockReturnValue(EMPTY); + component.ngOnInit(); + + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, bescheidNachrichtEmpfaengerElement); + expect(element).not.toBeInstanceOf(HTMLElement); + }); + }); + + describe('ngOnInit', () => { + it('should set Nachrichtenempfänger', () => { + const empfaenger: string = `${faker.name.firstName()} ${faker.name.lastName()}`; + bescheidService.getEmpfaenger.mockReturnValue(of(empfaenger)); + + component.ngOnInit(); + + expect(component.empfaenger$).toBeObservable(singleColdCompleted(empfaenger)); + }); + }); + + describe('set bescheidDocumentStateResource', () => { + beforeEach(() => { + formService.patchNachricht = jest.fn(); + }); + + it('should patch form', () => { + const documentStateResource: StateResource<DocumentResource> = + createStateResource(createDocumentResource()); + + component.bescheidDocumentStateResource = documentStateResource; + + expect(formService.patchNachricht).toHaveBeenCalledWith(documentStateResource.resource); + }); + + it('should not patch form if document not loaded', () => { + component.bescheidDocumentStateResource = createEmptyStateResource(); + + expect(formService.patchNachricht).not.toHaveBeenCalled(); + }); + + it('should not patch form if document loaded with error', () => { + component.bescheidDocumentStateResource = createErrorStateResource(createApiError()); + + expect(formService.patchNachricht).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..cddc36969c17d7bf279a4fbc21a329184f6697a1 --- /dev/null +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component.ts @@ -0,0 +1,33 @@ +import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared'; +import { StateResource } from '@alfa-client/tech-shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { BescheidenFormService } from '../../bescheiden.formservice'; + +@Component({ + selector: 'alfa-vorgang-detail-bescheiden-result-nachricht', + templateUrl: './vorgang-detail-bescheiden-result-nachricht.component.html', +}) +export class VorgangDetailBescheidenResultNachrichtComponent implements OnInit { + @Input() set bescheidDocumentStateResource(stateResource: StateResource<DocumentResource>) { + if (stateResource.loaded && !stateResource.error) { + this.formService.patchNachricht(stateResource.resource); + } + } + + empfaenger$: Observable<string>; + form: FormGroup; + + readonly formServiceClass = BescheidenFormService; + + constructor( + private readonly bescheidService: BescheidService, + private readonly formService: BescheidenFormService, + ) {} + + ngOnInit(): void { + this.empfaenger$ = this.bescheidService.getEmpfaenger(); + this.form = this.formService.form; + } +} diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html index 37eba57a64494c02f0e535b7869af0c558a7b6ad..73a4f5ecf28582a26586bed9eb2f36928ad14635 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.html @@ -1,6 +1,10 @@ <section class="w-full overflow-auto rounded-xl bg-background-100" - *ngIf="{ activeStep: activeStep$ | async, sendByManual: sendByManual$ | async } as wizardData" + *ngIf="{ + activeStep: activeStep$ | async, + sendByManual: sendByManual$ | async, + isPostfachConfigured: isPostfachConfigured$ | async + } as wizardData" > <div class="p-4 text-base font-bold text-primary-600">Bescheid</div> <div class="p-4" data-test-id="bescheid-status-text"> @@ -13,10 +17,22 @@ ></alfa-vorgang-detail-bescheiden-result-status> </div> + <div class="p-4"> + <alfa-vorgang-detail-bescheiden-result-nachricht + *ngIf=" + !wizardData.sendByManual && wizardData.activeStep === 3 && wizardData.isPostfachConfigured + " + [bescheidDocumentStateResource]="bescheidDocument$ | async" + data-test-id="bescheid-nachricht-an-antragsteller" + ></alfa-vorgang-detail-bescheiden-result-nachricht> + </div> + <div class="p-4" data-test-id="bescheid-status-dokument"> <alfa-vorgang-detail-bescheiden-result-dokument *ngIf=" - wizardData.activeStep === 2 || (wizardData.activeStep === 3 && wizardData.sendByManual) + wizardData.activeStep === 2 || + (wizardData.activeStep === 3 && + (wizardData.sendByManual || wizardData.isPostfachConfigured)) " data-test-id="bescheid-document" [bescheidDraftStateResource]="bescheidDraftStateResource$ | async" @@ -30,7 +46,9 @@ <div class="p-4" data-test-id="bescheid-status-attachments"> <alfa-vorgang-detail-bescheiden-result-attachments *ngIf=" - wizardData.activeStep === 2 || (wizardData.activeStep === 3 && wizardData.sendByManual) + wizardData.activeStep === 2 || + (wizardData.activeStep === 3 && + (wizardData.sendByManual || wizardData.isPostfachConfigured)) " data-test-id="bescheid-attachments" ></alfa-vorgang-detail-bescheiden-result-attachments> @@ -45,9 +63,23 @@ data-test-id="save-and-send-button" [stateResource]="saveAndSendInProgress$ | async" text="Antrag bescheiden und speichern" - (clickEmitter)="saveAndSend(bescheidDraftStateResource.resource)" + (clickEmitter)="saveAndSendManually(bescheidDraftStateResource.resource)" ></ozgcloud-button-with-spinner> </ng-container> <!-- --> </div> + <ng-container + *ngIf=" + wizardData.activeStep === 3 && !wizardData.sendByManual && wizardData.isPostfachConfigured + " + > + <ng-container *ngIf="bescheidDraftStateResource$ | async as bescheidDraftStateResource"> + <ozgcloud-button-with-spinner + data-test-id="send-button" + [stateResource]="saveAndSendInProgress$ | async" + text="Bescheid senden" + (clickEmitter)="saveAndSendWithNachricht(bescheidDraftStateResource.resource)" + ></ozgcloud-button-with-spinner> + </ng-container> + </ng-container> </section> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts index dbeb408f302266d9b445bf55313a5bab97fe6772..22134382ba9806adda95c4d3bc65ba2950519dac 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.spec.ts @@ -4,6 +4,8 @@ import { StateResource, createStateResource } from '@alfa-client/tech-shared'; import { Mock, dispatchEventFromFixture, + existsAsHtmlElement, + getElementFromFixture, mock, notExistsAsHtmlElement, } from '@alfa-client/test-utils'; @@ -18,6 +20,7 @@ import { BehaviorSubject, first, of } from 'rxjs'; import { BescheidenFormService } from '../bescheiden.formservice'; import { VorgangDetailBescheidenResultAttachmentsComponent } from './vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component'; import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component'; +import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component'; import { VorgangDetailBescheidenResultStatusComponent } from './vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component'; import { VorgangDetailBescheidenResultComponent } from './vorgang-detail-bescheiden-result.component'; @@ -32,6 +35,8 @@ describe('VorgangDetailBescheidenResultComponent', () => { const bescheidDocument: string = getDataTestIdOf('bescheid-document'); const bescheidAttachments: string = getDataTestIdOf('bescheid-attachments'); const saveAndSendButton: string = getDataTestIdOf('save-and-send-button'); + const sendButton: string = getDataTestIdOf('send-button'); + const nachrichtAntragstellerComponent = getDataTestIdOf('bescheid-nachricht-an-antragsteller'); beforeEach(async () => { bescheidService = mock(BescheidService); @@ -46,6 +51,7 @@ describe('VorgangDetailBescheidenResultComponent', () => { MockComponent(VorgangDetailBescheidenResultDokumentComponent), MockComponent(VorgangDetailBescheidenResultAttachmentsComponent), MockComponent(OzgcloudButtonWithSpinnerComponent), + MockComponent(VorgangDetailBescheidenResultNachrichtComponent), ], providers: [ { @@ -68,6 +74,109 @@ describe('VorgangDetailBescheidenResultComponent', () => { expect(component).toBeTruthy(); }); + describe('render Nachricht component', () => { + it('should render', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).toBeInstanceOf(HTMLElement); + }); + + it.each([1, 2])('should not render in step %d', (step) => { + formService.getActiveStep.mockReturnValue(of(step)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if send by manual', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(true)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if postfach not configured', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(false)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, nachrichtAntragstellerComponent); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + }); + + describe('render send button', () => { + it('should render', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + bescheidService.getBescheidDraft.mockReturnValue( + of(createStateResource(createBescheidResource())), + ); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).toBeInstanceOf(HTMLElement); + }); + + it.each([1, 2])('should not render in step %d', (step) => { + formService.getActiveStep.mockReturnValue(of(step)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if send by manual', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(true)); + bescheidService.isPostfachConfigured.mockReturnValue(of(true)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + + it('should not render if postfach not configured', () => { + formService.getActiveStep.mockReturnValue(of(3)); + formService.isSendByManual.mockReturnValue(of(false)); + bescheidService.isPostfachConfigured.mockReturnValue(of(false)); + component.ngOnInit(); + fixture.detectChanges(); + + const element = getElementFromFixture(fixture, sendButton); + + expect(element).not.toBeInstanceOf(HTMLElement); + }); + }); + describe('ngOnInit', () => { it('should call service to get bescheid document file', () => { component.ngOnInit(); @@ -81,6 +190,12 @@ describe('VorgangDetailBescheidenResultComponent', () => { expect(bescheidService.getBescheidDraft).toHaveBeenCalled(); }); + it('should call service to get bescheid document', () => { + component.ngOnInit(); + + expect(bescheidService.getBescheidDocument).toHaveBeenCalled(); + }); + it('should call formservice to get active step', () => { component.ngOnInit(); @@ -110,6 +225,12 @@ describe('VorgangDetailBescheidenResultComponent', () => { expect(bescheidService.getCreateBescheidDocumentInProgress).toHaveBeenCalled(); }); + + it('should should call service to check if postfach is configured', () => { + component.ngOnInit(); + + expect(bescheidService.isPostfachConfigured).toHaveBeenCalled(); + }); }); describe('deleteBescheidDocument', () => { @@ -120,7 +241,7 @@ describe('VorgangDetailBescheidenResultComponent', () => { }); }); - describe('save and send', () => { + describe('save and send manually', () => { const bescheidDraft: BescheidResource = createBescheidResource(); const bescheidStateResource: StateResource<BescheidResource> = createStateResource(bescheidDraft); @@ -131,20 +252,48 @@ describe('VorgangDetailBescheidenResultComponent', () => { component.activeStep$ = of(3); }); + it('should clear nachricht', () => { + component.doSaveAndSend = jest.fn(); + + component.saveAndSendManually(bescheidDraft); + + expect(formService.clearNachricht).toHaveBeenCalled(); + }); + it('should call component on event dispatch', () => { - component.saveAndSend = jest.fn(); + component.saveAndSendManually = jest.fn(); fixture.detectChanges(); dispatchEventFromFixture(fixture, saveAndSendButton, 'clickEmitter'); - expect(component.saveAndSend).toHaveBeenCalledWith(bescheidDraft); + expect(component.saveAndSendManually).toHaveBeenCalledWith(bescheidDraft); }); it('should call do save and send', () => { component.doSaveAndSend = jest.fn(); - component.saveAndSend(bescheidDraft); + component.saveAndSendManually(bescheidDraft); + + expect(component.doSaveAndSend).toHaveBeenCalled(); + }); + }); + + describe('save and send with Nachricht', () => { + const bescheidDraft: BescheidResource = createBescheidResource(); + const bescheidStateResource: StateResource<BescheidResource> = + createStateResource(bescheidDraft); + + beforeEach(() => { + component.bescheidDraftStateResource$ = of(bescheidStateResource); + component.sendByManual$ = of(true); + component.activeStep$ = of(3); + }); + + it('should call do save and send', () => { + component.doSaveAndSend = jest.fn(); + + component.saveAndSendWithNachricht(bescheidDraft); expect(component.doSaveAndSend).toHaveBeenCalled(); }); @@ -236,6 +385,16 @@ describe('VorgangDetailBescheidenResultComponent', () => { notExistsAsHtmlElement(fixture, bescheidDocument); }); + + it('should be visible in step 3 when postfach is configured', () => { + component.sendByManual$ = of(false); + component.activeStep$ = of(3); + component.isPostfachConfigured$ = of(true); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, bescheidDocument); + }); }); describe('bescheid attachments', () => { @@ -264,6 +423,16 @@ describe('VorgangDetailBescheidenResultComponent', () => { notExistsAsHtmlElement(fixture, bescheidAttachments); }); + + it('should be visible in step 3 when postfach is configured', () => { + component.sendByManual$ = of(false); + component.activeStep$ = of(3); + component.isPostfachConfigured$ = of(true); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, bescheidAttachments); + }); }); describe('update and bescheiden', () => { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts index 9833b6c7e244803f50b9234a4f94d51fbb3c749d..fdc71f20a21b61d3a14f5942f3eebca547b02214 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts @@ -1,8 +1,8 @@ import { Bescheid, BescheidResource, - BescheidSendBy, BescheidService, + DocumentResource, UploadFileInProgress, } from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; @@ -34,6 +34,10 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { public bescheidDocumentFile$: Observable<StateResource<BinaryFileResource>> = of( createEmptyStateResource<BinaryFileResource>(), ); + public bescheidDocument$: Observable<StateResource<DocumentResource>> = of( + createEmptyStateResource<DocumentResource>(), + ); + public isPostfachConfigured$: Observable<boolean>; public saveAndSendInProgress$: Observable<StateResource<CommandResource>> = of( createEmptyStateResource<CommandResource>(), @@ -47,8 +51,6 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { loading: false, }); - public readonly bescheidSendBy = BescheidSendBy; - constructor( private bescheidService: BescheidService, public formService: BescheidenFormService, @@ -61,6 +63,8 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { this.bescheidService.getUploadBescheidDocumentInProgress(); this.createBescheidDocumentInProgress$ = this.bescheidService.getCreateBescheidDocumentInProgress(); + this.bescheidDocument$ = this.bescheidService.getBescheidDocument(); + this.isPostfachConfigured$ = this.bescheidService.isPostfachConfigured(); this.activeStep$ = this.formService.getActiveStep(); this.bescheid$ = this.formService.getBescheidChanges(); @@ -71,7 +75,12 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { this.bescheidService.deleteBescheidDocument(); } - public saveAndSend(bescheidDraft: BescheidResource): void { + public saveAndSendManually(bescheidDraft: BescheidResource): void { + this.formService.clearNachricht(); + this.saveAndSendInProgress$ = this.doSaveAndSend(bescheidDraft); + } + + public saveAndSendWithNachricht(bescheidDraft: BescheidResource): void { this.saveAndSendInProgress$ = this.doSaveAndSend(bescheidDraft); } 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html index e8490d92e2cbda9e40ae3f6bc21fc9cf588bb012..0755d974036beed033db585e4fd65985ee013ce9 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html +++ 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.html @@ -1,7 +1,7 @@ <ng-container *ngIf="bescheidDraftStateResource.resource as bescheidDraft"> <div class="mt-4"> <ods-button - *ngIf="bescheidDraft | hasLink: bescheidLinkRel.CREATE_BESCHEID_DOCUMENT" + *ngIf="bescheidDraft | hasLink: bescheidLinkRel.CREATE_DOCUMENT" class="w-72" [isLoading]="(createBescheidDocumentInProgress$ | async).loading" (click)="createBescheidDocument()" 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts index b94bbe86ca5a3901bc1e93e27b15a82fee5743a8..d0d6bb3254e4c5129d251bd0033eaca8980ea505 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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.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-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts @@ -60,7 +60,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => { describe('create bescheid document button', () => { beforeEach(() => { component.bescheidDraftStateResource = createStateResource( - createBescheidResource([BescheidLinkRel.CREATE_BESCHEID_DOCUMENT]), + createBescheidResource([BescheidLinkRel.CREATE_DOCUMENT]), ); fixture.detectChanges(); @@ -81,7 +81,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => { it('should be visible if link is present', () => { component.bescheidDraftStateResource = createStateResource( - createBescheidResource([BescheidLinkRel.CREATE_BESCHEID_DOCUMENT]), + createBescheidResource([BescheidLinkRel.CREATE_DOCUMENT]), ); fixture.detectChanges(); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts index 603b542986bb209433147bf5f1842ae454dc2a38..cc4c4cd8027dd41689d7937837fa7992023ab248 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts @@ -77,6 +77,7 @@ import { VorgangDetailBackButtonComponent } from './vorgang-detail-page/vorgang- import { VorgangDetailBescheidenFormErrorComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-form-error/vorgang-detail-bescheiden-form-error.component'; import { VorgangDetailBescheidenResultAttachmentsComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component'; import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component'; +import { VorgangDetailBescheidenResultNachrichtComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-nachricht/vorgang-detail-bescheiden-result-nachricht.component'; import { VorgangDetailBescheidenResultStatusComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-status/vorgang-detail-bescheiden-result-status.component'; import { VorgangDetailBescheidenResultComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component'; import { VorgangDetailBescheidenStepButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-step-buttons/vorgang-detail-bescheiden-step-button/vorgang-detail-bescheiden-step-button.component'; @@ -190,6 +191,7 @@ const routes: Routes = [ VorgangDetailBescheidenResultAttachmentsComponent, VorgangDetailBescheidenFormErrorComponent, VorgangDetailBescheidenBescheidVersendenComponent, + VorgangDetailBescheidenResultNachrichtComponent, ], exports: [ VorgangDetailAntragstellerComponent, diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts index 4501f9dd24a6281055e309eb04f5c211161f2e8e..41d1e94862b57a486bf7129415a25a1906781dc3 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.spec.ts @@ -21,9 +21,19 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Vorgang } from '@alfa-client/vorgang-shared'; -import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; -import { getAktenzeichenText, VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN } from './vorgang-util'; +import { EMPTY_STRING } from '@alfa-client/tech-shared'; +import { Antragsteller, Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { + createAntragsteller, + createEingang, + createVorgangResource, + createVorgangWithEingangResource, +} from 'libs/vorgang-shared/test/vorgang'; +import { + VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN, + getAktenzeichenText, + getEmpfaenger, +} from './vorgang-util'; describe('Vorgang Util', () => { describe('getAktenzeichenText', () => { @@ -43,4 +53,58 @@ describe('Vorgang Util', () => { expect(result).toEqual(VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN); }); }); + + describe('getEmpfaenger', () => { + it('should return nachname only if exists', () => { + const antragsteller: Antragsteller = { ...createAntragsteller(), vorname: undefined }; + const vorgangWithEingangResource: VorgangWithEingangResource = + createWithAntragsteller(antragsteller); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual(antragsteller.nachname); + }); + + it('should return vorname only if exists', () => { + const antragsteller: Antragsteller = { ...createAntragsteller(), nachname: undefined }; + const vorgangWithEingangResource: VorgangWithEingangResource = + createWithAntragsteller(antragsteller); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual(antragsteller.vorname); + }); + + it('should return name and vorname if exists', () => { + const vorgangWithEingangResource: VorgangWithEingangResource = + createVorgangWithEingangResource(); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual( + `${vorgangWithEingangResource.eingang.antragsteller.vorname} ${vorgangWithEingangResource.eingang.antragsteller.nachname}`, + ); + }); + + it('should return empty string if none exists', () => { + const antragsteller: Antragsteller = { + ...createAntragsteller(), + nachname: undefined, + vorname: undefined, + }; + const vorgangWithEingangResource: VorgangWithEingangResource = + createWithAntragsteller(antragsteller); + + const empfaenger: string = getEmpfaenger(vorgangWithEingangResource); + + expect(empfaenger).toEqual(EMPTY_STRING); + }); + + function createWithAntragsteller(antragsteller: Antragsteller): VorgangWithEingangResource { + return { + ...createVorgangWithEingangResource(), + eingang: { ...createEingang(), antragsteller }, + }; + } + }); }); diff --git a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts index 97b7913c19a9f5b76b209c105dcb9934a797ff52..5d90f07fe9a46e9c19ab44294aab7ffb32f7138b 100644 --- a/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts +++ b/alfa-client/libs/vorgang-shared-ui/src/lib/vorgang-util.ts @@ -21,10 +21,23 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Vorgang } from '@alfa-client/vorgang-shared'; +import { EMPTY_STRING } from '@alfa-client/tech-shared'; +import { Vorgang, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; export const VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN = 'kein Aktenzeichen'; export function getAktenzeichenText(vorgang: Vorgang): string { return vorgang.aktenzeichen || VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN; } + +export function getEmpfaenger(vorgangWithEingangResource: VorgangWithEingangResource): string { + return `${getVorname(vorgangWithEingangResource)} ${getNachname(vorgangWithEingangResource)}`.trim(); +} + +function getVorname(vorgangWithEingangResource: VorgangWithEingangResource): string { + return vorgangWithEingangResource.eingang.antragsteller?.vorname ?? EMPTY_STRING; +} + +function getNachname(vorgangWithEingangResource: VorgangWithEingangResource): string { + return vorgangWithEingangResource.eingang.antragsteller?.nachname ?? EMPTY_STRING; +} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java index 365d7e268306e05d8025a8a9e7c6937186804d53..8ebf3d388dd200bb2d9ee9a5d57f817ab4a3817a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java @@ -23,12 +23,15 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc static final String REL_UPLOAD_ATTACHMENT = "uploadAttachment"; static final String REL_ATTACHMENTS = "attachments"; static final String REL_UPDATE = "update"; - static final String REL_CREATE_BESCHEID_DOCUMENT = "createBescheidDocument"; + static final String REL_CREATE_DOCUMENT = "createDocument"; + static final String REL_CREATE_DOCUMENT_FROM_FILE = "createDocumentFromFile"; static final String REL_BESCHEID_DOCUMENT = "bescheidDocument"; static final String REL_SEND = "send"; private static final Predicate<Bescheid> HAS_ATTACHMENTS = bescheid -> !bescheid.getAttachments().isEmpty(); + private final BescheidService bescheidService; + @Override public EntityModel<Bescheid> toModel(Bescheid bescheid) { var selfLink = linkTo(methodOn(BescheidController.class).getDraft(bescheid.getVorgangId())); @@ -49,7 +52,9 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc .ifMatch(HAS_ATTACHMENTS) .addLink(attachmentsLink.withRel(REL_ATTACHMENTS)) .addLink(createCommandLink.withRel(REL_UPDATE)) - .addLink(createCommandLink.withRel(REL_CREATE_BESCHEID_DOCUMENT)) + .ifMatch(bescheidService::canCreateBescheidDocumentAutomatically) + .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT)) + .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT_FROM_FILE)) .addLink(createCommandLink.withRel(REL_SEND)) .buildModel(); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java index c68d00855d06ecfe745b0d0d63f6c0435eea804d..52a882303b0466a417fa37894702a4a49bf655e8 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidRemoteService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import de.ozgcloud.alfa.common.GrpcUtil; import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub; import de.ozgcloud.bescheid.GrpcBescheid; +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest; import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest; import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse; import net.devh.boot.grpc.client.inject.GrpcClient; @@ -35,4 +36,9 @@ class BescheidRemoteService { Optional<GrpcBescheid> getBescheidFromResponse(GrpcGetBescheidDraftResponse response) { return response.hasBescheid() ? Optional.of(response.getBescheid()) : Optional.empty(); } + + public boolean canCreateBescheidDocument() { + var response = bescheidServiceStub.getConfig(GrpcBescheidManagerConfigRequest.newBuilder().build()); + return response.hasFeatures() && response.getFeatures().getCanCreateBescheidDocument(); + } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java index 67bef19968599583c09c5ab5ecde6b241aed3a4d..5d8bbe22a333e181203dd2b445c5d38a0f51da2a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidService.java @@ -15,4 +15,8 @@ public class BescheidService { public Optional<Bescheid> getBescheidDraft(String vorgangId) { return remoteService.getBescheidDraft(vorgangId); } + + public boolean canCreateBescheidDocumentAutomatically() { + return remoteService.canCreateBescheidDocument(); + } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java index 78d288a3afb3324f1a9c60a9cc9ab07608f5e4df..450d840af3c37898c155029886b6241e1220f679 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java @@ -2,6 +2,7 @@ package de.ozgcloud.alfa.bescheid; import static de.ozgcloud.alfa.bescheid.BescheidModelAssembler.*; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; import java.util.Collections; @@ -9,11 +10,12 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import org.springframework.hateoas.LinkRelation; import org.springframework.web.util.UriTemplate; import de.ozgcloud.alfa.common.command.CommandController; @@ -22,8 +24,12 @@ import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; class BescheidModelAssemblerTest { @Spy + @InjectMocks private BescheidModelAssembler assembler; + @Mock + private BescheidService bescheidService; + @Nested class TestToModel { @@ -88,10 +94,29 @@ class BescheidModelAssemblerTest { } @Test - void shouldHaveCreateBescheidDocumentLink() { + void shouldHaveCreateDocumentLink() { + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(true); + var model = callToModel(); - assertThat(model.getLink(REL_CREATE_BESCHEID_DOCUMENT)).isPresent().get().extracting(Link::getHref) + assertThat(model.getLink(REL_CREATE_DOCUMENT)).isPresent().get().extracting(Link::getHref) + .isEqualTo(createCommandLink()); + } + + @Test + void shoulNotdHaveCreateDocumentLink() { + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(false); + + var model = callToModel(); + + assertThat(model.getLink(REL_CREATE_DOCUMENT)).isEmpty(); + } + + @Test + void shouldHaveCreateDocumentFromFileLink() { + var model = callToModel(); + + assertThat(model.getLink(REL_CREATE_DOCUMENT_FROM_FILE)).isPresent().get().extracting(Link::getHref) .isEqualTo(createCommandLink()); } @@ -111,16 +136,6 @@ class BescheidModelAssemblerTest { .isEqualTo(String.format("%s/%s", DocumentController.PATH, BescheidTestFactory.BESCHEID_DOCUMENT)); } - @Test - void shouldHaveOnlyExpectedLinks() { - var model = callToModel(); - - assertThat(model.getLinks()).extracting(Link::getRel).containsExactlyInAnyOrder( - IanaLinkRelations.SELF, LinkRelation.of(REL_DELETE), LinkRelation.of(REL_UPLOAD_BESCHEID_FILE), - LinkRelation.of(REL_UPLOAD_ATTACHMENT), LinkRelation.of(REL_ATTACHMENTS), LinkRelation.of(REL_UPDATE), - LinkRelation.of(REL_CREATE_BESCHEID_DOCUMENT), LinkRelation.of(REL_BESCHEID_DOCUMENT), LinkRelation.of(REL_SEND)); - } - @Test void shouldHaveSendLink() { var model = callToModel(); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java index 8c06cc6275761009a474a91a10488a3aa9ac6143..1a60e85c321546fc174228b0be968448b882e74e 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidRemoteServiceTest.java @@ -14,6 +14,8 @@ import org.mockito.Spy; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub; +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest; +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse; import de.ozgcloud.bescheid.GrpcGetBescheidDraftRequest; import de.ozgcloud.bescheid.GrpcGetBescheidDraftResponse; @@ -119,4 +121,53 @@ class BescheidRemoteServiceTest { } } + @Nested + class TestCanCreateBescheidDocument { + + private final GrpcBescheidManagerConfigRequest request = GrpcBescheidManagerConfigRequestTestFactory.create(); + private final GrpcBescheidManagerConfigResponse respone = GrpcBescheidManagerConfigResponseTestFactory.create(); + + @BeforeEach + void setUp() { + when(bescheidServiceStub.getConfig(request)).thenReturn(respone); + } + + @Test + void shouldCallRemoteService() { + service.canCreateBescheidDocument(); + + verify(bescheidServiceStub).getConfig(request); + } + + @Test + void shouldReturnTrue() { + var canCreate = service.canCreateBescheidDocument(); + + assertThat(canCreate).isTrue(); + } + + @Test + void shouldReturnFalseIfNoFeaturesAvailable() { + when(bescheidServiceStub.getConfig(request)).thenReturn(GrpcBescheidManagerConfigResponse.newBuilder().build()); + + var canCreate = service.canCreateBescheidDocument(); + + assertThat(canCreate).isFalse(); + } + + @Test + void shouldReturnFalseIfFeatureDisabled() { + var respones = GrpcBescheidManagerConfigResponseTestFactory.createBuilder() + .setFeatures(GrpcBescheidManagerFeaturesTestFactory.createBuilder() + .setCanCreateBescheidDocument(false) + .build()) + .build(); + when(bescheidServiceStub.getConfig(request)).thenReturn(respones); + + var canCreate = service.canCreateBescheidDocument(); + + assertThat(canCreate).isFalse(); + } + } + } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java index 6241bdce4c6a7c514c9e6273a7235d11736156ba..53b89afb965f0068dc6559753069634a0bac69ee 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidServiceTest.java @@ -7,6 +7,8 @@ import java.util.Optional; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -41,4 +43,25 @@ class BescheidServiceTest { assertThat(result).isEqualTo(remoteServiceResult); } } + + @Nested + class TestCanCreateBescheidDocumentAutomatically { + + @Test + void shouldCallRemoteService() { + service.canCreateBescheidDocumentAutomatically(); + + verify(remoteService).canCreateBescheidDocument(); + } + + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldRetrun(boolean canCreateBescheidDocument) { + when(remoteService.canCreateBescheidDocument()).thenReturn(canCreateBescheidDocument); + + var canCreateAutomatically = service.canCreateBescheidDocumentAutomatically(); + + assertThat(canCreateAutomatically).isEqualTo(canCreateBescheidDocument); + } + } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b3b7518632401a74dadba71ea91a0da1b09bfd61 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigRequestTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.alfa.bescheid; + +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigRequest; + +public class GrpcBescheidManagerConfigRequestTestFactory { + + public static GrpcBescheidManagerConfigRequest create() { + return createBuilder().build(); + } + + public static GrpcBescheidManagerConfigRequest.Builder createBuilder() { + return GrpcBescheidManagerConfigRequest.newBuilder(); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..72a9bcb5fe4267782c78acf48703c9f580e66a5c --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerConfigResponseTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.alfa.bescheid; + +import de.ozgcloud.bescheid.GrpcBescheidManagerConfigResponse; + +public class GrpcBescheidManagerConfigResponseTestFactory { + + public static GrpcBescheidManagerConfigResponse create() { + return createBuilder().build(); + } + + public static GrpcBescheidManagerConfigResponse.Builder createBuilder() { + return GrpcBescheidManagerConfigResponse.newBuilder().setFeatures(GrpcBescheidManagerFeaturesTestFactory.create()); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..fc745ca20b8507af338b860735958df1e828640a --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/GrpcBescheidManagerFeaturesTestFactory.java @@ -0,0 +1,16 @@ +package de.ozgcloud.alfa.bescheid; + +import de.ozgcloud.bescheid.GrpcBescheidManagerFeatures; + +public class GrpcBescheidManagerFeaturesTestFactory { + + public static final boolean CAN_CREATE_BESCHEID = true; + + public static GrpcBescheidManagerFeatures create() { + return createBuilder().build(); + } + + public static GrpcBescheidManagerFeatures.Builder createBuilder() { + return GrpcBescheidManagerFeatures.newBuilder().setCanCreateBescheidDocument(CAN_CREATE_BESCHEID); + } +} diff --git a/pom.xml b/pom.xml index b061f02e10eb46999380c84b53b3fcc1aedeb8ba..7986fc9ca35ec07cbd7a20e207f108f2cec4274e 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <vorgang-manager.version>2.6.0</vorgang-manager.version> + <vorgang-manager.version>2.7.0-SNAPSHOT</vorgang-manager.version> <ozgcloud-common-pdf.version>3.0.1</ozgcloud-common-pdf.version> <user-manager.version>2.2.0</user-manager.version>