From 11d5507c59d5a96b554e08865ad4cb05849ea36b Mon Sep 17 00:00:00 2001 From: Martin <git@mail.de> Date: Tue, 4 Mar 2025 16:23:54 +0100 Subject: [PATCH] OZG-5977 OZG-7538 add multi upload for bescheid; adjust data-test-id --- .../attachment/attachment.e2e.component.ts | 6 ++- .../vorgang-bescheid-wizard.e2e.component.ts | 49 ++++--------------- ...vorgang-bescheid-dokumente-hochladen.cy.ts | 42 ++++++++++------ .../helper/attachment/attachment.helper.ts | 4 +- .../apps/alfa-e2e/src/support/data.util.ts | 3 ++ .../multi-file-upload-editor.component.html | 1 + .../file-upload-editor.component.html | 1 + .../single-file-upload-editor.component.html | 1 + .../file-upload-button.component.html | 2 +- .../file-upload-button.component.spec.ts | 11 +++-- .../file-upload-button.component.ts | 1 + 11 files changed, 56 insertions(+), 65 deletions(-) diff --git a/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts index 7966bd73c0..5e001becb9 100644 --- a/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts @@ -24,15 +24,17 @@ import { convertToDataTestId } from '../../support/tech.util'; export class AttachmentContainerE2EComponent { - private readonly locatorFileUploadInput: string = '-file-upload-input'; + private readonly multiUploadInput: string = 'multi-file-upload-button'; + // private readonly attachmentList: AttachmentListE2EComponent = new AttachmentListE2EComponent(); public getList(): AttachmentListE2EComponent { return this.attachmentList; } + //TODO Rename getMultiUploadButton public getUploadInput(): Cypress.Chainable<HTMLElement> { - return cy.getTestElementContaining(this.locatorFileUploadInput); + return cy.getTestElement(this.multiUploadInput); } } 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 057b39b29c..4b1e36d894 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 @@ -49,7 +49,6 @@ export class VorgangBescheidWizardE2EComponent { private readonly uploadBescheidFileButton: string = '-single-file-upload-button'; private readonly uploadAttachmentButton: string = 'Anhang_hochladen-file-upload-button'; private readonly uploadAutomaticBescheid: string = 'create-bescheid-document-button'; - private readonly mailTextArea: string = 'Text-textarea-editor'; private readonly saveBescheid: string = 'save-button'; private readonly sendBescheid: string = 'send-button'; private readonly confirmAndSaveButton: string = 'confirm-and-save-button'; @@ -63,10 +62,6 @@ export class VorgangBescheidWizardE2EComponent { private readonly bescheidDocument: string = 'bescheid-document'; private readonly attachmentDocument: string = 'bescheid-attachments'; - private readonly bescheidUploadSpinner: string = '[data-test-id="bescheid-document"] ods-spinner-icon'; - private readonly attachmentUploadSpinner: string = '[data-test-id="bescheid-attachments"] ods-spinner-icon'; - private readonly bescheidSaveSpinner: string = '[data-test-id="confirm-and-save-button"] ods-spinner-icon'; - private readonly sendenSpinner: string = '[data-test-id="send-button"] ods-spinner-icon'; private readonly missingBescheidDocumentMessage: string = 'missing-bescheid-document-error-message'; private locatorRoot: string = 'bescheid-wizard'; @@ -142,35 +137,35 @@ export class VorgangBescheidWizardE2EComponent { return cy.getTestElement(this.closeDialog); } - public getCloseVerwerfenButton(): Cypress.Chainable<JQuery<HTMLElement>> { + public getCloseVerwerfenButton(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.bescheidVerwerfenButton); } - public getCloseSpeichernButton(): Cypress.Chainable<JQuery<HTMLElement>> { + public getCloseSpeichernButton(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.bescheidSpeichernButton); } - public getUploadBescheidButton(): Cypress.Chainable<JQuery<HTMLElement>> { + public getUploadBescheidButton(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.uploadBescheidFileButton); } - public getUploadAttachmentButton(): Cypress.Chainable<JQuery<HTMLElement>> { + public getUploadAttachmentButton(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.uploadAttachmentButton); } - public getFileBescheidValidInWizard(): Cypress.Chainable<JQuery<HTMLElement>> { + public getFileBescheidValidInWizard(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileBescheidValid}]`); } - public getFileAnhangValidInWizard(): Cypress.Chainable<JQuery<HTMLElement>> { + public getFileAnhangValidInWizard(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileAnhangValid}]`); } - public getAutomaticBescheidFileInWizard() { + public getAutomaticBescheidFileInWizard(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.locatorRoot).find(`[data-test-id=${this.fileAutomaticBescheid}]`); } - public getDeleteButtonOfElement(element: string): Cypress.Chainable<JQuery<HTMLElement>> { + public getDeleteButtonOfElement(element: string): Cypress.Chainable<HTMLElement> { return cy.getTestElement(element).find('[title="Anhang löschen"]'); } @@ -178,30 +173,14 @@ export class VorgangBescheidWizardE2EComponent { return filename.replace(/\./g, '') + '-file-item'; } - public getBescheidDocument(): Cypress.Chainable<JQuery<HTMLElement>> { + public getBescheidDocument(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.bescheidDocument); } - public getAttachmentDocument(): Cypress.Chainable<JQuery<HTMLElement>> { + public getAttachmentDocument(): Cypress.Chainable<HTMLElement> { return cy.getTestElement(this.attachmentDocument); } - public getBescheidUploadSpinner(): Cypress.Chainable<JQuery<HTMLElement>> { - return cy.get(this.bescheidUploadSpinner); - } - - public getAttachmentUploadSpinner(): Cypress.Chainable<JQuery<HTMLElement>> { - return cy.get(this.attachmentUploadSpinner); - } - - public getBescheidSaveSpinner(): Cypress.Chainable<JQuery<HTMLElement>> { - return cy.get(this.bescheidSaveSpinner); - } - - public getSendenSpinner(): Cypress.Chainable<JQuery<HTMLElement>> { - return cy.get(this.sendenSpinner); - } - public getMailText(): Cypress.Chainable<JQuery<HTMLElement>> { return cy.getTestElement(this.nachrichtText); } @@ -274,14 +253,6 @@ export class VorgangBescheidWizardE2EComponent { uploadFile(this.getUploadAttachmentButton(), fileName); } - public bescheidUploadSpinnerIsClosed(): void { - this.getBescheidUploadSpinner().should('not.exist'); - } - - public attachmentSpinnerIsClosed(): void { - this.getAttachmentUploadSpinner().should('not.exist'); - } - public enterDate(difference: number): void { this.getDateInput().should('exist'); enterWith(this.getDateInput(), getAdjustedDateGerman(difference)); 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 2f0235885f..71531d122d 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 @@ -26,15 +26,25 @@ 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 { E2EAttachmentHelper } from 'apps/alfa-e2e/src/helper/attachment/attachment.helper'; +import { E2EAttachmentVerifier } from 'apps/alfa-e2e/src/helper/attachment/attachment.verifier'; import { VorgangE2E, VorgangStatusE2E } from 'apps/alfa-e2e/src/model/vorgang'; import { uploadFile } from 'apps/alfa-e2e/src/support/file-upload'; 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, getTestElement } from '../../../support/cypress-helper'; +import { dropCollections } from '../../../support/cypress-helper'; import { contains, exist, haveText, haveValue, notContains, notExist } from '../../../support/cypress.util'; -import { TEST_FILE_BESCHEID_ANHANG_BIG, TEST_FILE_BESCHEID_ANHANG_VALID, TEST_FILE_BESCHEID_VALID, TEST_FILE_JPEG, TEST_FILE_JPG, TEST_FILE_PNG, TEST_FILE_WITH_CONTENT, } from '../../../support/data.util'; +import { + TEST_FILE_BESCHEID_ANHANG_BIG, + TEST_FILE_BESCHEID_ANHANG_VALID, + TEST_FILE_BESCHEID_VALID, + TEST_FILE_JPEG, + TEST_FILE_JPG, + TEST_FILE_PNG, + TEST_FILE_WITH_CONTENT, +} from '../../../support/data.util'; import { initUsermanagerUsers, loginAsSabine } from '../../../support/user-util'; import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util'; @@ -54,6 +64,9 @@ describe('Bescheid Dokumente hochladen', () => { const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons(); + const attachmentHelper: E2EAttachmentHelper = new E2EAttachmentHelper(); + const attachmentVerifier: E2EAttachmentVerifier = new E2EAttachmentVerifier(); + const documentError: string = 'Erlaubte Dateiendungen'; const sizeError: string = 'Anhänge größer'; const missingBescheidError: string = 'Bitte fügen Sie ein Bescheiddokument hinzu.'; @@ -90,13 +103,15 @@ describe('Bescheid Dokumente hochladen', () => { it('should upload manual Bescheid file', () => { uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID); - notExist(bescheidWizard.getBescheidUploadSpinner()); + waitForSpinnerToDisappear(); + exist(bescheidWizard.getFileBescheidValidInWizard()); }); it('should upload attachment file', () => { - uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_VALID); - exist(bescheidWizard.getFileAnhangValidInWizard()); + attachmentHelper.uploadAttachment(TEST_FILE_BESCHEID_ANHANG_VALID); + + attachmentVerifier.verifyAttachmentInList(TEST_FILE_BESCHEID_ANHANG_VALID); }); it('should still show files after clicking Weiter and step 2', () => { @@ -127,15 +142,9 @@ describe('Bescheid Dokumente hochladen', () => { }); it('should be able to attach all valid types of files', () => { - uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_JPG); - notExist(bescheidWizard.getAttachmentUploadSpinner()); - uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_JPEG); - notExist(bescheidWizard.getAttachmentUploadSpinner()); - uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_PNG); - notExist(bescheidWizard.getAttachmentUploadSpinner()); - exist(getTestElement(bescheidWizard.getElementFromFileName(TEST_FILE_JPG))); - exist(getTestElement(bescheidWizard.getElementFromFileName(TEST_FILE_JPEG))); - exist(getTestElement(bescheidWizard.getElementFromFileName(TEST_FILE_PNG))); + attachmentHelper.uploadAttachments([TEST_FILE_JPG, TEST_FILE_JPEG, TEST_FILE_PNG]); + + attachmentVerifier.verifyAttachmentsInList([TEST_FILE_JPG, TEST_FILE_JPEG, TEST_FILE_PNG]); }); }); @@ -145,8 +154,9 @@ describe('Bescheid Dokumente hochladen', () => { contains(bescheidWizard.getBescheidDocument(), documentError); }); - it('should show error if file is too big', () => { + it('should show error if file is too big', { defaultCommandTimeout: 90000 }, () => { uploadFile(bescheidWizard.getUploadAttachmentButton(), TEST_FILE_BESCHEID_ANHANG_BIG); + contains(bescheidWizard.getAttachmentDocument(), sizeError); }); }); @@ -162,7 +172,7 @@ describe('Bescheid Dokumente hochladen', () => { describe('check contents of step 3', () => { it('should show Max Testermann as Antragsteller, the default message text', () => { uploadFile(bescheidWizard.getUploadBescheidButton(), TEST_FILE_BESCHEID_VALID); - notExist(bescheidWizard.getBescheidUploadSpinner()); + waitForSpinnerToDisappear(); bescheidWizard.getWeiterButton().click(); diff --git a/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.helper.ts b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.helper.ts index 74c7bdf3d5..dd9743081a 100644 --- a/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.helper.ts +++ b/alfa-client/apps/alfa-e2e/src/helper/attachment/attachment.helper.ts @@ -16,8 +16,8 @@ export class E2EAttachmentHelper { this.uploadAttachments([fileName]); } - public uploadAttachments(fileName: string[]): void { - this.executor.uploadAttachment(fileName); + public uploadAttachments(fileNames: string[]): void { + this.executor.uploadAttachment(fileNames); } public uploadEmptyAttachment(fileName: string = TEST_FILE_WITHOUT_CONTENT): void { diff --git a/alfa-client/apps/alfa-e2e/src/support/data.util.ts b/alfa-client/apps/alfa-e2e/src/support/data.util.ts index 47f84cd792..46c335ab57 100644 --- a/alfa-client/apps/alfa-e2e/src/support/data.util.ts +++ b/alfa-client/apps/alfa-e2e/src/support/data.util.ts @@ -36,10 +36,13 @@ export const ORGANISATIONSEINHEITEN_ID_FOR_ADELHEIT = '10363455'; export const ORGANISATIONSEINHEITEN_ID_FOR_SABINE = '9030229'; export const ORGANISATIONSEINHEITEN_ID_FOR_BEATE = '12345678'; +//TODO Rename = nicht fachlich bezogen bspw. TEST_FILE_WITH_CONTENT_5_MB anstelle von "invalid" oder "big" export const TEST_FILE_BESCHEID_VALID: string = 'Bescheid_valid.pdf'; export const TEST_FILE_BESCHEID_BIG: string = 'Bescheid_5mb.pdf'; export const TEST_FILE_BESCHEID_ANHANG_VALID: string = 'Anhang_valid.pdf'; export const TEST_FILE_BESCHEID_ANHANG_BIG: string = 'Anhang_5mb.pdf'; +// + export const TEST_FILE_JPG: string = 'small_jpg.jpg'; export const TEST_FILE_JPEG: string = 'small_jpeg.jpeg'; export const TEST_FILE_PNG: string = 'small_png.png'; diff --git a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html index 4024dc2de9..538932cf34 100644 --- a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html +++ b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.html @@ -6,6 +6,7 @@ [isLoading]="isUploadInProgress$ | async" [variant]="uploadButtonVariant" data-test-id="binary-file-upload" + dataTestId="multi-file-upload-button" > <ods-spinner-icon spinner size="medium" /> <ods-attachment-icon icon size="medium" /> diff --git a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html index ff08ce18e4..e3807c40af 100644 --- a/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html +++ b/alfa-client/libs/design-component/src/lib/form/file-upload-editor/file-upload-editor.component.html @@ -35,6 +35,7 @@ [attr.data-test-id]="(label | convertForDataTest) + '-file-upload-button'" [isLoading]="uploadInProgress.loading" class="relative w-full max-w-72" + dataTestId="file-upload-editor" > <ods-spinner-icon spinner size="medium" /> <ods-attachment-icon icon size="medium" /> diff --git a/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html b/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html index 837b069ad1..409101e9b6 100644 --- a/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html +++ b/alfa-client/libs/design-component/src/lib/form/single-file-upload-editor/single-file-upload-editor.component.html @@ -29,6 +29,7 @@ [isLoading]="uploadInProgress" [accept]="accept" [attr.data-test-id]="(label | convertForDataTest) + '-single-file-upload-button'" + dataTestId="single-file-upload-button" > <ng-content icon select="[icon]"></ng-content> <ng-content text select="[text]"></ng-content> diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html index b65b88d5b0..2e4573ac9c 100644 --- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html +++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.html @@ -32,7 +32,7 @@ (click)="resetInput()" [disabled]="isLoading" [multiple]="multi" - [attr.data-test-id]="(id | convertForDataTest) + '-file-upload-input'" + [attr.data-test-id]="dataTestId" /> <label [for]="id" [ngClass]="uploadButtonVariants({ variant })" role="button"> @if (isLoading) { diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts index 54b7d3b7dd..bc63bfe1e2 100644 --- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts +++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.spec.ts @@ -21,7 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; import { getElementFromFixture } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { faker } from '@faker-js/faker'; @@ -34,16 +33,18 @@ describe('FileUploadButtonComponent', () => { let fixture: ComponentFixture<FileUploadButtonComponent>; const labelText: string = faker.word.noun(); - const inputTestClass: string = getDataTestIdOf(labelText + '-file-upload-input'); + const dataTestId: string = 'dummyDataTestId'; + const input: string = getDataTestIdOf(dataTestId); beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [FileUploadButtonComponent, ConvertForDataTestPipe], + imports: [FileUploadButtonComponent], }).compileComponents(); fixture = TestBed.createComponent(FileUploadButtonComponent); component = fixture.componentInstance; component.id = labelText; + component.dataTestId = dataTestId; fixture.detectChanges(); }); @@ -54,7 +55,7 @@ describe('FileUploadButtonComponent', () => { describe('click at file input', () => { it('should call resetInput()', () => { component.resetInput = jest.fn(); - const fileInput = getElementFromFixture(fixture, inputTestClass); + const fileInput = getElementFromFixture(fixture, input); fileInput.click(); fixture.detectChanges(); @@ -68,7 +69,7 @@ describe('FileUploadButtonComponent', () => { component.multi = true; fixture.detectChanges(); - const inputElement: HTMLInputElement = getElementFromFixture(fixture, inputTestClass); + const inputElement: HTMLInputElement = getElementFromFixture(fixture, input); expect(inputElement.multiple).toEqual(component.multi); }); diff --git a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts index b5048be11b..9f06d3864e 100644 --- a/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts +++ b/alfa-client/libs/design-system/src/lib/form/file-upload-button/file-upload-button.component.ts @@ -59,6 +59,7 @@ export class FileUploadButtonComponent { @Input() accept: string = '*/*'; @Input() multi: boolean = false; @Input() variant: UploadButtonVariants['variant']; + @Input({ required: true }) dataTestId: string; @ViewChild('inputElement') inputElement: ElementRef = new ElementRef({}); -- GitLab