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-server/src/main/resources/application-local.yml b/alfa-server/src/main/resources/application-local.yml index 6e08f1833de6c4fa25055aaa545745fb6a1a46bb..961e14d6fa3f44e0a1382e4b26c924e1fe0fd2d2 100644 --- a/alfa-server/src/main/resources/application-local.yml +++ b/alfa-server/src/main/resources/application-local.yml @@ -26,6 +26,10 @@ ozgcloud: url: http://localhost:9092 profile-template: /api/userProfiles/%s search-template: /api/userProfiles/?searchBy={searchBy} + xdomea: + behoerdenschluessel: "behoerdenschluesselWirdÜberHelmGesetzt" + behoerdenschluesselUri: "behoerdenschluesselUriWirdÜberHelmGesetzt" + behoerdenschluesselVersion: "behoerdenschluesselVersionWirdÜberHelmGesetzt" keycloak: auth-server-url: http://localhost:8088 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/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/VersionTypeBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/VersionTypeBuilder.java index 6e6924f1e9c77d72a6dc8e18aed2bdea3d604a07..3937b36d4eb85deb773eac2dcd0d1cad63a098c7 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/VersionTypeBuilder.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/VersionTypeBuilder.java @@ -13,7 +13,7 @@ import de.xoev.xdomea.VersionType; public class VersionTypeBuilder { public static final String VERSION_NUMMER = "1"; public static final String DATEI_FORMAT_LIST_URI = "urn:xoev-de:xdomea:codeliste:dateiformat"; - public static final String LIST_VERSION_ID = "vCBzR"; + public static final String LIST_VERSION_ID = "2.0"; private OzgFile ozgFile; private ZonedDateTime createdAt; private String ersteller; diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java index 63ace13435d4cdd1a6fbbc0abbbbb77d398668a0..ae734f35808d7cff6c55d85f30070b136539630f 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java @@ -72,18 +72,7 @@ class XdomeaNachrichtBuilder { public AbgabeAbgabe0401 build() { addVorgangDokumente(); addVorgangChangeHistory(); - - var abgabeType = new AbgabeAbgabe0401(); - abgabeType.setKopf(kopf); - abgabeType.getSchriftgutobjekt().add(createSchriftgutobjekt()); - return abgabeType; - } - - private Schriftgutobjekt createSchriftgutobjekt() { - var schriftgutobjekt = new Schriftgutobjekt(); - schriftgutobjekt.setVorgang(vorgang); - schriftgutobjekt.setAkte(aktenzeichen); - return schriftgutobjekt; + return createAbgabeType(); } void addVorgangDokumente() { @@ -96,4 +85,24 @@ class XdomeaNachrichtBuilder { void addVorgangChangeHistory() { historie.forEach(vorgang.getHistorienProtokollInformation()::add); } + + AbgabeAbgabe0401 createAbgabeType() { + var abgabeType = new AbgabeAbgabe0401(); + abgabeType.setKopf(kopf); + abgabeType.getSchriftgutobjekt().add(createSchriftgutobjektVorgang()); + abgabeType.getSchriftgutobjekt().add(createSchriftgutobjektAkte()); + return abgabeType; + } + + private Schriftgutobjekt createSchriftgutobjektVorgang() { + var schriftgutobjekt = new Schriftgutobjekt(); + schriftgutobjekt.setVorgang(vorgang); + return schriftgutobjekt; + } + + private Schriftgutobjekt createSchriftgutobjektAkte() { + var schriftgutobjekt = new Schriftgutobjekt(); + schriftgutobjekt.setAkte(aktenzeichen); + return schriftgutobjekt; + } } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java index c2f59b1d50bca5d9902a5bc6defec49015edc1a3..b6b91bf3b14188ba000c8e797374e7753b0d5740 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java @@ -1,5 +1,7 @@ package de.ozgcloud.alfa.export; +import jakarta.validation.constraints.NotNull; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -15,5 +17,10 @@ public class XdomeaProperties { /** * xdomea Behoerdenschluessel. */ + @NotNull private String behoerdenschluessel; + @NotNull + private String behoerdenschluesselUri; + @NotNull + private String behoerdenschluesselVersion; } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java index 2e36dd77eb1da1e8f721b66d5e2d74c86484ee2a..26ca34e45be143fbd7aa2d46c5cd21f223416835 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java @@ -1,26 +1,17 @@ package de.ozgcloud.alfa.kommentar; -import de.ozgcloud.alfa.common.DateConverter; -import de.ozgcloud.alfa.common.PrimaerdokumentTypeBuilder; -import de.ozgcloud.alfa.common.UUIDConverter; import java.util.Collections; import java.util.List; import de.ozgcloud.alfa.common.AnlageDokumentTypeBuilder; +import de.ozgcloud.alfa.common.DateConverter; import de.ozgcloud.alfa.common.IdentifikationObjektTypeBuilder; import de.ozgcloud.alfa.common.file.OzgFile; import de.xoev.xdomea.AnlageDokumentType; import de.xoev.xdomea.DokumentType; -import de.xoev.xdomea.FormatType; import de.xoev.xdomea.HistorienProtokollInformationType; -import de.xoev.xdomea.IdentifikationObjektType; -import de.xoev.xdomea.VersionType; -import java.util.Collections; -import java.util.List; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.StringUtils; @NoArgsConstructor(access = AccessLevel.PRIVATE) class DokumentTypeBuilder { @@ -85,5 +76,4 @@ class DokumentTypeBuilder { return this.authorFullName + "; " + this.organisationseinheitenID; } - } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java index a31903a23072ed69eac7f8537ea16171d052e36a..e5c2cddfa66a67517f7cc0f24d7c384be37dac22 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java @@ -20,9 +20,6 @@ import lombok.RequiredArgsConstructor; @Component class KopfCreator { - static final String BEHOERDENSCHLUSSEL_LIST_URI = "urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs"; - static final String BEHOERDENSCHLUSSEL_LIST_VERSION_ID = "2023-11-30"; - static final String NACHRICHTENTYP_CODE_TYPE_LIST_URI = "urn:xoev-de:xdomea:codeliste:nachrichtentyp"; static final String NACHRICHTENTYP_CODE_TYPE_LIST_VERSION_ID = "2.0"; static final String NACHRICHTENTYP_ABGABE_ABGABE_TYPE_CODE = "0401"; @@ -78,8 +75,8 @@ class KopfCreator { Code createBehoerdenschlussen() { var behoerdenschlussel = new Code(); behoerdenschlussel.setCode(xDomeaProperties.getBehoerdenschluessel()); - behoerdenschlussel.setListURI(BEHOERDENSCHLUSSEL_LIST_URI); - behoerdenschlussel.setListVersionID(BEHOERDENSCHLUSSEL_LIST_VERSION_ID); + behoerdenschlussel.setListURI(xDomeaProperties.getBehoerdenschluesselUri()); + behoerdenschlussel.setListVersionID(xDomeaProperties.getBehoerdenschluesselVersion()); return behoerdenschlussel; } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeBuilderTest.java index cfa67b0f0f45dff3c9881a3a64a7b05876d69a37..219cca4fdeb0a561cf52a66fd6af6414fcc2fd3f 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeBuilderTest.java @@ -173,6 +173,13 @@ class VersionTypeBuilderTest { assertThat(dateiformatCode.getListURI()).isEqualTo(VersionTypeBuilder.DATEI_FORMAT_LIST_URI); } + @Test + void shouldHaveListVersionID() { + var dateiformatCode = builder.createDateiformatCodeType(); + + assertThat(dateiformatCode.getListVersionID()).isEqualTo(VersionTypeBuilder.LIST_VERSION_ID); + } + @Test void shouldGetXdomeaCode() { builder.createDateiformatCodeType(); diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java index f7fda37ca90273d24630868b4b1a940ec32b9e31..5e7b4ea241d987d8713cab382e833fde766882cb 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java @@ -1,13 +1,19 @@ package de.ozgcloud.alfa.export; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.Spy; import de.ozgcloud.alfa.common.HistorienProtokollInformationTypeTestFactory; import de.ozgcloud.alfa.vorgang.VorgangTypeTestFactory; +import de.xoev.xdomea.AbgabeAbgabe0401; +import de.xoev.xdomea.AkteType; import de.xoev.xdomea.DokumentType; import de.xoev.xdomea.HistorienProtokollInformationType; import de.xoev.xdomea.NkAbgabeType; @@ -15,76 +21,139 @@ import de.xoev.xdomea.VorgangType; class XdomeaNachrichtBuilderTest { - private final NkAbgabeType kopfType = NkAbgabeTypeTestFactory.create(); private final VorgangType vorgangType = VorgangTypeTestFactory.create(); - private final List<DokumentType> representations = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); - private final List<DokumentType> attachments = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); - private final List<HistorienProtokollInformationType> historie = List.of(HistorienProtokollInformationTypeTestFactory.create(), - HistorienProtokollInformationTypeTestFactory.create()); - private final List<DokumentType> kommentare = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); - private final List<DokumentType> postfachMails = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); + @Spy private final XdomeaNachrichtBuilder builder = XdomeaNachrichtBuilder.builder().withVorgang(vorgangType); - @Test - void shoulAddOneSchriftgutobjekt() { - var abgabeType = builder.build(); + @Nested + class TestBuild { + private final AbgabeAbgabe0401 expectedAbgabe = AbgabeAbgabe0401TestFactory.create(); - assertThat(abgabeType.getSchriftgutobjekt()).size().isEqualTo(1); - } + @BeforeEach + void setUpMock() { + doReturn(expectedAbgabe).when(builder).createAbgabeType(); + } - @Test - void shouldSetVorgang() { - var abgabeType = builder.build(); + @Test + void shouldCallAddVorgangDokumente() { + builder.build(); - assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang()).isEqualTo(vorgangType); - } + verify(builder).addVorgangDokumente(); + } - @Test - void shouldSetKopf() { - var abgabeType = builder.withKopf(kopfType).build(); + @Test + void shouldCallAddVorgangChangeHistory() { + builder.build(); - assertThat(abgabeType.getKopf()).isEqualTo(kopfType); - } + verify(builder).addVorgangChangeHistory(); + } - @Test - void shouldAddRepresentations() { - var abgabeType = builder.withRepresentations(representations).build(); + @Test + void shouldCallCreateAbgabeType() { + builder.build(); - assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getDokument()).isEqualTo(representations); - } + verify(builder).createAbgabeType(); + } - @Test - void shouldAddAttachments() { - var abgabeType = builder.withAttachments(attachments).build(); + @Test + void shouldReturnAbgabeType() { + var abgabeType = builder.build(); - assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getDokument()).isEqualTo(attachments); + assertThat(abgabeType).isEqualTo(expectedAbgabe); + } } - @Test - void shouldAddHistorie() { - var abgabeType = builder.withHistorie(historie).build(); + @Nested + class TestCreateAbgabeType { + private final NkAbgabeType kopfType = NkAbgabeTypeTestFactory.create(); + private final AkteType akte = AkteTypeTestFactory.create(); - assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getHistorienProtokollInformation()).isEqualTo(historie); - } + @Test + void shouldHaveKopf() { + var abgabeType = builder.withKopf(kopfType).createAbgabeType(); + + assertThat(abgabeType.getKopf()).isEqualTo(kopfType); + } - @Test - void shouldNotAddHistorie() { - var abgabeType = builder.build(); + @Test + void shoulAddTwoSchriftgutobjekt() { + var abgabeType = builder.withAktenzeichen(akte).createAbgabeType(); + + assertThat(abgabeType.getSchriftgutobjekt()).size().isEqualTo(2); + } + + @Test + void shouldHaveVorgangSchriftgutObjekt() { + var abgabeType = builder.createAbgabeType(); + + assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang()).isEqualTo(vorgangType); + } + + @Test + void shouldHaveAkteSchriftgutObjekt() { + var abgabeType = builder.withAktenzeichen(akte).createAbgabeType(); + + assertThat(abgabeType.getSchriftgutobjekt().get(1).getAkte()).isEqualTo(akte); + } - assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getHistorienProtokollInformation()).isEmpty(); } - @Test - void shouldAddKommentare() { - var abgabeType = builder.withKommentare(kommentare).build(); + @Nested + class TestAddVorgangDokumente { + private final List<DokumentType> representations = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); + private final List<DokumentType> attachments = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); + private final List<DokumentType> kommentare = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); + private final List<DokumentType> postfachMails = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); + + @Test + void shouldAddRepresentations() { + builder.withRepresentations(representations).addVorgangDokumente(); + + assertThat(vorgangType.getDokument()).isEqualTo(representations); + } + + @Test + void shouldAddAttachments() { + builder.withAttachments(attachments).addVorgangDokumente(); + + assertThat(vorgangType.getDokument()).isEqualTo(attachments); + } + + @Test + void shouldAddKommentare() { + builder.withKommentare(kommentare).addVorgangDokumente(); + + assertThat(vorgangType.getDokument()).isEqualTo(kommentare); + } + + @Test + void shouldAddPostfachMails() { + builder.withPostfachMails(postfachMails).addVorgangDokumente(); + + assertThat(vorgangType.getDokument()).isEqualTo(postfachMails); + } - assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getDokument()).isEqualTo(kommentare); } - @Test - void shouldAddPostfachMails() { - var abgabeType = builder.withPostfachMails(postfachMails).build(); + @Nested + class TestAddVorgangChangeHistory { + + private final List<HistorienProtokollInformationType> historie = List.of(HistorienProtokollInformationTypeTestFactory.create(), + HistorienProtokollInformationTypeTestFactory.create()); + + @Test + void shouldAddHistorie() { + builder.withHistorie(historie).addVorgangChangeHistory(); - assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getDokument()).isEqualTo(postfachMails); + assertThat(vorgangType.getHistorienProtokollInformation()).isEqualTo(historie); + } + + @Test + void shouldNotAddHistorie() { + builder.addVorgangChangeHistory(); + + assertThat(vorgangType.getHistorienProtokollInformation()).isEmpty(); + } } + } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java index 1bce187cf0a5b5374f18273a56d90000bff3a931..b602ccaf432568741a7f089b2ebccbb8fb1f1791 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java @@ -1,6 +1,7 @@ package de.ozgcloud.alfa.vorgang; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.time.ZoneOffset; @@ -14,6 +15,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import com.thedeanda.lorem.LoremIpsum; + import de.ozgcloud.alfa.common.DateConverter; import de.ozgcloud.alfa.export.XdomeaProperties; import de.xoev.xdomea.BehoerdenkennungType; @@ -214,7 +217,7 @@ class KopfCreatorTest { @Test void shouldSetCode() { - var expectedBehoerdenschluessel = "123456789"; + var expectedBehoerdenschluessel = LoremIpsum.getInstance().getWords(1); when(xDomeaProperties.getBehoerdenschluessel()).thenReturn(expectedBehoerdenschluessel); var behoerdenschlussel = creator.createBehoerdenschlussen(); @@ -224,16 +227,22 @@ class KopfCreatorTest { @Test void shouldSetListURI() { + var expectedBehoerdenschluesselUri = LoremIpsum.getInstance().getUrl(); + when(xDomeaProperties.getBehoerdenschluesselUri()).thenReturn(expectedBehoerdenschluesselUri); + var behoerdenschlussel = creator.createBehoerdenschlussen(); - assertThat(behoerdenschlussel.getListURI()).isEqualTo(KopfCreator.BEHOERDENSCHLUSSEL_LIST_URI); + assertThat(behoerdenschlussel.getListURI()).isEqualTo(expectedBehoerdenschluesselUri); } @Test void shouldSetListVersionID() { + var expectedBehoerdenschluesselVersion = LoremIpsum.getInstance().getWords(1); + when(xDomeaProperties.getBehoerdenschluesselVersion()).thenReturn(expectedBehoerdenschluesselVersion); + var behoerdenschlussel = creator.createBehoerdenschlussen(); - assertThat(behoerdenschlussel.getListVersionID()).isEqualTo(KopfCreator.BEHOERDENSCHLUSSEL_LIST_VERSION_ID); + assertThat(behoerdenschlussel.getListVersionID()).isEqualTo(expectedBehoerdenschluesselVersion); } } 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> diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index b101df46569ff6e1c9432472921bfc8bf7fc1423..1aabf05903d1c0b2e15f6b686e9945f5c943f757 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -101,6 +101,12 @@ spec: value: {{ $bescheid.formEngineName }} {{- end }} {{- end}} + - name: ozgcloud_xdomea_behoerdenschluessel + value: {{ required "ozgcloud.xdomea.behoerdenschluessel muss angegeben sein" ((.Values.ozgcloud).xdomea).behoerdenschluessel | quote }} + - name: ozgcloud_xdomea_behoerdenschluesselUri + value: {{ required "ozgcloud.xdomea.behoerdenschluesselUri muss angegeben sein" ((.Values.ozgcloud).xdomea).behoerdenschluesselUri}} + - name: ozgcloud_xdomea_behoerdenschluesselVersion + value: {{ required "ozgcloud.xdomea.behoerdenschluesselVersion muss angegeben sein" ((.Values.ozgcloud).xdomea).behoerdenschluesselVersion | quote }} image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}" imagePullPolicy: Always diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml index 73536126680ed22d458c77db4f0e36a4ad07f262..7eb04a7cbd54b8dbc684a2801d67bf86f48beab6 100644 --- a/src/test/helm-linter-values.yaml +++ b/src/test/helm-linter-values.yaml @@ -28,6 +28,10 @@ ozgcloud: bundesland: sh bezeichner: helm environment: test + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" networkPolicy: ssoPublicIp: 51.89.117.53/32 @@ -36,4 +40,4 @@ networkPolicy: sso: serverUrl: https://sso.company.local -imagePullSecret: image-pull-secret \ No newline at end of file +imagePullSecret: image-pull-secret diff --git a/src/test/helm/deployment_63_char_test.yaml b/src/test/helm/deployment_63_char_test.yaml index 829ab69eac2a57630c55691468e1a4e31d2619a7..56f935559c21ba44f1d895bdccc6f614649be9c5 100644 --- a/src/test/helm/deployment_63_char_test.yaml +++ b/src/test/helm/deployment_63_char_test.yaml @@ -26,7 +26,7 @@ suite: test deyploment less than 63 chars release: name: alfa namespace: sh-helm-test - + chart: name: alfa @@ -37,6 +37,10 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local baseUrl: test.company.local @@ -60,4 +64,4 @@ tests: errorMessage: .Chart.Name-.Chart.Version alfa-1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen) - it: should not fail on .Chart.Name-.Chart.Version length less than 63 characters asserts: - - notFailedTemplate: {} \ No newline at end of file + - notFailedTemplate: {} diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml index fc77e8acfcca27bbbe6b9f482b81f1e5cb0e84a3..a42e08b93f1e55ace76e0f928514ac4744d5a32a 100644 --- a/src/test/helm/deployment_bindings_test.yaml +++ b/src/test/helm/deployment_bindings_test.yaml @@ -33,14 +33,18 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local baseUrl: test.company.local imagePullSecret: image-pull-secret tests: - it: should have volumes - set: - usermanagerName: user-manager + set: + usermanagerName: user-manager asserts: - contains: path: spec.template.spec.containers[0].volumeMounts @@ -69,21 +73,21 @@ tests: subPath: ca.crt readOnly: true - it: should have volume mounts - set: - usermanagerName: user-manager + set: + usermanagerName: user-manager asserts: - contains: - path: spec.template.spec.volumes - content: - name: bindings - configMap: - name: alfa-bindings-type + path: spec.template.spec.volumes + content: + name: bindings + configMap: + name: alfa-bindings-type - contains: - path: spec.template.spec.volumes - content: - name: user-manager-tls-certificate - secret: - secretName: user-manager-tls-cert + path: spec.template.spec.volumes + content: + name: user-manager-tls-certificate + secret: + secretName: user-manager-tls-cert - contains: path: spec.template.spec.volumes content: @@ -94,9 +98,9 @@ tests: content: name: sso-tls-certificate - it: should have sso tls cert mount - set: - usermanagerName: user-manager - sso: + set: + usermanagerName: user-manager + sso: tlsCertName: sso-tls-cert serverUrl: https://sso.company.local asserts: @@ -130,4 +134,4 @@ tests: path: spec.template.spec.volumes content: name: user-manager-tls-certificate - any: true \ No newline at end of file + any: true diff --git a/src/test/helm/deployment_customList_env_test.yaml b/src/test/helm/deployment_customList_env_test.yaml index 7ed06f83209a96790e36ab6cd35d31608a44fff1..688ff738fed603778050d6875fbac57b72d0a039 100644 --- a/src/test/helm/deployment_customList_env_test.yaml +++ b/src/test/helm/deployment_customList_env_test.yaml @@ -22,15 +22,19 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test environments customList +suite: test environments customList templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret diff --git a/src/test/helm/deployment_defaults_affinity_test.yaml b/src/test/helm/deployment_defaults_affinity_test.yaml index 10518783e34f874d4b9f40270b9795d6ce7f8ce0..30d186a2b5f90146d41b4d9268db11399a6e82b3 100644 --- a/src/test/helm/deployment_defaults_affinity_test.yaml +++ b/src/test/helm/deployment_defaults_affinity_test.yaml @@ -33,6 +33,10 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local baseUrl: test.company.local diff --git a/src/test/helm/deployment_defaults_env_test.yaml b/src/test/helm/deployment_defaults_env_test.yaml index 46fa731257e72bf9a8769bcb8376624c801a8a53..2e5e68b5275e27c9c755cc71cc6a80366834ed51 100644 --- a/src/test/helm/deployment_defaults_env_test.yaml +++ b/src/test/helm/deployment_defaults_env_test.yaml @@ -34,13 +34,17 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret tests: - it: check default values - set: - usermanagerName: user-manager + set: + usermanagerName: user-manager asserts: - isKind: of: Deployment @@ -55,14 +59,13 @@ tests: name: grpc_client_user-manager_address value: user-manager.sh-helm-test:9000 - - it: should have service binding root - set: - usermanagerName: user-manager + set: + usermanagerName: user-manager asserts: - contains: - path: spec.template.spec.containers[0].env - content: + path: spec.template.spec.containers[0].env + content: name: SERVICE_BINDING_ROOT value: "/bindings" @@ -132,4 +135,4 @@ tests: path: spec.template.spec.containers[0].env content: name: grpc_client_user-manager_negotiationType - value: TLS \ No newline at end of file + value: TLS diff --git a/src/test/helm/deployment_defaults_labels_test.yaml b/src/test/helm/deployment_defaults_labels_test.yaml index 1bbcef91e098fabe4cc2467529972884294eb0b3..93e3dc85202ef0dd11f8465f13de5a9ac322833a 100644 --- a/src/test/helm/deployment_defaults_labels_test.yaml +++ b/src/test/helm/deployment_defaults_labels_test.yaml @@ -28,13 +28,17 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml - + set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -43,11 +47,11 @@ tests: asserts: - equal: path: metadata.labels - value: + value: app.kubernetes.io/instance: alfa app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: alfa app.kubernetes.io/namespace: sh-helm-test app.kubernetes.io/part-of: ozgcloud app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS - helm.sh/chart: alfa-0.0.0-MANAGED-BY-JENKINS \ No newline at end of file + helm.sh/chart: alfa-0.0.0-MANAGED-BY-JENKINS diff --git a/src/test/helm/deployment_defaults_spec_containers_health_test.yaml b/src/test/helm/deployment_defaults_spec_containers_health_test.yaml index 5748514857cb81f4e4d03befc9a1a122ea5d9945..a216743645f6f9b105815166fd2fff59b9837db7 100644 --- a/src/test/helm/deployment_defaults_spec_containers_health_test.yaml +++ b/src/test/helm/deployment_defaults_spec_containers_health_test.yaml @@ -24,65 +24,68 @@ suite: test deployment health check release: - name: alfa - namespace: sh-helm-test + name: alfa + namespace: sh-helm-test templates: - - templates/deployment.yaml + - templates/deployment.yaml set: - baseUrl: test.company.local - ozgcloud: - environment: test - bundesland: sh - bezeichner: helm - sso: - serverUrl: https://sso.company.local - imagePullSecret: image-pull-secret + baseUrl: test.company.local + ozgcloud: + environment: test + bundesland: sh + bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" + sso: + serverUrl: https://sso.company.local + imagePullSecret: image-pull-secret tests: - - it: should have correct valaues for health check - asserts: - - equal: - path: spec.template.spec.containers[0].readinessProbe.failureThreshold - value: 3 - - equal: - path: spec.template.spec.containers[0].readinessProbe.httpGet.path - value: /actuator/health/readiness - - equal: - path: spec.template.spec.containers[0].readinessProbe.httpGet.port - value: 8081 - - equal: - path: spec.template.spec.containers[0].readinessProbe.httpGet.scheme - value: HTTP - - equal: - path: spec.template.spec.containers[0].readinessProbe.periodSeconds - value: 10 - - equal: - path: spec.template.spec.containers[0].readinessProbe.successThreshold - value: 1 - - equal: - path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds - value: 3 - - equal: - path: spec.template.spec.containers[0].startupProbe.failureThreshold - value: 10 - - equal: - path: spec.template.spec.containers[0].startupProbe.httpGet.path - value: /actuator/health/readiness - - equal: - path: spec.template.spec.containers[0].startupProbe.httpGet.port - value: 8081 - - equal: - path: spec.template.spec.containers[0].startupProbe.httpGet.scheme - value: HTTP - - equal: - path: spec.template.spec.containers[0].startupProbe.initialDelaySeconds - value: 30 - - equal: - path: spec.template.spec.containers[0].startupProbe.periodSeconds - value: 5 - - equal: - path: spec.template.spec.containers[0].startupProbe.successThreshold - value: 1 - - equal: - path: spec.template.spec.containers[0].startupProbe.timeoutSeconds - value: 5 - \ No newline at end of file + - it: should have correct valaues for health check + asserts: + - equal: + path: spec.template.spec.containers[0].readinessProbe.failureThreshold + value: 3 + - equal: + path: spec.template.spec.containers[0].readinessProbe.httpGet.path + value: /actuator/health/readiness + - equal: + path: spec.template.spec.containers[0].readinessProbe.httpGet.port + value: 8081 + - equal: + path: spec.template.spec.containers[0].readinessProbe.httpGet.scheme + value: HTTP + - equal: + path: spec.template.spec.containers[0].readinessProbe.periodSeconds + value: 10 + - equal: + path: spec.template.spec.containers[0].readinessProbe.successThreshold + value: 1 + - equal: + path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds + value: 3 + - equal: + path: spec.template.spec.containers[0].startupProbe.failureThreshold + value: 10 + - equal: + path: spec.template.spec.containers[0].startupProbe.httpGet.path + value: /actuator/health/readiness + - equal: + path: spec.template.spec.containers[0].startupProbe.httpGet.port + value: 8081 + - equal: + path: spec.template.spec.containers[0].startupProbe.httpGet.scheme + value: HTTP + - equal: + path: spec.template.spec.containers[0].startupProbe.initialDelaySeconds + value: 30 + - equal: + path: spec.template.spec.containers[0].startupProbe.periodSeconds + value: 5 + - equal: + path: spec.template.spec.containers[0].startupProbe.successThreshold + value: 1 + - equal: + path: spec.template.spec.containers[0].startupProbe.timeoutSeconds + value: 5 diff --git a/src/test/helm/deployment_defaults_spec_containers_securityContext_test.yaml b/src/test/helm/deployment_defaults_spec_containers_securityContext_test.yaml index be7c9a27dd4b584c17247abe363db669a3e349fc..db495d1e81c7f9b105260ba621c1241b23365437 100644 --- a/src/test/helm/deployment_defaults_spec_containers_securityContext_test.yaml +++ b/src/test/helm/deployment_defaults_spec_containers_securityContext_test.yaml @@ -34,6 +34,10 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -92,4 +96,4 @@ tests: path: spec.template.spec.containers[0].securityContext.capabilities value: drop: - - ALL \ No newline at end of file + - ALL diff --git a/src/test/helm/deployment_defaults_spec_containers_test.yaml b/src/test/helm/deployment_defaults_spec_containers_test.yaml index cf97d4e2ea8b3526b6e0f57616fdb6d02822e215..d6fa262f48d0e455f791bdd3c559c512813379f6 100644 --- a/src/test/helm/deployment_defaults_spec_containers_test.yaml +++ b/src/test/helm/deployment_defaults_spec_containers_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -78,4 +82,4 @@ tests: value: metrics - equal: path: spec.template.spec.containers[0].ports[1].protocol - value: TCP \ No newline at end of file + value: TCP diff --git a/src/test/helm/deployment_defaults_sso_env_test.yaml b/src/test/helm/deployment_defaults_sso_env_test.yaml index d3bb35a1793e67a0a45089df6b2bc4e3d3bc50dd..0b8017066f12fb6fa88c5a5bf930df8979df054b 100644 --- a/src/test/helm/deployment_defaults_sso_env_test.yaml +++ b/src/test/helm/deployment_defaults_sso_env_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -83,4 +87,4 @@ tests: path: spec.template.spec.containers[0].env content: name: keycloak_resource - value: different-client \ No newline at end of file + value: different-client diff --git a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml index 7bb4be03499b6a5a87c307773eacdd2e9833c64b..a319bba88c827ee006de7735576d16dd74152e78 100644 --- a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml +++ b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -51,4 +55,4 @@ tests: value: ScheduleAnyway - equal: path: spec.template.spec.topologySpreadConstraints[0].labelSelector.matchLabels["app.kubernetes.io/name"] - value: alfa \ No newline at end of file + value: alfa diff --git a/src/test/helm/deployment_host_aliases_test.yaml b/src/test/helm/deployment_host_aliases_test.yaml index 6e631160b32aa36bd2e3edc30bd8106f91b004ff..579000d7c63681b7bd4f4d772183693e5e54062c 100644 --- a/src/test/helm/deployment_host_aliases_test.yaml +++ b/src/test/helm/deployment_host_aliases_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -47,13 +51,13 @@ tests: hostAliases: - ip: "127.0.0.1" hostname: - - "eins" - - "zwei" + - "eins" + - "zwei" asserts: - contains: path: spec.template.spec.hostAliases content: ip: "127.0.0.1" hostname: - - "eins" - - "zwei" + - "eins" + - "zwei" diff --git a/src/test/helm/deployment_imageTag_test.yaml b/src/test/helm/deployment_imageTag_test.yaml index 6183e22152abbf377cc00fba756eddacdc3f1c92..e3973e264491fed4a3b0e6970a0585a27ef56907 100644 --- a/src/test/helm/deployment_imageTag_test.yaml +++ b/src/test/helm/deployment_imageTag_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -44,4 +48,4 @@ tests: asserts: - equal: path: spec.template.spec.containers[0].image - value: docker.ozg-sh.de/alfa:latest \ No newline at end of file + value: docker.ozg-sh.de/alfa:latest diff --git a/src/test/helm/deployment_imagepull_secret_test.yaml b/src/test/helm/deployment_imagepull_secret_test.yaml index f7bd1f34172e0b0fb27bb65c65e449c4022dc2aa..e0fbf9fe891c1402f864c965e4cf4d6e2eb87da1 100644 --- a/src/test/helm/deployment_imagepull_secret_test.yaml +++ b/src/test/helm/deployment_imagepull_secret_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local tests: @@ -47,4 +51,4 @@ tests: - it: should fail template if imagepullsecret not set asserts: - failedTemplate: - errormessage: imagePullSecret must be set \ No newline at end of file + errormessage: imagePullSecret must be set diff --git a/src/test/helm/deployment_liveness_probe_test.yaml b/src/test/helm/deployment_liveness_probe_test.yaml index 0c0fde464c0a336863ea1fbca809e96ff2f045f9..688d7362586c481e7fd64b16ebd7a28cc729580a 100644 --- a/src/test/helm/deployment_liveness_probe_test.yaml +++ b/src/test/helm/deployment_liveness_probe_test.yaml @@ -34,6 +34,10 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -62,4 +66,4 @@ tests: - it: not enable livenessProbe by default asserts: - isNull: - path: spec.template.spec.containers[0].livenessProbe \ No newline at end of file + path: spec.template.spec.containers[0].livenessProbe diff --git a/src/test/helm/deployment_pod_default_spec_values_test.yaml b/src/test/helm/deployment_pod_default_spec_values_test.yaml index aab286ae8900126630d6c293cf79b5e82005d6bd..fe479d789bf85d6d7196fde97b17b77371adf3b3 100644 --- a/src/test/helm/deployment_pod_default_spec_values_test.yaml +++ b/src/test/helm/deployment_pod_default_spec_values_test.yaml @@ -1,4 +1,4 @@ - # +# # Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den # Ministerpräsidenten des Landes Schleswig-Holstein # Staatskanzlei @@ -34,12 +34,16 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret tests: - - it: should have correct pod template values - asserts: + - it: should have correct pod template values + asserts: - isEmpty: path: spec.template.spec.dnsConfig - equal: @@ -53,4 +57,4 @@ tests: value: "default-scheduler" - equal: path: spec.template.spec.terminationGracePeriodSeconds - value: 30 \ No newline at end of file + value: 30 diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml index ee5785c522f4c35288c78ef4dc10eb6b959bb057..ae938d402582e9a87963775eeab6a0077d1b277a 100644 --- a/src/test/helm/deployment_resources_test.yaml +++ b/src/test/helm/deployment_resources_test.yaml @@ -27,12 +27,16 @@ release: name: alfa templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -62,4 +66,4 @@ tests: - it: test empty resources asserts: - isEmpty: - path: spec.template.spec.containers[0].resources \ No newline at end of file + path: spec.template.spec.containers[0].resources diff --git a/src/test/helm/deployment_service_account_test.yaml b/src/test/helm/deployment_service_account_test.yaml index 7e5a49ca0e13dffb4588f6855fe9cd25e88db9fa..a57bc628ff6b7c1cd4f290efb45740b24a22bb18 100644 --- a/src/test/helm/deployment_service_account_test.yaml +++ b/src/test/helm/deployment_service_account_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -58,4 +62,4 @@ tests: - it: should use default service account asserts: - isNull: - path: spec.template.spec.serviceAccountName \ No newline at end of file + path: spec.template.spec.serviceAccountName diff --git a/src/test/helm/deployment_springProfile_env_test.yaml b/src/test/helm/deployment_springProfile_env_test.yaml index 73a7188c0ec0dbba5c1ae45480c4fffc1471d197..c9507240396ac72e74db4dd34147d3d4df8b9825 100644 --- a/src/test/helm/deployment_springProfile_env_test.yaml +++ b/src/test/helm/deployment_springProfile_env_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -53,4 +57,4 @@ tests: path: spec.template.spec.containers[0].env content: name: spring_profiles_active - value: oc, test \ No newline at end of file + value: oc, test diff --git a/src/test/helm/deployment_usermanager_address_env_test.yaml b/src/test/helm/deployment_usermanager_address_env_test.yaml index 028e532557a65b3874420f6447a806f67dd4508a..58c7cb58e5b4c4c4223c0451fc64728724abcc20 100644 --- a/src/test/helm/deployment_usermanager_address_env_test.yaml +++ b/src/test/helm/deployment_usermanager_address_env_test.yaml @@ -34,6 +34,10 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret diff --git a/src/test/helm/deployment_vorgang_manager_address_env_test.yaml b/src/test/helm/deployment_vorgang_manager_address_env_test.yaml index 6c71f04812469eb3d0d06e2abaaedc1ff79d83b4..5ad441a04a40b50098c7567829e2010d3853e38f 100644 --- a/src/test/helm/deployment_vorgang_manager_address_env_test.yaml +++ b/src/test/helm/deployment_vorgang_manager_address_env_test.yaml @@ -28,12 +28,16 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: baseUrl: test.company.local ozgcloud: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret diff --git a/src/test/helm/deployment_xdomea_env_test.yaml b/src/test/helm/deployment_xdomea_env_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7656d2d0ea2d8a7295222ed701c908f6cfdc1760 --- /dev/null +++ b/src/test/helm/deployment_xdomea_env_test.yaml @@ -0,0 +1,82 @@ +suite: deployment xdomea env +release: + name: alfa + namespace: sh-helm-test +templates: + - templates/deployment.yaml +set: + baseUrl: test.company.local + ozgcloud: + environment: test + bundesland: sh + bezeichner: helm + sso: + serverUrl: https://sso.company.local + imagePullSecret: image-pull-secret +tests: + - it: should fail on missing behoerdenschlüssel + set: + ozgcloud: + xdomea: + behoerdenschluesselUri: "uri.uri:uri" + behoerdenschluesselVersion: "version 1" + asserts: + - failedTemplate: + errorMessage: "ozgcloud.xdomea.behoerdenschluessel muss angegeben sein" + - it: should set behoerdenschlüssel + set: + ozgcloud: + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: "uri.uri:uri" + behoerdenschluesselVersion: "version 1" + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_xdomea_behoerdenschluessel + value: "123456" + - it: should fail on missing behoerdenschlüsselUri + set: + ozgcloud: + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselVersion: "version 1" + asserts: + - failedTemplate: + errorMessage: "ozgcloud.xdomea.behoerdenschluesselUri muss angegeben sein" + - it: should set behoerdenschlüsselUri + set: + ozgcloud: + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: "uri.uri:uri" + behoerdenschluesselVersion: "version 1" + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_xdomea_behoerdenschluesselUri + value: "uri.uri:uri" + - it: should fail on missing behoerdenschlüsselVersion + set: + ozgcloud: + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: "uri.uri:uri" + asserts: + - failedTemplate: + errorMessage: "ozgcloud.xdomea.behoerdenschluesselVersion muss angegeben sein" + - it: should set behoerdenschlüsselVersion + set: + ozgcloud: + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: "uri.uri:uri" + behoerdenschluesselVersion: "version 1" + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_xdomea_behoerdenschluesselVersion + value: "version 1" diff --git a/src/test/helm/deyploment_general_value_and_default_spec_test.yaml b/src/test/helm/deyploment_general_value_and_default_spec_test.yaml index edbcc4123f4322e758e45653c99d92b4a078519c..37001633477f2064777c9ceede85bbe9af9dfff5 100644 --- a/src/test/helm/deyploment_general_value_and_default_spec_test.yaml +++ b/src/test/helm/deyploment_general_value_and_default_spec_test.yaml @@ -34,6 +34,10 @@ set: environment: test bundesland: sh bezeichner: helm + xdomea: + behoerdenschluessel: "123456" + behoerdenschluesselUri: uri.uri:uri + behoerdenschluesselVersion: "Version 1" sso: serverUrl: https://sso.company.local imagePullSecret: image-pull-secret @@ -44,18 +48,17 @@ tests: - isKind: of: Deployment - isAPIVersion: - of: "apps/v1" - - - it: should have correct deployment metadata - asserts: + of: "apps/v1" + + - it: should have correct deployment metadata + asserts: - equal: path: metadata.name value: alfa - - equal: + - equal: path: metadata.namespace value: sh-helm-test - - it: should have correct deyployment general spec values asserts: - equal: @@ -69,12 +72,10 @@ tests: value: 10 - it: should have correct deployment spec strategy values asserts: - - equal: + - equal: path: spec.strategy - value: + value: rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate - -