diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts index 5399b2b0e7a3b32a59e241125032d7c3e784419b..c5a5333dfb746e774089d38f7759a8f40e19e5c0 100644 --- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component.ts @@ -39,12 +39,15 @@ export class VorgangBescheidWizardE2EComponent { private readonly stepButton3: string = 'step-3-button'; private readonly closeButton: string = 'close-bescheid'; private readonly closeDialog: string = 'bescheid-close-dialog'; + private readonly bescheidResultBox: string = 'bescheiden-result'; private readonly bescheidVerwerfenButton: string = 'bescheiderstellung-abbrechen-entwurf-verwerfen'; private readonly bescheidSpeichernButton: string = 'bescheiderstellung-abbrechen-entwurf-speichern'; private readonly uploadBescheidFile: string = '-single-file-upload-button'; private readonly uploadAttachment: string = 'Attachment_hochladen-file-upload-button'; + private readonly saveBescheid: string = 'save-button'; + private readonly confirmAndSaveButton: string = 'confirm-and-save-button'; private readonly fileBescheidValid: string = 'Bescheid_validpdf-file-item'; private readonly fileAnhangValid: string = 'Anhang_validpdf-file-item'; @@ -141,11 +144,11 @@ export class VorgangBescheidWizardE2EComponent { } public getFileBescheidValid() { - return cy.getTestElement(this.fileBescheidValid); + return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileBescheidValid}]`); } public getFileAnhangValid() { - return cy.getTestElement(this.fileAnhangValid); + return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileAnhangValid}]`); } public getDeleteButtonOfElement(element: string) { @@ -171,4 +174,16 @@ export class VorgangBescheidWizardE2EComponent { public getAttachmentUploadSpinner() { return cy.get(this.attachmentUploadSpinner); } + + public getSaveButton() { + return cy.getTestElement(this.saveBescheid); + } + + public getResultBox() { + return cy.getTestElement(this.bescheidResultBox); + } + + public getConfirmAndSaveButton() { + return cy.getTestElement(this.confirmAndSaveButton); + } } diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts index 932fc5fd0e692547533094f918843432cf895304..3d11a1a9baa58f0c1bcba190014d42679ac4682c 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-dokumente-hochladen.cy.ts @@ -42,6 +42,7 @@ describe('Bescheid Wizard', () => { const documentError: string = 'Erlaubte Dateiendungen'; const sizeError: string = 'Anhänge größer'; + const missingBescheidError: string = 'Bitte fügen Sie'; before(() => { initVorgaenge([bescheidVorgang]); @@ -136,4 +137,11 @@ describe('Bescheid Wizard', () => { contains(bescheidWizard.getAttachmentDocument(), sizeError); }); }); + + describe('do not continue without attached Bescheid', () => { + it('should show error if no Bescheid is attached and step 3 is clicked', () => { + bescheidWizard.getWeiterButton().click(); + contains(bescheidWizard.getBescheidDocument(), missingBescheidError); + }); + }); }); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..f2ec81bd978db6546305b15d971815000b7fb811 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-nur-speichern.cy.ts @@ -0,0 +1,94 @@ +import { registerLocaleData } from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import localeDeExtra from '@angular/common/locales/extra/de'; +import { VorgangBescheidWizardE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-bescheid-wizard.e2e.component'; +import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; +import { + VorgangE2E, + VorgangStatusE2E, + vorgangStatusLabelE2E, +} from 'apps/alfa-e2e/src/model/vorgang'; +import { uploadFile } from 'apps/alfa-e2e/src/support/file-upload'; +import { getAdjustedDateGerman } from 'apps/alfa-e2e/src/support/tech.util'; +import 'cypress-real-events/support'; +import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; +import { VorgangPage } from '../../../page-objects/vorgang.po'; +import { dropCollections } from '../../../support/cypress-helper'; +import { contains, enterWith, exist, haveText, notExist } from '../../../support/cypress.util'; +import { + TEST_FILE_BESCHEID_ANHANG_VALID, + TEST_FILE_BESCHEID_VALID, +} from '../../../support/data.util'; +import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util'; +import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util'; + +registerLocaleData(localeDe, 'de', localeDeExtra); + +describe('Bescheid Wizard', () => { + const mainPage: MainPage = new MainPage(); + const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); + + const abgelehntText: string = 'Abgelehnt am'; + const manuellText: string = 'Bescheid muss manuell'; + + const vorgangPage: VorgangPage = new VorgangPage(); + const bescheidWizard: VorgangBescheidWizardE2EComponent = vorgangPage.getBescheidWizard(); + + const bescheidVorgang: VorgangE2E = { + ...buildVorgang(objectIds[0], 'Wizard Vorgang'), + status: VorgangStatusE2E.IN_BEARBEITUNG, + }; + + const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = + vorgangPage.getFormularButtons(); + + before(() => { + initVorgaenge([bescheidVorgang]); + initUsermanagerUsers(); + + loginAsSabine(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }); + + after(() => { + dropCollections(); + }); + + describe('Only save Bescheid', () => { + it('should update Bescheid info after click on Nur Speichern', () => { + vorgangList.getListItem(bescheidVorgang.name).getRoot().click(); + waitForSpinnerToDisappear(); + + vorgangFormularButtons.getBescheidenButton().click(); + bescheidWizard.getAbgelehntButton().click(); + enterWith(bescheidWizard.getDateInput(), getAdjustedDateGerman(-1)); + bescheidWizard.getWeiterButton().click(); + uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID); + notExist(bescheidWizard.getBescheidUploadSpinner()); + uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID); + notExist(bescheidWizard.getAttachmentUploadSpinner()); + bescheidWizard.getWeiterButton().click(); + bescheidWizard.getSaveButton().click(); + + contains(bescheidWizard.getStatusText(), abgelehntText + ' ' + getAdjustedDateGerman(-1)); + exist(bescheidWizard.getFileAnhangValid()); + exist(bescheidWizard.getFileBescheidValid()); + contains(bescheidWizard.getResultBox(), manuellText); + exist(bescheidWizard.getConfirmAndSaveButton()); + }); + + it('should update Vorgang status after saving', () => { + bescheidWizard.getConfirmAndSaveButton().click(); + notExist(bescheidWizard.getRoot()); + + waitForSpinnerToDisappear(); + haveText( + vorgangPage.getVorgangDetailHeader().getStatus(), + vorgangStatusLabelE2E[VorgangStatusE2E.BESCHIEDEN], + ); + }); + }); +}); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts index 2176cc6513a43aab869e060775e3f0218ebb57ca..66bbf7006ffa9fadf26b4daf4bbef2a296cd00b3 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-bescheid/vorgang-bescheid-wizard.cy.ts @@ -13,7 +13,7 @@ import 'cypress-real-events/support'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; -import { dropCollections } from '../../../support/cypress-helper'; +import { dropCollections, wait } from '../../../support/cypress-helper'; import { contains, enterWith, exist, haveText, notExist } from '../../../support/cypress.util'; import { TEST_FILE_BESCHEID_VALID } from '../../../support/data.util'; import { getAdjustedDateEnglish, getAdjustedDateGerman } from '../../../support/tech.util'; @@ -131,7 +131,7 @@ describe('Bescheid Wizard', () => { bescheidWizard.getUeberspringenAbschliessen().click(); notExist(bescheidWizard.getRoot()); - cy.wait(1000); + wait(1000); haveText( vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN], diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts index 21df29a9ff630ddbcfbce10277b1b078ac7c2bd2..9e3acf7d570c338c411dabff1d0ac698e56982ad 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts @@ -36,7 +36,6 @@ import { countDownloadFiles, deleteDownloadFolder, dropCollections, - wait, } from '../../../support/cypress-helper'; import { exist, notExist } from '../../../support/cypress.util'; import { loginAsSabine } from '../../../support/user-util'; @@ -89,16 +88,19 @@ describe('Vorgang exportieren', () => { it('should show "Herunterladen" button', () => { exist(menuItem.getButton()); + + vorgangMoreMenu.getButton().click({ force: true }); }); it('should have 1 file in download folder after download', () => { - deleteDownloadFolder(); - wait(1000); - menuItem.getButton().click(); - - waitForSpinnerToDisappear(); - countDownloadFiles().then((count) => { - expect(count).to.eq(1); + deleteDownloadFolder().then(() => { + vorgangMoreMenu.getButton().click(); + menuItem.getButton().click(); + waitForSpinnerToDisappear(); + + countDownloadFiles().then((count) => { + expect(count).to.eq(1); + }); }); }); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts index 8cd389a16c1377c4e7fa938b20773466f9f568da..08eb091172c0888911b99f3f0d82e77e5bb4c627 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts @@ -60,15 +60,11 @@ describe('Vorgang Verwerfen', () => { const vorgangVerwerfenRevoke: VorgangE2E = { ...buildVorgang(objectIds[0], 'DoRevokeVerwerfen') }; before(() => { - console.log('initVorgaenge'); initVorgaenge([vorgangVerwerfen, vorgangVerwerfenRevoke]); - console.log('loginAsSabine'); loginAsSabine(); - console.log('waitforspinner'); waitForSpinnerToDisappear(); - console.log('exists vorganglist.root'); exist(vorgangList.getRoot()); }); diff --git a/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts b/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts index 4525d7046bc7a7fd97852478e4aee4154dcef3f7..a2b56d8fccb2e5069dfcecdd72375aae9c9ba949 100644 --- a/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts +++ b/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts @@ -131,8 +131,8 @@ export function countDownloadFiles(): Cypress.Chainable<number> { return cy.task(CypressTasks.COUNT_FILES, DOWNLOAD_FOLDER); } -export function deleteDownloadFolder(): void { - cy.task(CypressTasks.DELETE_FOLDER, DOWNLOAD_FOLDER); +export function deleteDownloadFolder() { + return cy.task(CypressTasks.DELETE_FOLDER, DOWNLOAD_FOLDER); } export function scrollToWindowBottom(): void { diff --git a/alfa-client/apps/alfa-e2e/src/support/cypress-tasks.ts b/alfa-client/apps/alfa-e2e/src/support/cypress-tasks.ts index 553cb733d4b8ef0c47cb64e79b6116011df16888..1e965a342e415f6825afaa78d27a684a8a125bfa 100644 --- a/alfa-client/apps/alfa-e2e/src/support/cypress-tasks.ts +++ b/alfa-client/apps/alfa-e2e/src/support/cypress-tasks.ts @@ -1,6 +1,5 @@ -import { rmdir } from 'fs'; +import { readdir, remove } from 'fs-extra'; import { Db, Long, MongoClient, ObjectId } from 'mongodb'; -const fs = require('fs'); const Binary = require('mongodb').Binary; @@ -317,26 +316,20 @@ function dropCollections(databaseUrl, databaseName, collections) { }); } -function countFiles(folderName: string): Promise<number> { - return new Promise((resolve, reject) => { - fs.readdir(folderName, (err, files) => { - if (err) { - console.error(err); - return reject(err); - } - resolve(files.length); +function countFiles(folderName) { + return readdir(folderName) + .then((files) => files.length) + .catch((err) => { + throw new Error(`Counting files failed: ${err.message}`); }); - }); } function deleteFolder(folderName: string): void { - new Promise((resolve, reject) => { - rmdir(folderName, { maxRetries: 10, recursive: true }, (err) => { - if (err) { - console.error(err); - return reject(err); - } - resolve(null); + return remove(folderName) + .then(() => { + return null; + }) + .catch((err) => { + throw new Error(`Failed to delete folder: ${err.message}`); }); - }); } 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 be0c599a5b7e04df8b03cbe0c51568aed474e709..897a93130bf9e8d21b120f86de04796e564b7300 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="vorgang | hasLink: linkRel.ABSCHLIESSEN"> +<ng-container *ngIf="!isVorgangInBearbeitung && 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 2a96a3b53a7329a7ef6536c2e184cf5d1be096a9..ff72e924921e24b4de0a81d651dc2854ec06e266 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 @@ -33,7 +33,11 @@ import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent, } from '@alfa-client/ui'; -import { VorgangCommandService, VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared'; +import { + VorgangCommandService, + VorgangStatus, + VorgangWithEingangLinkRel, +} from '@alfa-client/vorgang-shared'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -74,6 +78,7 @@ describe('AbschliessenButtonComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(AbschliessenButtonComponent); component = fixture.componentInstance; + component.vorgang = createVorgangWithEingangResource(); fixture.detectChanges(); }); @@ -129,6 +134,18 @@ 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, @@ -156,6 +173,18 @@ 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([ VorgangWithEingangLinkRel.ABSCHLIESSEN, 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 15df48ad2b497eed92ec4dfd36278e18fd3e506f..c8475e5aae551b7cfedeeea0d9a15e36c58219e6 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,4 +55,8 @@ 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/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 dc83681b070c4e0ef4736781c98c313f3af6282e..158859aef477901045106b1b0e6d60fe2cdab6e2 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 @@ -81,7 +81,7 @@ <ods-button-with-spinner class="self-end" *ngIf="canSave$ | async" - data-test-id="save-and-send-button" + data-test-id="confirm-and-save-button" [stateResource]="saveAndSendInProgress$ | async" text="Antrag bescheiden und speichern" (clickEmitter)="saveAndSendManually(bescheidDraftStateResource.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-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.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-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.component.html index 5eb688798894ad5a946c45b846c4bc92e80555a1..7be924cf6783364fe960a699a18ad474646adb36 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-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.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-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.component.html @@ -21,7 +21,7 @@ [name]="formServiceClass.FIELD_SEND_BY" variant="bescheid_save" [fullWidthText]="true" - data-test-id="save-and-send-button" + data-test-id="save-button" ><ods-save-icon></ods-save-icon ></ods-radio-button-card> </ng-container> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html index 1e513746896629e14bbfaca4d97b8dc0d4e3834f..b985566e1869ee4b1de3b2588dd7188845a72768 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html @@ -24,19 +24,25 @@ --> <ng-container *ngIf="vorgangStateResource$ | async as vorgangStateResource"> - <ozgcloud-subnavigation class="mat-typography mat-app-background"> + <ozgcloud-subnavigation class="mat-typography mat-app-background" data-test-id="subnavigation"> <alfa-vorgang-detail-back-button-container></alfa-vorgang-detail-back-button-container> - <alfa-vorgang-detail-action-buttons - [vorgangWithEingang]="vorgangStateResource.resource" - ></alfa-vorgang-detail-action-buttons> - <alfa-vorgang-detail-more-menu - [vorgangWithEingang]="vorgangStateResource.resource" - ></alfa-vorgang-detail-more-menu> + <ng-container *ngIf="vorgangStateResource.resource"> + <alfa-vorgang-detail-action-buttons + [vorgangWithEingang]="vorgangStateResource.resource" + data-test-id="action-buttons" + ></alfa-vorgang-detail-action-buttons> + <alfa-vorgang-detail-more-menu + [vorgangWithEingang]="vorgangStateResource.resource" + data-test-id="more-menu" + ></alfa-vorgang-detail-more-menu> + </ng-container> </ozgcloud-subnavigation> <div class="l-scroll-area--full"> <alfa-vorgang-detail-area + *ngIf="vorgangStateResource" [vorgangStateResource]="vorgangStateResource" + data-test-id="detail-area" ></alfa-vorgang-detail-area> </div> </ng-container> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts index c22913961fe75585bd7180358e4f78ae886c4c85..7466616259f69afe3069e61596a3af74acb2b891 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts @@ -21,11 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatIcon } from '@angular/material/icon'; import { LoeschAnforderungService } from '@alfa-client/loesch-anforderung-shared'; import { StateResource, createStateResource } from '@alfa-client/tech-shared'; -import { getDebugElementFromFixtureByCss, mock } from '@alfa-client/test-utils'; +import { Mock, existsAsHtmlElement, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils'; import { SpinnerComponent, SpinnerTransparencyComponent } from '@alfa-client/ui'; import { VorgangCommandService, @@ -33,6 +31,9 @@ import { VorgangWithEingang, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatIcon } from '@angular/material/icon'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { ProgressBarComponent } from 'libs/ui/src/lib/ui/progress-bar/progress-bar.component'; import { SubnavigationComponent } from 'libs/ui/src/lib/ui/subnavigation/subnavigation.component'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; @@ -42,26 +43,37 @@ import { VorgangDetailActionButtonsComponent } from './vorgang-detail-area/vorga import { VorgangDetailAreaComponent } from './vorgang-detail-area/vorgang-detail-area.component'; import { VorgangDetailFormularButtonsComponent } from './vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component'; import { VorgangDetailBackButtonContainerComponent } from './vorgang-detail-back-button-container/vorgang-detail-back-button-container.component'; +import { VorgangDetailMoreMenuComponent } from './vorgang-detail-more-menu/vorgang-detail-more-menu.component'; import { VorgangDetailPageComponent } from './vorgang-detail-page.component'; +type withGetVorgang = { + getVorgangWithEingang: () => Subject<StateResource<VorgangWithEingang>>; +}; + describe('VorgangDetailPageComponent', () => { let component: VorgangDetailPageComponent; let fixture: ComponentFixture<VorgangDetailPageComponent>; - const getVorgangWithEingangSubj: Subject<StateResource<VorgangWithEingang>> = new Subject(); - const vorgangService = { - ...mock(VorgangService), - getVorgangWithEingang: () => getVorgangWithEingangSubj, - }; + let vorgangWithEingangSubj: Subject<StateResource<VorgangWithEingang>>; + let vorgangService: Mock<VorgangService> | withGetVorgang; const vorgangCommandService = mock(VorgangCommandService); const loeschAnforderungService = mock(LoeschAnforderungService); const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource(); - const subnavigation: string = 'ozgcloud-subnavigation'; + const subnavigation: string = getDataTestIdOf('subnavigation'); + const actionButtons: string = getDataTestIdOf('action-buttons'); + const moreMenu: string = getDataTestIdOf('more-menu'); + const detailArea: string = getDataTestIdOf('detail-area'); - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach(() => { + vorgangWithEingangSubj = new Subject(); + vorgangService = { + ...mock(VorgangService), + getVorgangWithEingang: () => vorgangWithEingangSubj, + }; + + TestBed.configureTestingModule({ declarations: [ VorgangDetailPageComponent, MatIcon, @@ -71,6 +83,7 @@ describe('VorgangDetailPageComponent', () => { MockComponent(VorgangDetailActionButtonsComponent), MockComponent(VorgangDetailFormularButtonsComponent), MockComponent(VorgangDetailBackButtonContainerComponent), + MockComponent(VorgangDetailMoreMenuComponent), MockComponent(SpinnerComponent), MockComponent(SpinnerTransparencyComponent), ], @@ -89,9 +102,7 @@ describe('VorgangDetailPageComponent', () => { }, ], }); - }); - beforeEach(() => { fixture = TestBed.createComponent(VorgangDetailPageComponent); component = fixture.componentInstance; fixture.detectChanges(); @@ -125,21 +136,65 @@ describe('VorgangDetailPageComponent', () => { describe('subnavigation', () => { it('should be hidden', () => { - getVorgangWithEingangSubj.next(null); + vorgangWithEingangSubj.next(null); + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, subnavigation); + }); + + it('should be visible', () => { + vorgangWithEingangSubj.next(createStateResource(vorgangWithEingang)); + fixture.detectChanges(); + + existsAsHtmlElement(fixture, subnavigation); + }); + }); + + describe('action buttons', () => { + it('should be hidden', () => { + vorgangWithEingangSubj.next(createStateResource(null)); fixture.detectChanges(); - const subnavigationElement = getDebugElementFromFixtureByCss(fixture, subnavigation); + notExistsAsHtmlElement(fixture, actionButtons); + }); + + it('should be visible', () => { + vorgangWithEingangSubj.next(createStateResource(vorgangWithEingang)); + fixture.detectChanges(); + + existsAsHtmlElement(fixture, actionButtons); + }); + }); + + describe('more menu', () => { + it('should be hidden', () => { + vorgangWithEingangSubj.next(createStateResource(null)); + fixture.detectChanges(); - expect(subnavigationElement).toBeNull(); + notExistsAsHtmlElement(fixture, moreMenu); }); it('should be visible', () => { - getVorgangWithEingangSubj.next(createStateResource(vorgangWithEingang)); + vorgangWithEingangSubj.next(createStateResource(vorgangWithEingang)); fixture.detectChanges(); - const subnavigationElement = getDebugElementFromFixtureByCss(fixture, subnavigation); + existsAsHtmlElement(fixture, moreMenu); + }); + }); + + describe('detail area', () => { + it('should be hidden', () => { + vorgangWithEingangSubj.next(null); + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, detailArea); + }); + + it('should be visible', () => { + vorgangWithEingangSubj.next(createStateResource(vorgangWithEingang)); + fixture.detectChanges(); - expect(subnavigationElement).toBeDefined(); + existsAsHtmlElement(fixture, detailArea); }); }); }); diff --git a/src/main/helm/templates/keycloak_client_crd.yaml b/src/main/helm/templates/keycloak_client_crd.yaml index 5b0a6f895418a3ba333a2d6d0e83ec102b1ccd6d..e64622d0f5b3de937af5db02e420d8559c33dead 100644 --- a/src/main/helm/templates/keycloak_client_crd.yaml +++ b/src/main/helm/templates/keycloak_client_crd.yaml @@ -1,20 +1,11 @@ {{- if not (.Values.sso).disableOzgOperator -}} {{ range $client := (.Values.sso).keycloak_clients }} --- -{{- if $client.kopOperator }} -apiVersion: api.kop-stack.de/v1 -kind: KopKeycloakClient -{{- else }} apiVersion: operator.ozgcloud.de/v1 kind: OzgCloudKeycloakClient -{{- end }} metadata: name: {{ include "app.generateKeycloakClientRessourceName" $client.client_name }} namespace: {{ include "app.namespace" $ }} -{{- if $client.kopOperator }} - annotations: - "helm.sh/resource-policy": keep -{{- end }} spec: keep_after_delete: {{ $.Values.sso.keep_after_delete | default false }} client_name: {{ $client.client_name }} diff --git a/src/main/helm/templates/keycloak_user_crd.yaml b/src/main/helm/templates/keycloak_user_crd.yaml index 2901efba99a56a551ce2fa0276e15e14440917b2..0f5470b0bc15c04d09993fcfb6082278b08fca2c 100644 --- a/src/main/helm/templates/keycloak_user_crd.yaml +++ b/src/main/helm/templates/keycloak_user_crd.yaml @@ -1,20 +1,11 @@ {{- if not (.Values.sso).disableOzgOperator -}} {{ range $user := concat ((.Values.sso).api_users | default list) ((.Values.sso).keycloak_users | default list) }} --- -{{- if $user.kopOperator }} -apiVersion: api.kop-stack.de/v1 -kind: KopKeycloakUser -{{- else }} apiVersion: operator.ozgcloud.de/v1 kind: OzgCloudKeycloakUser -{{- end }} metadata: name: {{ include "app.generateKeycloakUserRessourceName" (deepCopy $user.name) }} namespace: {{ include "app.namespace" $ }} -{{- if $user.kopOperator }} - annotations: - "helm.sh/resource-policy": keep -{{- end }} spec: keep_after_delete: {{ $.Values.sso.keep_after_delete | default false }} update_user: {{ $user.update_user | default false }} diff --git a/src/test/helm/keycloak_client_crd_test.yaml b/src/test/helm/keycloak_client_crd_test.yaml index 17f2249b721a1eab8b7d279233ef8a5ed41d5d3a..f84ce1e3dbcf74623c939941d8115d099a7f4cbb 100644 --- a/src/test/helm/keycloak_client_crd_test.yaml +++ b/src/test/helm/keycloak_client_crd_test.yaml @@ -58,29 +58,6 @@ tests: - equal: path: metadata.namespace value: by-helm-test - - it: should contain header data for kopOperator - set: - baseUrl: "test.by.ozg-cloud.de" - sso: - keycloak_clients: - - client_name: alfa - kopOperator: true - asserts: - - isAPIVersion: - of: api.kop-stack.de/v1 - - isKind: - of: KopKeycloakClient - - it: should have annotations for kopOperator - set: - baseUrl: "test.by.ozg-cloud.de" - sso: - keycloak_clients: - - client_name: alfa - kopOperator: true - asserts: - - equal: - path: metadata.annotations["helm.sh/resource-policy"] - value: keep - it: should have default Values set: baseUrl: test.by.ozg-cloud.de diff --git a/src/test/helm/keycloak_user_crd_test.yaml b/src/test/helm/keycloak_user_crd_test.yaml index 97d1116c82fd20e8cc871cb6e26eb8042718ce76..2b8857fca6d3374234f1cd962b576eaedb12b1f8 100644 --- a/src/test/helm/keycloak_user_crd_test.yaml +++ b/src/test/helm/keycloak_user_crd_test.yaml @@ -533,28 +533,6 @@ tests: - isNull: path: spec.keycloak_user.client_roles - - it: should use kopOperator - set: - ozgcloud: - bundesland: by - bezeichner: helm - environment: test - sso: - keycloak_users: - - name: kop - kopOperator: true - asserts: - - isAPIVersion: - of: api.kop-stack.de/v1 - - isKind: - of: KopKeycloakUser - - equal: - path: spec.keycloak_user.username - value: kop - - equal: - path: metadata.annotations["helm.sh/resource-policy"] - value: keep - - it: should not create user cr if ozg operator is disabled set: sso: