diff --git a/alfa-client/apps/alfa-e2e/docker-compose.yml b/alfa-client/apps/alfa-e2e/docker-compose.yml index c27955be603132e6ae731d4c2a8b6d1acd9341a6..154c8acf1c8bc8699222bda82de1282a1a3b8bd2 100644 --- a/alfa-client/apps/alfa-e2e/docker-compose.yml +++ b/alfa-client/apps/alfa-e2e/docker-compose.yml @@ -49,6 +49,13 @@ services: - SPRING_DATA_MONGODB_DATABASE=local - SPRING_PROFILES_ACTIVE=${SPRING_PROFILE:-local,e2e} - LOGGING_CONFIG=classpath:log4j2-local.xml + - GRPC_CLIENT_PLUTO_NEGOTIATIONTYPE=PLAINTEXT + - GRPC_CLIENT_VORGANG-MANAGER_NEGOTIATIONTYPE=PLAINTEXT + - GRPC_CLIENT_EMAIL_NEGOTIATIONTYPE=PLAINTEXT + - GRPC_CLIENT_NACHRICHTEN-MANAGER_NEGOTIATIONTYPE=PLAINTEXT + - GRPC_CLIENT_INFO-MANAGER_NEGOTIATIONTYPE=PLAINTEXT + - GRPC_CLIENT_COMMAND-MANAGER_NEGOTIATIONTYPE=PLAINTEXT + - GRPC_SERVER_SECURITY_ENABLED=false ports: - 9091:9090 depends_on: @@ -64,6 +71,7 @@ services: - GRPC_CLIENT_USER-MANAGER_ADDRESS=static://user-manager:9000 - GRPC_CLIENT_USER-MANAGER_NEGOTIATIONTYPE=PLAINTEXT - GRPC_CLIENT_VORGANG-MANAGER_ADDRESS=static://vorgang-manager:9090 + - GRPC_CLIENT_VORGANG-MANAGER_NEGOTIATIONTYPE=PLAINTEXT - KEYCLOAK_AUTH_SERVER_URL=https://sso.dev.by.ozg-cloud.de - KEYCLOAK_REALM=${KEYCLOAK_REALM:-by-e2e-tests-local-dev} - KEYCLOAK_RESOURCE=${KEYCLOAK_CLIENT:-alfa} diff --git a/alfa-client/apps/demo/src/app/app.component.html b/alfa-client/apps/demo/src/app/app.component.html index 6b8faecc400c23f08eb874d8a45386b27f9e455b..693f99b0c88cd5577c6d4b42c9cab445ab2554a8 100644 --- a/alfa-client/apps/demo/src/app/app.component.html +++ b/alfa-client/apps/demo/src/app/app.component.html @@ -149,7 +149,7 @@ <ods-button-card class="w-72" [isLoading]="false" - text="Bescheid-Dokument" + text="Bescheiddokument" subText="automatisch erstellen" > <ods-bescheid-generate-icon icon /> @@ -160,7 +160,7 @@ <ods-button-card class="w-72" [isLoading]="true" - text="Bescheid-Dokument" + text="Bescheiddokument" subText="automatisch erstellen" > <ods-bescheid-generate-icon icon /> @@ -171,7 +171,7 @@ <ods-button-card class="w-72" [isLoading]="true" - text="Bescheid-Dokument" + text="Bescheiddokument" subText="automatisch erstellen" > <ods-bescheid-generate-icon icon /> @@ -182,7 +182,7 @@ <ods-button-card class="w-96" [isLoading]="true" - text="Bescheid-Dokument und noch mehr" + text="Bescheiddokument und noch mehr" subText="Subtext in der 2ten Reihe" > <ods-bescheid-generate-icon icon /> @@ -190,7 +190,7 @@ </div> <div class="mt-4"> - <ods-button-card class="w-72" [isLoading]="true" text="Bescheid-Dokument"> + <ods-button-card class="w-72" [isLoading]="true" text="Bescheiddokument"> <ods-bescheid-generate-icon icon /> </ods-button-card> </div> @@ -199,14 +199,14 @@ <ods-file-upload-button class="w-72" [isLoading]="false" id="upload117"> <ods-bescheid-upload-icon icon /> <ods-spinner-icon spinner size="extra-large" /> - <p text class="text-center">Bescheid-Dokument<br />hochladen</p></ods-file-upload-button + <p text class="text-center">Bescheiddokument<br />hochladen</p></ods-file-upload-button > </div> <div class="mt-4"> <ods-file-upload-button class="w-72" [isLoading]="true" id="upload117"> <ods-bescheid-upload-icon icon /> <ods-spinner-icon spinner size="extra-large" /> - <p text class="text-center">Bescheid-Dokument<br />hochladen</p></ods-file-upload-button + <p text class="text-center">Bescheiddokument<br />hochladen</p></ods-file-upload-button > </div> 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 19cd002222b625f513309a5bf98a72aa9a982e7f..a120af6e0825c4a292affa1f14694eb0c3184411 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 @@ -927,6 +927,14 @@ describe('BescheidService', () => { singleCold(createEmptyStateResource()), ); }); + + it('should emit empty state resource uploaded attachment', () => { + service.init(); + + expect(service.getUploadedAttachment()).toBeObservable( + singleCold(createEmptyStateResource()), + ); + }); }); describe('create bescheid document', () => { @@ -1351,4 +1359,98 @@ describe('BescheidService', () => { expect(service.bescheidListService.refresh).toHaveBeenCalled(); }); }); + + describe('uploadAttachment', () => { + const bescheidResource: BescheidResource = createBescheidResource([ + BescheidLinkRel.UPLOAD_ATTACHMENT, + ]); + const file: File = createFile(); + const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource( + createBinaryFileResource(), + ); + + beforeEach(() => { + binaryFileService.uploadFile.mockReturnValue(of(binaryFileStateResource)); + service.handleAttachmentUpload = jest.fn(); + }); + + it('should emit upload in progress', () => { + service.uploadAttachment(bescheidResource, file).subscribe(); + + expect(service.getUploadAttachmentInProgress()).toBeObservable( + singleCold({ fileName: file.name, loading: true } as UploadFileInProgress), + ); + }); + + it('should upload file', (done) => { + service.uploadAttachment(bescheidResource, file).subscribe(() => { + expect(binaryFileService.uploadFile).toBeCalledWith( + bescheidResource, + BescheidLinkRel.UPLOAD_ATTACHMENT, + file, + false, + ); + done(); + }); + }); + + it('should handle attachment upload', (done) => { + service.uploadAttachment(bescheidResource, file).subscribe(() => { + expect(service.handleAttachmentUpload).toBeCalledWith(binaryFileStateResource); + done(); + }); + }); + + it('should emit uploaded binary file', () => { + expect(service.uploadAttachment(bescheidResource, file)).toBeObservable( + singleColdCompleted(binaryFileStateResource), + ); + }); + }); + + describe('handleAttachmentUpload', () => { + describe('on error', () => { + const binaryFileStateResource: StateResource<BinaryFileResource> = + createErrorStateResource(createApiError()); + + it('should emit upload in progress', () => { + service.handleAttachmentUpload(binaryFileStateResource); + + expect(service.getUploadAttachmentInProgress()).toBeObservable( + singleCold({ + loading: false, + error: binaryFileStateResource.error, + } as UploadFileInProgress), + ); + }); + + it('should emit binary file', () => { + service.handleAttachmentUpload(binaryFileStateResource); + + expect(service.getUploadedAttachment()).toBeObservable(singleCold(binaryFileStateResource)); + }); + }); + + describe('on success', () => { + const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource( + createBinaryFileResource(), + ); + + it('should emit upload in progress', () => { + service.handleAttachmentUpload(binaryFileStateResource); + + expect(service.getUploadAttachmentInProgress()).toBeObservable( + singleCold({ + loading: false, + } as UploadFileInProgress), + ); + }); + + it('should emit binary file', () => { + service.handleAttachmentUpload(binaryFileStateResource); + + expect(service.getUploadedAttachment()).toBeObservable(singleCold(binaryFileStateResource)); + }); + }); + }); }); 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 51939bd89281d0a5e4c2971c026cebf8f6ef34ce..05a83a1c4861aaf65fd48d1d90c9d4873f680175 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -19,7 +19,7 @@ import { createStateResource, filterIsLoadedOrHasError, getEmbeddedResources, - hasError, + hasStateResourceError, isLoaded, isNotEmpty, sortByGermanDateStr, @@ -42,6 +42,7 @@ import { map, startWith, switchMap, + tap, } from 'rxjs'; import { ListResourceServiceConfig, @@ -97,6 +98,13 @@ export class BescheidService { readonly uploadBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> = new BehaviorSubject<UploadFileInProgress>({ loading: false }); + readonly uploadAttachmentInProgress$: BehaviorSubject<UploadFileInProgress> = new BehaviorSubject( + { loading: false }, + ); + + readonly uploadedAttachment$: BehaviorSubject<StateResource<BinaryFileResource>> = + new BehaviorSubject(createEmptyStateResource()); + loadBescheidDocumentSubscription: Subscription; constructor( @@ -143,6 +151,7 @@ export class BescheidService { ); this.bescheidDocumentFile$.next(createEmptyStateResource()); this.bescheidDocumentUri$.next(null); + this.uploadedAttachment$.next(createEmptyStateResource()); } public getBescheidDraft(): Observable<StateResource<BescheidResource>> { @@ -323,10 +332,10 @@ export class BescheidService { private clearCreateBescheidDocumentInProgress(): void { this.createBescheidDocumentInProgress$.next({ loading: false }); } - private initUploadBescheidDocumentInProgress(fileName: string): void { this.uploadBescheidDocumentInProgress$.next({ fileName, loading: true }); } + public getUploadBescheidDocumentInProgress(): Observable<UploadFileInProgress> { return this.uploadBescheidDocumentInProgress$.asObservable(); } @@ -344,7 +353,7 @@ export class BescheidService { bescheid: BescheidResource, binaryFileStateResource: StateResource<BinaryFileResource>, ): void { - if (hasError(binaryFileStateResource)) { + if (hasStateResourceError(binaryFileStateResource)) { this.setUploadBescheidDocumentInProgressError(binaryFileStateResource.error); } else { this.createBescheidDocumentFromFile(bescheid, binaryFileStateResource.resource); @@ -364,7 +373,7 @@ export class BescheidService { commandStateResource: StateResource<CommandResource>, binaryFile: BinaryFileResource, ): void { - if (hasError(commandStateResource)) { + if (hasStateResourceError(commandStateResource)) { this.setUploadBescheidDocumentInProgressError(commandStateResource.error); } else { this.bescheidDocument$.next(createEmptyStateResource()); @@ -416,7 +425,7 @@ export class BescheidService { private handleCreateBescheidDocumentResponse( commandStateResource: StateResource<CommandResource>, ): void { - if (hasError(commandStateResource)) { + if (hasStateResourceError(commandStateResource)) { this.setCreateBescheidDocumentInProgressError(commandStateResource.error); } else { const documentUri: ResourceUri = getEffectedResourceUrl(commandStateResource.resource); @@ -521,4 +530,41 @@ export class BescheidService { public refreshList(): void { this.bescheidListService.refresh(); } + + public uploadAttachment( + bescheidResource: BescheidResource, + file: File, + ): Observable<StateResource<BinaryFileResource>> { + this.uploadAttachmentInProgress$.next({ fileName: file.name, loading: true }); + return this.binaryFileService + .uploadFile(bescheidResource, BescheidLinkRel.UPLOAD_ATTACHMENT, file, false) + .pipe( + tap((binaryFileStateResource: StateResource<BinaryFileResource>) => + this.handleAttachmentUpload(binaryFileStateResource), + ), + ); + } + + handleAttachmentUpload(binaryFileStateResource: StateResource<BinaryFileResource>) { + if (hasStateResourceError(binaryFileStateResource)) { + this.uploadAttachmentInProgress$.next({ + loading: false, + error: binaryFileStateResource.error, + }); + } else { + this.uploadAttachmentInProgress$.next({ + ...this.uploadAttachmentInProgress$.value, + loading: binaryFileStateResource.loading, + }); + } + this.uploadedAttachment$.next(binaryFileStateResource); + } + + public getUploadAttachmentInProgress(): Observable<UploadFileInProgress> { + return this.uploadAttachmentInProgress$.asObservable(); + } + + public getUploadedAttachment(): Observable<StateResource<BinaryFileResource>> { + return this.uploadedAttachment$.asObservable(); + } } diff --git a/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts b/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts index d9521a3ab95f6879515b7b398392fb57f2095d7c..3d7151381f57a1c9843bf17179f320bd3c28022c 100644 --- a/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts +++ b/alfa-client/libs/command-shared/src/lib/+state/command.effects.ts @@ -8,7 +8,7 @@ import { catchError, delay, map, mergeMap, switchMap, tap } from 'rxjs/operators import { COMMAND_ERROR_MESSAGES, CREATE_COMMAND_MESSAGE_BY_ORDER } from '../command.message'; import { CommandListResource, CommandResource, CreateCommandProps } from '../command.model'; import { CommandRepository } from '../command.repository'; -import { hasError, isConcurrentModification, isPending, isRevokeable } from '../command.util'; +import { hasCommandError, isConcurrentModification, isPending, isRevokeable } from '../command.util'; import { CommandProps, LoadCommandListProps, @@ -97,7 +97,7 @@ export class CommandEffects { if (isRevokeable(command)) { return [createCommandSuccess({ command }), showRevokeSnackbar({ command })]; } - if (hasError(command) && isConcurrentModification(command.errorMessage)) { + if (hasCommandError(command) && isConcurrentModification(command.errorMessage)) { this.showError(command); return [createCommandSuccess({ command }), publishConcurrentModificationAction()]; } diff --git a/alfa-client/libs/command-shared/src/lib/command.util.spec.ts b/alfa-client/libs/command-shared/src/lib/command.util.spec.ts index cd3f65d6bda037c9552175f7b5c81cdfc821b70c..7567dbc61f0de2a129af59416b91e373ace7e40d 100644 --- a/alfa-client/libs/command-shared/src/lib/command.util.spec.ts +++ b/alfa-client/libs/command-shared/src/lib/command.util.spec.ts @@ -31,7 +31,7 @@ import { CommandErrorMessage } from './command.message'; import { CommandListResource, CommandResource } from './command.model'; import { getPendingCommandByOrder, - hasError, + hasCommandError, isConcurrentModification, isDone, isPending, @@ -81,19 +81,19 @@ describe('CommandUtil', () => { describe('hasError', () => { it('should be true if no update link is present and command has error message', () => { - const result = hasError(createCommandErrorResource()); + const result = hasCommandError(createCommandErrorResource()); expect(result).toBeTruthy(); }); it('should be false if update link is present', () => { - const result = hasError(createCommandResource([CommandLinkRel.UPDATE])); + const result = hasCommandError(createCommandResource([CommandLinkRel.UPDATE])); expect(result).toBeFalsy(); }); it('should be false if error message is not present', () => { - const result = hasError(createCommandResource()); + const result = hasCommandError(createCommandResource()); expect(result).toBeFalsy(); }); diff --git a/alfa-client/libs/command-shared/src/lib/command.util.ts b/alfa-client/libs/command-shared/src/lib/command.util.ts index 8132a7d316e04b69db6af9aa5360895f5b4ae406..2dc64f425d39048734607a64cc12b984a47f3c03 100644 --- a/alfa-client/libs/command-shared/src/lib/command.util.ts +++ b/alfa-client/libs/command-shared/src/lib/command.util.ts @@ -43,7 +43,7 @@ export function hasErrorMessage(commandResource: CommandResource): boolean { return !isNil(commandResource.errorMessage) && !isEmpty(commandResource.errorMessage); } -export function hasError(commandResource: CommandResource): boolean { +export function hasCommandError(commandResource: CommandResource): boolean { return hasErrorMessage(commandResource) && !isPending(commandResource); } @@ -73,7 +73,7 @@ export function isConcurrentModification(errorMessage: string): boolean { } export function isSuccessfulDone(commandResource: CommandResource): boolean { - return isDone(commandResource) && !hasError(commandResource); + return isDone(commandResource) && !hasCommandError(commandResource); } export function getEffectedResourceUrl(command: CommandResource): ResourceUri { diff --git a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts index d7587434211166d8695269b96f639025a72a679e..26b8e0b77783d3dd5f6de9ef1eecbdc5c7db1220 100644 --- a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts +++ b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts @@ -24,9 +24,15 @@ import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.compone <ods-spinner-icon *ngIf="isLoading && !isError" size="large" /> </div> <div class="flex grow flex-col items-start break-all text-start text-text"> - <p class="text-sm" [ngClass]="isError && 'text-error'"> + <p *ngIf="!isError && !isLoading && caption" class="text-sm"> {{ caption }} </p> + <p *ngIf="isError && errorCaption" class="text-sm text-error"> + {{ errorCaption }} + </p> + <p *ngIf="isLoading && loadingCaption" class="text-sm"> + {{ loadingCaption }} + </p> <p *ngIf="description && !isError" class="text-xs text-text/65"> {{ description }} </p> @@ -38,7 +44,9 @@ import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.compone </button>`, }) export class AttachmentComponent { - @Input({ required: true }) caption!: string; + @Input() caption: string = ''; + @Input() errorCaption: string = ''; + @Input() loadingCaption: string = ''; @Input() fileType: string = ''; @Input() description = ''; @Input() isLoading: boolean = false; diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts index c425ea44e5bb2ef00586dd52fbf41cfb7af75e4b..21f33261b1d95be374068cd02b2fd9b3f063a075 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts @@ -35,7 +35,7 @@ import { StateResource, createEmptyStateResource, createStateResource, - hasError, + hasStateResourceError, } from '@alfa-client/tech-shared'; import { ForwardRequest, @@ -162,7 +162,7 @@ export class ForwardingService implements OnDestroy { } reloadCurrentVorgang(command: StateResource<CommandResource>): void { - if (!hasError(command)) { + if (!hasStateResourceError(command)) { this.vorgangService.reloadCurrentVorgang(); } } diff --git a/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts b/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts index dec067e551da7b7af88fdfdaf84bae1997f9b400..f4bc26e4687c2ce05b1cc7b3d36560b76a5a21df 100644 --- a/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts +++ b/alfa-client/libs/postfach-shared/src/lib/postfach.service.ts @@ -31,7 +31,7 @@ import { CommandResource, CommandService, doIfCommandIsDone, - hasError, + hasCommandError, isDone, isPending, } from '@alfa-client/command-shared'; @@ -152,7 +152,7 @@ export class PostfachService { } private showSnackbar(commandResource: CommandResource): void { - if (hasError(commandResource)) { + if (hasCommandError(commandResource)) { this.snackbarService.showError(PostfachMessages.SEND_FAILED); } else { this.snackbarService.show(commandResource, PostfachMessages.SEND_SUCCESSFUL); 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 6a4d16d49caa38d8901b8f352fded1be89bd7b59..e52afef42b76c88e8ddc22ddad0d5c59f1ffd8d5 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 @@ -28,7 +28,7 @@ import { PostfachMailListResource, PostfachService, } from '@alfa-client/postfach-shared'; -import { StateResource, hasError, isNotNull, isNotUndefined } from '@alfa-client/tech-shared'; +import { StateResource, hasStateResourceError, 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'; @@ -89,7 +89,7 @@ export class PostfachMailButtonContainerComponent { closeDialog(commandStateResource: StateResource<CommandResource>): void { if ( - !hasError(commandStateResource) && + !hasStateResourceError(commandStateResource) && commandStateResource.loaded && isNotUndefined(this.dialogRef) ) { diff --git a/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts b/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts index fc5bc2c029bbaa651be5cbf7eac39bf2700a7a94..f9277c5ac4d3b76a1b15e66a0bc718c558c1b497 100644 --- a/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/date.util.spec.ts @@ -24,7 +24,7 @@ import { formatDate, registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; import { - fixPartialYear, + add2000Years, formatDateWithoutYearWithTime, formatForDatabase, formatFullDate, @@ -209,12 +209,12 @@ describe('Date Util', () => { } }); - describe('fixPartialYear', () => { + describe('add2000Years', () => { it('should return Date in the 2000 millennium for 2 digit year value', () => { const dateInput: Date = new Date('0023-10-22'); const yearExpected: number = 2023; - const result: Date = fixPartialYear(dateInput); + const result: Date = add2000Years(dateInput); expect(result.getFullYear()).toBe(yearExpected); }); @@ -222,7 +222,7 @@ describe('Date Util', () => { it('should return Date unchanged for non 2 digit year value', () => { const dateInput: Date = new Date('2023-10-22'); - const result: Date = fixPartialYear(dateInput); + const result: Date = add2000Years(dateInput); expect(result).toBe(dateInput); }); diff --git a/alfa-client/libs/tech-shared/src/lib/date.util.ts b/alfa-client/libs/tech-shared/src/lib/date.util.ts index da5fe02a94d107c9c74e3b2b578da130aaf89fd9..5531d5cf09625ac35d85da39bddc6c5c57b42a19 100644 --- a/alfa-client/libs/tech-shared/src/lib/date.util.ts +++ b/alfa-client/libs/tech-shared/src/lib/date.util.ts @@ -102,7 +102,8 @@ function convertGermanDateString(dateStr: string): Date { return new Date(dateStr.replace(/(.*)\.(.*)\.(.*)/, '$3-$2-$1')); } -export function fixPartialYear(date: Date) { +// Workaround, solange MatDatepicker genutzt wird. +export function add2000Years(date: Date): Date { const year: number = date.getFullYear(); if (year.toString().length !== 2) { return date; diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts index b7bc23b1732d5ce0f2e3c5a941acde157a18b0e5..c2d7bc185fefd6f2fa682076a278fb962b413ce1 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.rxjs.operator.ts @@ -1,6 +1,6 @@ import { Resource } from '@ngxp/rest'; import { Observable, filter, map } from 'rxjs'; -import { StateResource, hasError, isLoaded } from './resource.util'; +import { StateResource, hasStateResourceError, isLoaded } from './resource.util'; export function filterIsLoadedOrHasError<T>(): ( source: Observable<StateResource<T>>, @@ -8,7 +8,7 @@ export function filterIsLoadedOrHasError<T>(): ( return (source: Observable<StateResource<T>>): Observable<StateResource<T>> => { return source.pipe( filter( - (stateResource: StateResource<T>) => hasError(stateResource) || isLoaded(stateResource), + (stateResource: StateResource<T>) => hasStateResourceError(stateResource) || isLoaded(stateResource), ), ); }; diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts index deaa71132a606f656d62efd87deded4ba3e71f2b..17394d5b91f600d6882f82fca324a97cdb046449 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.util.ts @@ -69,7 +69,7 @@ export function isLoaded<T>(stateResource: StateResource<T>): boolean { return !stateResource.loading && !stateResource.reload && isNotNull(stateResource.resource); } -export function hasError(stateResource: StateResource<any>): boolean { +export function hasStateResourceError(stateResource: StateResource<any>): boolean { return !isNil(stateResource.error); } @@ -115,7 +115,7 @@ export function getSuccessfullyLoaded<T extends Resource>( stateResources: StateResource<T>[], ): StateResource<T>[] { return stateResources.filter( - (stateResource) => isLoaded(stateResource) && !hasError(stateResource), + (stateResource) => isLoaded(stateResource) && !hasStateResourceError(stateResource), ); } diff --git a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts index 753c7422643ab606489987684c13e1ee097ae31b..a02d2bab0a0eadcc998270d2d06adc277961d236 100644 --- a/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts +++ b/alfa-client/libs/tech-shared/src/lib/service/formservice.abstract.ts @@ -27,7 +27,7 @@ import { Resource } from '@ngxp/rest'; import { isNil } from 'lodash-es'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { StateResource, hasError } from '../resource/resource.util'; +import { StateResource, hasStateResourceError } from '../resource/resource.util'; import { ApiError, HttpError, InvalidParam, Issue, ProblemDetail } from '../tech.model'; import { isNotUndefined } from '../tech.util'; import { @@ -56,7 +56,7 @@ export abstract class AbstractFormService { handleResponse(result: StateResource<Resource | HttpError>): StateResource<Resource | HttpError> { if (result.loading) return result; - if (hasError(result)) { + if (hasStateResourceError(result)) { this.handleError(result.error); } return result; diff --git a/alfa-client/libs/tech-shared/test/file.ts b/alfa-client/libs/tech-shared/test/file.ts index 4664c7c07c48b29995dfbef49dc2a27b7ad9b0f9..3f0fd180a866e86a1f9c2747bfae8b876a19950c 100644 --- a/alfa-client/libs/tech-shared/test/file.ts +++ b/alfa-client/libs/tech-shared/test/file.ts @@ -1,3 +1,5 @@ +import { faker } from '@faker-js/faker'; + export function createFile(): File { - return <any>{}; -} \ No newline at end of file + return <any>{ name: faker.datatype.string(10), type: 'image/png', size: 512 }; +} diff --git a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts index af091ae59f8bb7dd15807ee95bc512cdd02379ce..24020a5412e79d4e0c21e5c016d3aa6804d613d9 100644 --- a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts +++ b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts @@ -84,14 +84,14 @@ describe('DateEditorComponent', () => { }); describe('onBlur', () => { - it('should not call fixPartialYear if input value is not Date object', () => { + it('should not call add2000Years if input value is not Date object', () => { const inputValue: string = '12.12.2024'; component.fieldControl.setValue(inputValue); - const fixPartialYear = jest.spyOn(dateUtil, 'fixPartialYear'); + const add2000Years = jest.spyOn(dateUtil, 'add2000Years'); component.onBlur(); - expect(fixPartialYear).not.toHaveBeenCalled(); + expect(add2000Years).not.toHaveBeenCalled(); }); describe('if input value is Date object', () => { @@ -101,12 +101,12 @@ describe('DateEditorComponent', () => { component.fieldControl.setValue(inputValue); }); - it('should call fixPartialYear', () => { - const fixPartialYear = jest.spyOn(dateUtil, 'fixPartialYear'); + it('should call add2000Years', () => { + const add2000Years = jest.spyOn(dateUtil, 'add2000Years'); component.onBlur(); - expect(fixPartialYear).toHaveBeenCalledWith(inputValue); + expect(add2000Years).toHaveBeenCalledWith(inputValue); }); it('should call fieldControl.patchValue', () => { diff --git a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts index a2f0076e75436e58d9538642cc00c6fe9bb6b7b9..b93828d71bece9019d6ce554f0e93709114b4bc6 100644 --- a/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts +++ b/alfa-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.ts @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { fixPartialYear } from '@alfa-client/tech-shared'; +import { add2000Years } from '@alfa-client/tech-shared'; import { Component, Input } from '@angular/core'; import { MatDatepickerInputEvent } from '@angular/material/datepicker'; import { isDate } from 'date-fns'; @@ -44,7 +44,7 @@ export class DateEditorComponent extends FormControlEditorAbstractComponent { return; } - const value: Date = fixPartialYear(this.fieldControl.value); + const value: Date = add2000Years(this.fieldControl.value); this.fieldControl.patchValue(value); this.onChange(value); diff --git a/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts b/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts index 78547141a5665a15799b97afc211cee0134f8d49..2a5c2244d1530041467669e723103a3f8925df02 100644 --- a/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts +++ b/alfa-client/libs/user-profile/src/lib/user-icon/user-icon.component.ts @@ -25,7 +25,7 @@ import { Component, Input, SimpleChanges } from '@angular/core'; import { ApiError, createEmptyStateResource, - hasError, + hasStateResourceError, MessageCode, StateResource, } from '@alfa-client/tech-shared'; @@ -61,7 +61,7 @@ export class UserIconComponent { if (this.userProfileStateResource.resource) { return this.getUserTooltip(); } - if (hasError(this.userProfileStateResource)) { + if (hasStateResourceError(this.userProfileStateResource)) { return this.getErrorTooltip(); } return userProfileMessage.UNASSIGNED; diff --git a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts index 4a93a23e00e7211c40a49c585acd73d78bba2ed7..1f150a1e04e1c8799556a595330e3a93afdb9514 100644 --- a/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts +++ b/alfa-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-in-vorgang.component.ts @@ -26,7 +26,7 @@ import { ApiError, StateResource, createEmptyStateResource, - hasError, + hasStateResourceError, isServiceUnavailableMessageCode, } from '@alfa-client/tech-shared'; import { UserProfileResource } from '@alfa-client/user-profile-shared'; @@ -46,7 +46,7 @@ export class UserProfileInVorgangComponent { readonly vorgangLinkRel = VorgangWithEingangLinkRel; public isUserServiceAvailable(stateResource: StateResource<Resource>): boolean { - if (hasError(stateResource) && isServiceUnavailableMessageCode(<ApiError>stateResource.error)) { + if (hasStateResourceError(stateResource) && isServiceUnavailableMessageCode(<ApiError>stateResource.error)) { return false; } return true; diff --git a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts index 9048ea218b5a838a57884121a7e6be9b35173dcc..161feeb6fa3e48c8280195b5f2bcf5b121030d3f 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { AktenzeichenEditDialogComponent } from '@alfa-client/vorgang-detail'; +import { AktenzeichenEditDialogComponent } from './aktenzeichen-edit-dialog.component'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { mock } from '@alfa-client/test-utils'; import { @@ -32,7 +32,7 @@ import { import { COMMAND_ERROR_MESSAGES, CommandErrorMessage, - hasError, + hasCommandError, isSuccessfulDone, } from '@alfa-client/command-shared'; import { AktenzeichenEditDialogMessages } from './aktenzeichen-edit-dialog.message'; @@ -41,7 +41,7 @@ import { AktenzeichenEditDialogFormservice } from './aktenzeichen-edit-dialog.fo jest.mock('@alfa-client/tech-shared'); const isClipboardReadSupportedMock = isClipboardReadSupported as jest.Mock; jest.mock('@alfa-client/command-shared'); -const hasErrorMock = hasError as jest.Mock; +const hasErrorMock = hasCommandError as jest.Mock; const isSuccessfulDoneMock = isSuccessfulDone as jest.Mock; const hasContentMock = hasContent as jest.Mock; const createEmptyStateResourceMock = createEmptyStateResource as jest.Mock; diff --git a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts index 0ce392d5695903ef318c27c704c02b9c18eb8e16..d618bb16fbcb744d80cd6d8ae48ffd5523a2e2f5 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/aktenzeichen-edit-dialog/aktenzeichen-edit-dialog.component.ts @@ -1,7 +1,7 @@ import { COMMAND_ERROR_MESSAGES, CommandResource, - hasError, + hasCommandError, isSuccessfulDone, } from '@alfa-client/command-shared'; import { @@ -73,7 +73,7 @@ export class AktenzeichenEditDialogComponent implements OnInit { } onResponse(commandResource: CommandResource) { - if (commandResource && hasError(commandResource)) { + if (commandResource && hasCommandError(commandResource)) { this.showSnackbar(commandResource); } else if (isSuccessfulDone(commandResource)) { this.vorgangService.reloadCurrentVorgang(); @@ -82,7 +82,7 @@ export class AktenzeichenEditDialogComponent implements OnInit { } showSnackbar(commandResource: CommandResource): void { - if (hasError(commandResource)) { + if (hasCommandError(commandResource)) { this.snackBarService.showError(this.getErrorMessage(commandResource)); } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html index 897a93130bf9e8d21b120f86de04796e564b7300..be0c599a5b7e04df8b03cbe0c51568aed474e709 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html @@ -23,7 +23,7 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<ng-container *ngIf="!isVorgangInBearbeitung && vorgang | hasLink: linkRel.ABSCHLIESSEN"> +<ng-container *ngIf="vorgang | hasLink: linkRel.ABSCHLIESSEN"> <ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="abschliessen-button" diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts index ff72e924921e24b4de0a81d651dc2854ec06e266..4d98aa579e9927feab12c1474ebc7dfaddb8e926 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts @@ -134,18 +134,6 @@ describe('AbschliessenButtonComponent', () => { expect(buttonElement).not.toBeInstanceOf(HTMLElement); }); - it('should be hidden if in bearbeitung', () => { - component.vorgang = { - ...createVorgangWithEingangResource([VorgangWithEingangLinkRel.ABSCHLIESSEN]), - status: VorgangStatus.IN_BEARBEITUNG, - }; - - fixture.detectChanges(); - const buttonElement = fixture.nativeElement.querySelector(abschliessenButton); - - expect(buttonElement).not.toBeInstanceOf(HTMLElement); - }); - it('should be visible', () => { component.vorgang = createVorgangWithEingangResource([ VorgangWithEingangLinkRel.ABSCHLIESSEN, @@ -173,17 +161,6 @@ describe('AbschliessenButtonComponent', () => { expect(buttonElement).not.toBeInstanceOf(HTMLElement); }); - it('should be hidden if in bearbeitung', () => { - component.vorgang = { - ...createVorgangWithEingangResource([VorgangWithEingangLinkRel.ABSCHLIESSEN]), - status: VorgangStatus.IN_BEARBEITUNG, - }; - - fixture.detectChanges(); - const buttonElement = fixture.nativeElement.querySelector(abschliessenIconButton); - - expect(buttonElement).not.toBeInstanceOf(HTMLElement); - }); it('should be visible', () => { component.vorgang = createVorgangWithEingangResource([ diff --git a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts index c8475e5aae551b7cfedeeea0d9a15e36c58219e6..15df48ad2b497eed92ec4dfd36278e18fd3e506f 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.ts @@ -55,8 +55,4 @@ export class AbschliessenButtonComponent implements OnInit { public abschliessen(): void { this.commandStateResource$ = this.vorgangCommandService.abschliessen(this.vorgang); } - - get isVorgangInBearbeitung(): boolean { - return this.vorgang.status === 'IN_BEARBEITUNG'; - } } 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 f7d6ea59813fa20881d5cb9d019aac71f81e6fef..dc987af324371fbc73cab82d955fa0cb935e9443 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 @@ -14,7 +14,6 @@ import { HttpError, StateResource, convertToBoolean, - createEmptyStateResource, formatForDatabase, isNotEmpty, isNotNil, @@ -37,7 +36,6 @@ import { Subscription, combineLatest, map, - of, startWith, } from 'rxjs'; @@ -68,8 +66,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest ].join('\n\n'); private readonly bescheidChanges$: BehaviorSubject<Bescheid>; - private attachmentUpload$: BehaviorSubject<StateResource<BinaryFileResource>>; - private bescheidFileUpload$: Observable<StateResource<BinaryFileResource>>; private readonly fileDelete$: Subject<BinaryFileResource>; private readonly showMissingBescheidDocumentError$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false); @@ -80,7 +76,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest vorgangWithEingangResource: VorgangWithEingangResource; private formControlSubscriptions: Subscription; - private formChangesSubscription: Subscription; constructor( @@ -96,10 +91,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest init(): void { this.formControlSubscriptions = this.subscribeToSendBy(); - this.bescheidFileUpload$ = of(createEmptyStateResource<BinaryFileResource>()); - this.attachmentUpload$ = new BehaviorSubject<StateResource<BinaryFileResource>>( - createEmptyStateResource(), - ); this.initializeFormChanges(); } @@ -219,22 +210,6 @@ export class BescheidenFormService extends AbstractFormService implements OnDest return this.vorgangWithEingangResource; } - public getAttachmentUpload(): Observable<StateResource<BinaryFileResource>> { - return this.attachmentUpload$.asObservable(); - } - - public uploadAttachment(attachment: StateResource<BinaryFileResource>): void { - this.attachmentUpload$.next(attachment); - } - - public getBescheidFileUpload(): Observable<StateResource<BinaryFileResource>> { - return this.bescheidFileUpload$; - } - - public setBescheidFileUpload(bescheidFileUpload$: Observable<StateResource<BinaryFileResource>>) { - this.bescheidFileUpload$ = bescheidFileUpload$; - } - public deleteFile(binaryFileResource: BinaryFileResource): void { this.fileDelete$.next(binaryFileResource); } 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.html 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.html index 780524bd40f6a2dbba30fdeb83df3c133076bd47..fc9bcf1ed04f5df8d10a3a92d1c6d611d827574f 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.html +++ 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.html @@ -7,12 +7,6 @@ > </alfa-binary-file2-container> <ng-container *ngFor="let attachment of uploadedAttachments"> - <ods-attachment - *ngIf="attachment.error || attachment.loading" - [caption]="getAttachmentCaption(attachment)" - [error]="attachment.error" - [isLoading]="attachment.loading" - ></ods-attachment> <alfa-binary-file2-container *ngIf="!attachment.loading && attachment.resource" [file]="attachment.resource" @@ -22,4 +16,15 @@ > </alfa-binary-file2-container> </ng-container> + <ng-container *ngIf="uploadInProgress$ | async as uploadFileInProgress"> + <ods-attachment + data-test-id="attachment-upload-in-progress" + *ngIf="uploadFileInProgress.loading || uploadFileInProgress.error" + [loadingCaption]="uploadFileInProgress.fileName" + errorCaption="Fehler beim Hochladen" + [error]="uploadFileInProgress.error" + description="Anhang wird hochgeladen" + [isLoading]="uploadFileInProgress.loading" + ></ods-attachment> + </ng-container> </ods-attachment-container> 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 b60bd2b3fdc6b623666f52ae0b6ef799e75300f3..1e9ed7dcaa08a8f3a261a01eaf31c317eb00d7ac 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 @@ -4,7 +4,6 @@ import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { convertForDataTest, ConvertForDataTestPipe, - createEmptyStateResource, createErrorStateResource, createStateResource, FileSizePipe, @@ -21,6 +20,7 @@ import { } from '@ods/system'; import { MockComponent, MockPipe } from 'ng-mocks'; import { BehaviorSubject, EMPTY, Observable, of, Subscription } from 'rxjs'; +import { createUploadFileInProgress } from '../../../../../../../bescheid-shared/src/test/bescheid'; import { createBinaryFileResource, createLoadedBinaryFileResource, @@ -41,13 +41,12 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { beforeEach(async () => { bescheidService = mock(BescheidService); bescheidService.getAttachments.mockReturnValue(EMPTY); + bescheidService.getUploadedAttachment.mockReturnValue(EMPTY); formService = mock(BescheidenFormService); formService.getBescheidChanges.mockReturnValue( new BehaviorSubject({ beschiedenAm: new Date(), bewilligt: false }), ); - formService.getAttachmentUpload.mockReturnValue(of(createEmptyStateResource())); - formService.getBescheidFileUpload.mockReturnValue(of(createEmptyStateResource())); await TestBed.configureTestingModule({ declarations: [ @@ -88,6 +87,7 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { const dataTestId = getDataTestIdOf( `${convertForDataTest(attachment.resource.name)}-file2-container`, ); + const uploadInProgressDataTestId: string = getDataTestIdOf('attachment-upload-in-progress'); beforeEach(() => { component.uploadedAttachments = [attachment]; @@ -115,6 +115,38 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { notExistsAsHtmlElement(fixture, dataTestId); }); + + it('should render attachment in progress component when loading', () => { + component.uploadInProgress$ = of({ ...createUploadFileInProgress(), loading: true }); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, uploadInProgressDataTestId); + }); + + it('should render attachment in progress component on error', () => { + component.uploadInProgress$ = of({ + ...createUploadFileInProgress(), + loading: false, + error: createApiError(), + }); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, uploadInProgressDataTestId); + }); + + it('should not render attachment in progress component when not loading and no error', () => { + component.uploadInProgress$ = of({ + ...createUploadFileInProgress(), + loading: false, + error: null, + }); + + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, uploadInProgressDataTestId); + }); }); describe('ngOnInit', () => { @@ -137,6 +169,12 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { expect(subscribeToAttachmentUpload).toHaveBeenCalled(); }); + + it('should get upload attachment in progress', () => { + component.ngOnInit(); + + expect(bescheidService.getUploadAttachmentInProgress).toHaveBeenCalled(); + }); }); describe('ngOnDestroy', () => { @@ -144,7 +182,7 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { const subscription = mock(Subscription); const observable = mock(Observable); observable.subscribe.mockReturnValue(subscription); - formService.getAttachmentUpload.mockReturnValue(observable); + bescheidService.getUploadedAttachment.mockReturnValue(observable); component.ngOnInit(); component.ngOnDestroy(); @@ -187,13 +225,7 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { beforeEach(() => { attachment = createLoadedBinaryFileResource(); - formService.getAttachmentUpload.mockReturnValue(of(attachment)); - }); - - it('should get attachment upload', () => { - component.subscribeToAttachmentUpload(); - - expect(formService.getAttachmentUpload).toHaveBeenCalled(); + bescheidService.getUploadedAttachment.mockReturnValue(of(attachment)); }); it('should should set uploaded attachments', () => { 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 f8497323adfe75ac2e4bc428775bc7e1c6bc5a0c..084a5361b9ec8460e5cc0f518aeacb535cb47cf9 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 @@ -1,16 +1,16 @@ -import { BescheidService } from '@alfa-client/bescheid-shared'; +import { BescheidService, UploadFileInProgress } from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { StateResource, containsLoading, getSuccessfullyLoaded, - hasError, + hasStateResourceError, isLoaded, isNotNil, } from '@alfa-client/tech-shared'; import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { getUrl } from '@ngxp/rest'; -import { Subscription, first } from 'rxjs'; +import { Observable, Subscription, first } from 'rxjs'; import { BescheidenFormService } from '../../bescheiden.formservice'; @Component({ @@ -23,6 +23,7 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest existingAttachments: BinaryFileResource[] = []; uploadedAttachments: StateResource<BinaryFileResource>[] = []; + uploadInProgress$: Observable<UploadFileInProgress>; private attachmentUploadSubscription: Subscription; @@ -32,6 +33,7 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest ) {} ngOnInit(): void { + this.uploadInProgress$ = this.bescheidService.getUploadAttachmentInProgress(); this.loadExistingAttachments(); this.subscribeToAttachmentUpload(); } @@ -52,8 +54,8 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest } subscribeToAttachmentUpload() { - this.attachmentUploadSubscription = this.formService - .getAttachmentUpload() + this.attachmentUploadSubscription = this.bescheidService + .getUploadedAttachment() .subscribe( (stateResource: StateResource<BinaryFileResource>) => (this.uploadedAttachments = this.buildUploadedAttachments(stateResource)), @@ -63,7 +65,7 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest buildUploadedAttachments( uploadStateResource: StateResource<BinaryFileResource>, ): StateResource<BinaryFileResource>[] { - if (isLoaded(uploadStateResource) || hasError(uploadStateResource)) { + if (isLoaded(uploadStateResource) || hasStateResourceError(uploadStateResource)) { return [...getSuccessfullyLoaded(this.uploadedAttachments), uploadStateResource]; } else if (uploadStateResource.loading && !containsLoading(this.uploadedAttachments)) { return [...getSuccessfullyLoaded(this.uploadedAttachments), uploadStateResource]; @@ -80,16 +82,4 @@ export class VorgangDetailBescheidenResultAttachmentsComponent implements OnDest (attachment) => getUrl(attachment) !== getUrl(file), ); } - - getAttachmentCaption(attachment: StateResource<BinaryFileResource>) { - if (attachment.loading) { - return 'Anhang wird hochgeladen'; - } - - if (attachment.error) { - return 'Fehler beim Hochladen'; - } - - return attachment.resource.name; - } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html index 3148cf1d0d907496b5b4f9164e7c1621a1aa3953..a89c65186da52532a6f73829e58afaaaf65703cd 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html @@ -17,8 +17,11 @@ </ng-container> <ods-attachment *ngIf="uploadBescheidDocumentInProgress.loading || uploadBescheidDocumentInProgress.error" - [caption]="attachmentCaption" - [attr.data-test-id]="attachmentDataTestId" + errorCaption="Fehler beim Hochladen" + [loadingCaption]="uploadBescheidDocumentInProgress.fileName" + [attr.data-test-id]=" + 'upload-bescheid-document-error-' + !!uploadBescheidDocumentInProgress.error + " [isLoading]="uploadBescheidDocumentInProgress.loading" [error]="uploadBescheidDocumentInProgress.error" ></ods-attachment> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.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-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts index 5bd0f8b68ece0d217355d957b040611c03259381..2f71e2de6a3ef57174f129655ba0dd7f1c8ddab5 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.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-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts @@ -17,7 +17,7 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => { let fixture: ComponentFixture<VorgangDetailBescheidenResultDokumentComponent>; const createBescheidDocumentError: string = getDataTestIdOf('create-bescheid-document-error'); - const uploadBescheidDocumentError: string = getDataTestIdOf('upload-bescheid-document-error'); + const uploadBescheidDocumentError: string = getDataTestIdOf('upload-bescheid-document-error-true'); const missingBescheidDocumentErrorMessage: string = getDataTestIdOf( 'missing-bescheid-document-error-message', ); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts index f6fc855c98546cb0a9d29ac6dbc03f0ddfc62d41..f46d2cbd1d7aa2719a19b7f73ae55e1efb23945e 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts @@ -25,30 +25,6 @@ export class VorgangDetailBescheidenResultDokumentComponent { @Output() deleteFile: EventEmitter<void> = new EventEmitter<void>(); - get attachmentCaption() { - if (this.uploadBescheidDocumentInProgress.loading) { - return 'Bescheiddokument wird hochgeladen'; - } - - if (this.uploadBescheidDocumentInProgress.error) { - return 'Fehler beim Hochladen'; - } - - return this.bescheidDocumentFile.resource.name; - } - - get attachmentDataTestId() { - if (this.uploadBescheidDocumentInProgress.loading) { - return 'upload-bescheid-document-loading'; - } - - if (this.uploadBescheidDocumentInProgress.error) { - return 'upload-bescheid-document-error'; - } - - return 'upload-bescheid-document-file'; - } - constructor(private bescheidService: BescheidService) {} handleBescheidDocument(bescheid: BescheidResource): void { 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 index 7a892cb44c19c0b3826281b874991630930ff336..893c337ba18e0c86c6454628e475431305b092ba 100644 --- 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 @@ -128,5 +128,14 @@ describe('VorgangDetailBescheidenResultNachrichtComponent', () => { expect(formService.patchNachricht).not.toHaveBeenCalled(); }); + + it.each([null, undefined])( + 'should not patch form if document resource is %s', + (resource: DocumentResource) => { + component.bescheidDocumentStateResource = createStateResource(resource); + + 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 index fffb51e8555034313271c3d39bff2830defe8119..9dd0fca6fb796f1d47f773d147fdd54954ae1756 100644 --- 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 @@ -1,5 +1,5 @@ import { BescheidService, DocumentResource } from '@alfa-client/bescheid-shared'; -import { StateResource } from '@alfa-client/tech-shared'; +import { StateResource, isNotNil } from '@alfa-client/tech-shared'; import { Component, Input, OnInit } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { Observable } from 'rxjs'; @@ -11,7 +11,7 @@ import { BescheidenFormService } from '../../bescheiden.formservice'; }) export class VorgangDetailBescheidenResultNachrichtComponent implements OnInit { @Input() set bescheidDocumentStateResource(stateResource: StateResource<DocumentResource>) { - if (!stateResource.loading && !stateResource.error) { + if (!stateResource.loading && !stateResource.error && isNotNil(stateResource.resource)) { this.formService.patchNachricht(stateResource.resource); } } 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.html index 58333a2dc251f41b4b20766e3c7882ce5c088416..57979ad9c46243854ab904c46570eac6f92b8a1c 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.html @@ -5,7 +5,7 @@ [uploadInProgress]="uploadInProgress$ | async" (newFile)="uploadFile($event)" [fileLinkList]="getFileLinkList()" - label="Attachment hochladen" + label="Anhang hochladen" > </ods-file-upload-editor> </div> 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.spec.ts index c6d4b9f293b55af444bb3a6b3da555bc5e382200..74c2aea0911f06523b5b632206a370f06cba0f15 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.spec.ts @@ -1,16 +1,17 @@ -import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; import { BinaryFileAttachmentContainerComponent } from '@alfa-client/binary-file'; -import { BinaryFileResource, BinaryFileService } from '@alfa-client/binary-file-shared'; -import { createEmptyStateResource, createStateResource } from '@alfa-client/tech-shared'; +import { BinaryFileResource } from '@alfa-client/binary-file-shared'; +import { StateResource, createStateResource } from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; import { FileUploadEditorComponent } from '@ods/component'; -import { cold } from 'jest-marbles'; import { MockComponent } from 'ng-mocks'; import { EMPTY, Observable, Subscription, of } from 'rxjs'; -import { createBescheidResource } from '../../../../../../../../../bescheid-shared/src/test/bescheid'; +import { createBescheidStateResource } from '../../../../../../../../../bescheid-shared/src/test/bescheid'; import { createBinaryFileResource } from '../../../../../../../../../binary-file-shared/test/binary-file'; +import { createFile } from '../../../../../../../../../tech-shared/test/file'; +import { singleColdCompleted } from '../../../../../../../../../tech-shared/test/marbles'; import { BescheidenFormService } from '../../../../bescheiden.formservice'; import { VorgangDetailBescheidenAttachmentHochladenComponent } from './vorgang-detail-bescheiden-attachment-hochladen.component'; @@ -20,15 +21,12 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => { const selfLink: string = 'self'; let bescheidService: Mock<BescheidService>; - let binaryFileService: Mock<BinaryFileService>; let formService: BescheidenFormService; beforeEach(async () => { bescheidService = mock(BescheidService); bescheidService.getAttachments.mockReturnValue(EMPTY); - binaryFileService = mock(BinaryFileService); - formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService)); await TestBed.configureTestingModule({ @@ -47,10 +45,6 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => { provide: BescheidService, useValue: bescheidService, }, - { - provide: BinaryFileService, - useValue: binaryFileService, - }, ], }).compileComponents(); @@ -167,90 +161,42 @@ describe('VorgangDetailBescheidenDokumentHochladenComponent', () => { }); describe('uploadFile', () => { - const file: File = <any>{ name: 'TestDatei' }; - let uploadAndGetFile: jest.Mock; + const bescheidDraftStateResource: StateResource<BescheidResource> = + createBescheidStateResource(); + const file: File = createFile(); + const binaryFileStateResource: StateResource<BinaryFileResource> = createStateResource( + createBinaryFileResource(), + ); beforeEach(() => { - uploadAndGetFile = component.uploadAndGetFile = jest.fn(); + bescheidService.uploadAttachment.mockReturnValue(of(binaryFileStateResource)); + component.bescheidDraftStateResource = bescheidDraftStateResource; }); - it('should uploadAndGetFile', () => { - uploadAndGetFile.mockReturnValue(of(createEmptyStateResource())); - + it('should upload attachment', () => { component.uploadFile(file); - expect(component.uploadAndGetFile).toHaveBeenCalledWith(file); - }); - - it('should start with loading empty state resource', () => { - const loadingStateResource = createEmptyStateResource(true); - const uploadStateResource = createStateResource(createBinaryFileResource()); - uploadAndGetFile.mockReturnValue(cold('-a', { a: uploadStateResource })); - - component.uploadFile(file); + component.uploadInProgress$.subscribe(); - expect(component.uploadInProgress$).toBeObservable( - cold('ab', { a: loadingStateResource, b: uploadStateResource }), + expect(bescheidService.uploadAttachment).toHaveBeenCalledWith( + bescheidDraftStateResource.resource, + file, ); }); - it('should call form service', () => { - formService.uploadAttachment = jest.fn(); - uploadAndGetFile.mockReturnValue(of(createEmptyStateResource())); - + it('should add to file list', () => { component.uploadFile(file); - component.uploadInProgress$.subscribe(); - expect(formService.uploadAttachment).toHaveBeenCalledWith(createEmptyStateResource()); - }); - }); - - describe('uploadAndGetFile', () => { - const file: File = <any>{ name: 'TestDatei' }; - let bescheidResource: BescheidResource; - let uploadResource: BinaryFileResource; - - beforeEach(() => { - bescheidResource = createBescheidResource(); - uploadResource = createBinaryFileResource(); - bescheidService.getBescheidDraft.mockReturnValue(of(createStateResource(bescheidResource))); - binaryFileService.uploadFile.mockReturnValue(of(createStateResource(uploadResource))); - }); - - it('should get bescheid draft', () => { - component.uploadAndGetFile(file); - - expect(bescheidService.getBescheidDraft).toHaveBeenCalled(); - }); - - it('should upload file', (done) => { - const binaryFileStateResource$ = component.uploadAndGetFile(file); - - binaryFileStateResource$.subscribe(() => { - expect(binaryFileService.uploadFile).toHaveBeenCalledWith( - bescheidResource, - BescheidLinkRel.UPLOAD_ATTACHMENT, - file, - false, - ); - done(); - }); - }); - - it('should add file to file list', (done) => { - const binaryFileStateResource$ = component.uploadAndGetFile(file); + component.uploadInProgress$.subscribe(); - binaryFileStateResource$.subscribe(() => { - expect(component.fileList[0]).toEqual(uploadResource); - done(); - }); + expect(component.fileList).toEqual([binaryFileStateResource.resource]); }); - it('should emit binary file state resource', () => { - const binaryFileStateResource$ = component.uploadAndGetFile(file); + it('should emit', () => { + component.uploadFile(file); - expect(binaryFileStateResource$).toBeObservable( - cold('(a|)', { a: createStateResource(uploadResource) }), + expect(component.uploadInProgress$).toBeObservable( + singleColdCompleted(binaryFileStateResource), ); }); }); 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.ts index 6632bbe6b17fd5739b97eb99b67f261f1a7bb672..e707f6c2dbcccc73815f858e8adf68726ba57d6a 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-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-attachment-hochladen/vorgang-detail-bescheiden-attachment-hochladen.component.ts @@ -1,16 +1,14 @@ -import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; -import { BinaryFileResource, BinaryFileService } from '@alfa-client/binary-file-shared'; +import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { StateResource, createEmptyStateResource, doOnValidStateResource, - isLoaded, isNotNil, } from '@alfa-client/tech-shared'; -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { getUrl } from '@ngxp/rest'; -import { Observable, Subscription, filter, first, of, startWith, switchMap } from 'rxjs'; -import { tap } from 'rxjs/operators'; +import { Observable, Subscription, first, of, tap } from 'rxjs'; import { BescheidenFormService } from '../../../../bescheiden.formservice'; @Component({ @@ -19,6 +17,8 @@ import { BescheidenFormService } from '../../../../bescheiden.formservice'; styles: [], }) export class VorgangDetailBescheidenAttachmentHochladenComponent implements OnInit, OnDestroy { + @Input() bescheidDraftStateResource: StateResource<BescheidResource>; + uploadInProgress$: Observable<StateResource<BinaryFileResource>>; fileList: BinaryFileResource[] = []; private deleteFileSubscription: Subscription; @@ -28,7 +28,6 @@ export class VorgangDetailBescheidenAttachmentHochladenComponent implements OnIn constructor( public readonly formService: BescheidenFormService, private readonly bescheidService: BescheidService, - private readonly binaryFileService: BinaryFileService, ) { this.uploadInProgress$ = of(createEmptyStateResource<BinaryFileResource>()); } @@ -63,34 +62,16 @@ export class VorgangDetailBescheidenAttachmentHochladenComponent implements OnIn return this.fileList.map((fileResource: BinaryFileResource) => getUrl(fileResource)); } - public uploadFile(file: File) { - this.uploadInProgress$ = this.uploadAndGetFile(file).pipe( - tap((stateResource) => this.formService.uploadAttachment(stateResource)), - startWith(createEmptyStateResource<BinaryFileResource>(true)), - ); - } - - uploadAndGetFile(file: File): Observable<StateResource<BinaryFileResource>> { - return this.bescheidService.getBescheidDraft().pipe( - filter(isLoaded), - first(), - switchMap((bescheidStateResource: StateResource<BescheidResource>) => - this.binaryFileService - .uploadFile( - bescheidStateResource.resource, - BescheidLinkRel.UPLOAD_ATTACHMENT, - file, - false, - ) - .pipe( - tap((stateResource: StateResource<BinaryFileResource>) => - doOnValidStateResource( - stateResource, - () => (this.fileList = [...this.fileList, stateResource.resource]), - ), - ), + public uploadFile(file: File): void { + this.uploadInProgress$ = this.bescheidService + .uploadAttachment(this.bescheidDraftStateResource.resource, file) + .pipe( + tap((stateResource: StateResource<BinaryFileResource>) => + doOnValidStateResource( + stateResource, + () => (this.fileList = [...this.fileList, stateResource.resource]), ), - ), - ); + ), + ); } } 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-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.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-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html index 88e80fc07928ff69271f36e4832343d389cce584..e78ff6386bf1b7b908109c15e9d14b2e4c73fbea 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-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.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-dokument-hochladen/vorgang-detail-bescheiden-dokument-hochladen.component.html @@ -9,6 +9,6 @@ > <ods-bescheid-upload-icon icon></ods-bescheid-upload-icon> <ods-spinner-icon spinner size="extra-large"></ods-spinner-icon> - <div text class="text-center">Bescheid Dokument hochladen</div> + <div text class="text-center">Bescheiddokument hochladen</div> </ods-single-file-upload-editor> </div> 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-dokumente-hinzufuegen.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-dokumente-hinzufuegen.component.html index 2c98dc3938883b3658342b7bf8194264c0e3bbbc..2cfc7ff99368dc650ab7807c53c4bc0414d00ea4 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-dokumente-hinzufuegen.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-dokumente-hinzufuegen.component.html @@ -5,5 +5,7 @@ <alfa-vorgang-detail-bescheiden-dokument-hochladen [bescheidDraftStateResource]="bescheidDraftStateResource$ | async" ></alfa-vorgang-detail-bescheiden-dokument-hochladen> - <alfa-vorgang-detail-bescheiden-attachment-hochladen></alfa-vorgang-detail-bescheiden-attachment-hochladen> + <alfa-vorgang-detail-bescheiden-attachment-hochladen + [bescheidDraftStateResource]="bescheidDraftStateResource$ | async" + ></alfa-vorgang-detail-bescheiden-attachment-hochladen> </div> 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-steps-content.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.ts index 8bb8b9b2cd8c20339979c950da3561851474eb93..a05c072bc6c488d8b4948180c7f7ebefb58de08a 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-steps-content.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-steps-content.component.ts @@ -1,4 +1,4 @@ -import { HttpError, StateResource, hasError, isLoaded } from '@alfa-client/tech-shared'; +import { HttpError, StateResource, hasStateResourceError, isLoaded } from '@alfa-client/tech-shared'; import { VorgangService, VorgangWithEingangLinkRel, @@ -61,6 +61,6 @@ export class VorgangDetailBescheidenStepsContentComponent implements OnInit { } noError(stateResource: StateResource<Resource | HttpError>): boolean { - return isLoaded(stateResource) && !hasError(stateResource); + return isLoaded(stateResource) && !hasStateResourceError(stateResource); } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html index 8df4670c7d47d8cfc6b998a7d0a0d0b66a4ff803..55a9f67956faa09ff08e2e0849134c690a73059c 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component.html @@ -1,10 +1,10 @@ <ods-button *ngIf="showButton$ | async" - (click)="clickEmitter.emit($event)" + (clickEmitter)="clickEmitter.emit()" variant="primary" size="medium" class="mt-8 flex" - data-test-id="bescheid-weiter-button" + dataTestId="bescheid-weiter-button" text="Weiter" > </ods-button> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts index 46dd5111642b4781159e42e073f20a13214807e2..c82b596f3669350ebd42f569cae44749fa9c92f8 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.spec.ts @@ -1,4 +1,5 @@ import { BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { PostfachService } from '@alfa-client/postfach-shared'; import { Mock, dispatchEventFromFixture, mock, useFromMock } from '@alfa-client/test-utils'; import { VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog'; @@ -23,6 +24,7 @@ describe('VorgangDetailBescheidenComponent', () => { let vorgangService: Mock<VorgangService>; let formService: BescheidenFormService; let dialogRef: Mock<DialogRef>; + let postfachService: Mock<PostfachService>; let vorgangWithEingangResource: VorgangWithEingangResource; let bescheidDraftResource: BescheidResource; @@ -34,6 +36,7 @@ describe('VorgangDetailBescheidenComponent', () => { vorgangService = mock(VorgangService); formService = new BescheidenFormService(new UntypedFormBuilder(), useFromMock(bescheidService)); dialogRef = mock(DialogRef); + postfachService = mock(PostfachService); vorgangWithEingangResource = createVorgangWithEingangResource(); bescheidDraftResource = createBescheidResource(); @@ -73,6 +76,10 @@ describe('VorgangDetailBescheidenComponent', () => { provide: DIALOG_DATA, useValue: { vorgangWithEingangResource, bescheidDraftResource }, }, + { + provide: PostfachService, + useValue: postfachService, + }, ], imports: [ReactiveFormsModule], }).compileComponents(); @@ -116,6 +123,12 @@ describe('VorgangDetailBescheidenComponent', () => { expect(vorgangService.reloadCurrentVorgang).toHaveBeenCalled(); }); + + it('should reload postfach mail list', () => { + component.onClose(); + + expect(postfachService.setPostfachMailOnReload).toHaveBeenCalled(); + }); }); describe('close dialog on bescheiden result', () => { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts index 9223a68d605e8575a1d48b764a6e839280c7152f..c3a880423edbb95b2b2153db66b3202ae9dd7bad 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component.ts @@ -1,4 +1,5 @@ import { BescheidResource } from '@alfa-client/bescheid-shared'; +import { PostfachService } from '@alfa-client/postfach-shared'; import { VorgangService } from '@alfa-client/vorgang-shared'; import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog'; import { Component, Inject, OnInit } from '@angular/core'; @@ -17,8 +18,9 @@ export class VorgangDetailBescheidenComponent implements OnInit { constructor( public dialogRef: DialogRef, - public formService: BescheidenFormService, - private vorgangService: VorgangService, + public readonly formService: BescheidenFormService, + private readonly vorgangService: VorgangService, + private readonly postfachService: PostfachService, @Inject(DIALOG_DATA) private readonly dialogData: BescheidenDialogData, ) { this.bescheidDraftResource = dialogData.bescheidDraftResource; @@ -32,5 +34,6 @@ export class VorgangDetailBescheidenComponent implements OnInit { public onClose(): void { this.dialogRef.close(); this.vorgangService.reloadCurrentVorgang(); + this.postfachService.setPostfachMailOnReload(); } } diff --git a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts index a96d7ca4e7cd27b2936a41b5b91e9fcbfc1f853d..c9633abfedc9521786c49655796b3304e4a3972e 100644 --- a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts +++ b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts @@ -37,7 +37,7 @@ import { createStateResource, decodeUrlFromEmbedding, doIfLoadingRequired, - hasError, + hasStateResourceError, isNotNull, isNotUndefined, replacePlaceholder, @@ -327,7 +327,7 @@ export class WiedervorlageService implements OnDestroy { this.submitInProgress$.next(createStateResource(commandStateResource.resource)); this.snackbarService.show(commandStateResource.resource, message); this.setWiedervorlageListReload(); - } else if (hasError(commandStateResource)) { + } else if (hasStateResourceError(commandStateResource)) { this.submitInProgress$.next(createStateResource(commandStateResource.resource)); } } diff --git a/alfa-server/src/main/resources/application-local.yml b/alfa-server/src/main/resources/application-local.yml index 961e14d6fa3f44e0a1382e4b26c924e1fe0fd2d2..a0ed2b50fa6eb31acfb21af7156aa2c0590a7cc9 100644 --- a/alfa-server/src/main/resources/application-local.yml +++ b/alfa-server/src/main/resources/application-local.yml @@ -12,6 +12,8 @@ grpc: user-manager: address: static://127.0.0.1:9000 negotiationType: PLAINTEXT + vorgang-manager: + negotiationType: PLAINTEXT ozgcloud: feature: diff --git a/alfa-server/src/main/resources/application.yml b/alfa-server/src/main/resources/application.yml index 37fafad40ea8fb37e5177621ffb398ff756ccb16..8e17178fea49083f2e1a5035d0b27d50c6670e50 100644 --- a/alfa-server/src/main/resources/application.yml +++ b/alfa-server/src/main/resources/application.yml @@ -57,7 +57,7 @@ grpc: client: vorgang-manager: address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT + negotiationType: TLS user-manager: address: static://127.0.0.1:9000 negotiationType: TLS diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index 4a3d38c9b4ff9fc0e3183840d1554b666112e25c..cad88f7ba2e55da7b791497853c8ff633af6aaac 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -72,6 +72,8 @@ spec: value: "/bindings" - name: grpc_client_vorgang-manager_address value: {{ include "app.grpc_client_vorgang_manager_address" . }} + - name: grpc_client_vorgang-manager_negotiationType + value: {{ (.Values.vorgangManager).grpcClientNegotiationType | default "TLS" }} - name: grpc_client_user-manager_address value: {{ include "app.grpc_client_user-manager_address" . }} - name: grpc_client_user-manager_negotiationType @@ -176,12 +178,6 @@ spec: mountPath: "/bindings/ca-certificates/type" subPath: type readOnly: true - {{- if not .Values.disableUserManagerGrpcTls }} - - name: user-manager-tls-certificate - mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem" - subPath: ca.crt - readOnly: true - {{- end }} - name: temp-dir mountPath: "/tmp" {{- if (.Values.sso).tlsCertName }} @@ -190,15 +186,13 @@ spec: subPath: tls.crt readOnly: true {{- end }} + - name: namespace-ca-cert + mountPath: "/bindings/namespace-certificate" + readOnly: true volumes: - name: bindings configMap: name: alfa-bindings-type - {{- if not .Values.disableUserManagerGrpcTls }} - - name: user-manager-tls-certificate - secret: - secretName: user-manager-tls-cert - {{- end }} - name: temp-dir emptyDir: {} {{- if (.Values.sso).tlsCertName }} @@ -206,6 +200,17 @@ spec: secret: secretName: {{ .Values.sso.tlsCertName }} {{- end }} + - name: namespace-ca-cert + projected: + sources: + - secret: + name: {{ include "app.namespace" . }}-ca-cert + optional: true + items: + - key: ca.crt + path: ca.crt + - configMap: + name: alfa-bindings-type dnsConfig: {} dnsPolicy: ClusterFirst imagePullSecrets: diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml index aca352c23e4dc350e919c0eb8d3bb45cd79ec40c..91c7626679c859414ff092714b8b21f69796c7df 100644 --- a/src/test/helm/deployment_bindings_test.yaml +++ b/src/test/helm/deployment_bindings_test.yaml @@ -38,9 +38,9 @@ set: baseUrl: test.company.local imagePullSecret: image-pull-secret tests: - - it: should have volumes - set: - usermanagerName: user-manager + - it: should have volume mounts + set: + usermanagerName: user-manager asserts: - contains: path: spec.template.spec.containers[0].volumeMounts @@ -49,13 +49,6 @@ tests: mountPath: "/bindings/ca-certificates/type" subPath: type readOnly: true - - contains: - path: spec.template.spec.containers[0].volumeMounts - content: - name: user-manager-tls-certificate - mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem" - subPath: ca.crt - readOnly: true - contains: path: spec.template.spec.containers[0].volumeMounts content: @@ -68,9 +61,15 @@ tests: mountPath: "/bindings/ca-certificates/ssl-tls-ca.pem" subPath: ca.crt readOnly: true - - it: should have volume mounts - set: - usermanagerName: user-manager + - contains: + path: spec.template.spec.containers[0].volumeMounts + content: + name: namespace-ca-cert + mountPath: "/bindings/namespace-certificate" + readOnly: true + - it: should have volumes + set: + usermanagerName: user-manager asserts: - contains: path: spec.template.spec.volumes @@ -78,12 +77,6 @@ tests: 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 - contains: path: spec.template.spec.volumes content: @@ -93,6 +86,20 @@ tests: path: spec.template.spec.volumes content: name: sso-tls-certificate + - contains: + path: spec.template.spec.volumes + content: + name: namespace-ca-cert + projected: + sources: + - secret: + items: + - key: ca.crt + path: ca.crt + name: sh-helm-test-ca-cert + optional: true + - configMap: + name: alfa-bindings-type - it: should have sso tls cert mount set: usermanagerName: user-manager diff --git a/src/test/helm/deployment_defaults_env_test.yaml b/src/test/helm/deployment_defaults_env_test.yaml index f2b46cc3dcd95eac18f2a1286f97a83034992141..99d108c95f63fc674e22cf2cc369af4db57c0ae5 100644 --- a/src/test/helm/deployment_defaults_env_test.yaml +++ b/src/test/helm/deployment_defaults_env_test.yaml @@ -132,3 +132,21 @@ tests: content: name: grpc_client_user-manager_negotiationType value: TLS + + - it: should set vorgang-manager negotiationType plaintext + set: + vorgangManager.grpcClientNegotiationType: PLAINTEXT + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: grpc_client_vorgang-manager_negotiationType + value: PLAINTEXT + + - it: should contain default vorgang-manager negotiationType tls + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: grpc_client_vorgang-manager_negotiationType + value: TLS