From ac608309006692fe758287ab1cea693215dcc85f Mon Sep 17 00:00:00 2001 From: Albert <Albert.Bruns@mgm-tp.com> Date: Mon, 24 Feb 2025 17:11:15 +0100 Subject: [PATCH 01/18] OZG-7507 orgnaisationseinheit loeschen dialog --- ...tions-einheit-delete-button.component.html | 6 ++ ...ns-einheit-delete-button.component.spec.ts | 58 +++++++++++++++++ ...sations-einheit-delete-button.component.ts | 20 ++++++ ...eit-delete-dialog-container.component.html | 6 ++ ...-delete-dialog-container.component.spec.ts | 41 ++++++++++++ ...nheit-delete-dialog-container.component.ts | 26 ++++++++ ...tions-einheit-delete-dialog.component.html | 21 ++++++ ...ns-einheit-delete-dialog.component.spec.ts | 65 +++++++++++++++++++ ...sations-einheit-delete-dialog.component.ts | 16 +++++ .../organisations-einheit-list.component.html | 11 ++-- ...ganisations-einheit-list.component.spec.ts | 18 ++++- .../organisations-einheit-list.component.ts | 15 ++--- 12 files changed, 287 insertions(+), 16 deletions(-) create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts create mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html new file mode 100644 index 0000000000..e180bccebc --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html @@ -0,0 +1,6 @@ +<ods-button-with-spinner + (clickEmitter)="openDeleteDialog()" + variant="outline" + text="Löschen" + dataTestId="delete-button" +/> \ No newline at end of file diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts new file mode 100644 index 0000000000..01db4119e3 --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts @@ -0,0 +1,58 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock } from '@alfa-client/test-utils'; +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { getDataTestIdAttributeOf } from '../../../../../../../tech-shared/test/data-test'; +import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button.component'; + +describe('OrganisationsEinheitDeleteButtonComponent', () => { + let component: OrganisationsEinheitDeleteButtonComponent; + let fixture: ComponentFixture<OrganisationsEinheitDeleteButtonComponent>; + + const deleteButton: string = getDataTestIdAttributeOf('delete-button'); + + let dialogService: Mock<OzgcloudDialogService>; + + beforeEach(() => { + dialogService = mock(OzgcloudDialogService); + + TestBed.configureTestingModule({ + imports: [OrganisationsEinheitDeleteButtonComponent], + providers: [{ provide: OzgcloudDialogService, useValue: dialogService }], + }).compileComponents(); + + fixture = TestBed.createComponent(OrganisationsEinheitDeleteButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('component', () => { + describe('delete', () => { + it('should open dialog', () => { + component.openDeleteDialog(); + + expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteButtonComponent); + }); + }); + }); + + describe('template', () => { + describe('button with spinner', () => { + it('should exist', () => { + existsAsHtmlElement(fixture, deleteButton); + }); + + it('should open delete dialog on click', () => { + component.openDeleteDialog = jest.fn(); + + dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter'); + + expect(component.openDeleteDialog).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts new file mode 100644 index 0000000000..baef9b1438 --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts @@ -0,0 +1,20 @@ +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { Component, inject, Input } from '@angular/core'; +import { ButtonWithSpinnerComponent } from '@ods/component'; +import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component'; + +@Component({ + selector: 'admin-organisations-einheit-delete-button', + standalone: true, + imports: [ButtonWithSpinnerComponent], + templateUrl: './organisations-einheit-delete-button.component.html', +}) +export class OrganisationsEinheitDeleteButtonComponent { + private readonly dialogService = inject(OzgcloudDialogService); + + @Input() organisationsEinheitName: string; + + public openDeleteDialog(): void { + this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent); + } +} diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html new file mode 100644 index 0000000000..b7ab8d03d3 --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html @@ -0,0 +1,6 @@ +<admin-organisations-einheit-delete-dialog + [organisationsEinheitName]="organisationsEinheitName" + [deleteOrganisationsEinheitStateResource]="deleteUserStateResource$ | async" + (cancel)="closeDeleteDialog()" + (delete)="deleteOrganisationsEinheit()" +/> diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts new file mode 100644 index 0000000000..3a79c41864 --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts @@ -0,0 +1,41 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { Mock, mock } from '@alfa-client/test-utils'; +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container.component'; + +describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { + let component: OrganisationsEinheitDeleteDialogContainerComponent; + let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogContainerComponent>; + + let dialogService: Mock<OzgcloudDialogService>; + + beforeEach(async () => { + dialogService = mock(OzgcloudDialogService); + + await TestBed.configureTestingModule({ + imports: [OrganisationsEinheitDeleteDialogContainerComponent], + providers: [{ provide: OzgcloudDialogService, useValue: dialogService }], + }).compileComponents(); + + fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('component', () => { + describe('closeDeleteDialog', () => { + it('should call dialogService closeAll', () => { + dialogService.closeAll = jest.fn(); + + component.closeDeleteDialog(); + + expect(dialogService.closeAll).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts new file mode 100644 index 0000000000..80f6d6d8de --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts @@ -0,0 +1,26 @@ +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { OzgcloudDialogService } from '@alfa-client/ui'; +import { AsyncPipe } from '@angular/common'; +import { Component, inject, Input } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component'; + +@Component({ + selector: 'admin-organisations-einheit-delete-dialog-container', + standalone: true, + imports: [AsyncPipe, OrganisationsEinheitDeleteDialogComponent], + templateUrl: './organisations-einheit-delete-dialog-container.component.html', +}) +export class OrganisationsEinheitDeleteDialogContainerComponent { + private readonly dialogService = inject(OzgcloudDialogService); + + @Input() organisationsEinheitName: string; + + public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); + + public closeDeleteDialog(): void { + this.dialogService.closeAll(); + } + + public deleteOrganisationsEinheit(): void {} +} diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html new file mode 100644 index 0000000000..cdc6e2f2c8 --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html @@ -0,0 +1,21 @@ +<h1>Organisationseinheit</h1> + +<p>Sind Sie sicher, dass sie {{organisationsEinheitName}} löschen möchten?</p> + +<p>Achtung: Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer entfernt. Benutzer sind dieser Organisationseinheit dann nicht mehr zugewiesen.</p> + +<div class="flex justify-between"> + <ods-button-with-spinner + (clickEmitter)="cancel.emit()" + text="Abbrechen" + dataTestId="dialog-cancel-button" + /> + + <ods-button-with-spinner + [stateResource]="deleteOrganisationsEinheitStateResource" + (clickEmitter)="delete.emit()" + variant="outline" + text="Löschen" + dataTestId="dialog-delete-button" + /> +</div> \ No newline at end of file diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts new file mode 100644 index 0000000000..755251ab19 --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { dispatchEventFromFixture, existsAsHtmlElement, getDebugElementFromFixtureByCss } from '@alfa-client/test-utils'; +import { ButtonWithSpinnerComponent } from '@ods/component'; +import { getDataTestIdAttributeOf } from '../../../../../../../../tech-shared/test/data-test'; +import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component'; + +describe('OrganisationsEinheitDeleteDialogComponent', () => { + let component: OrganisationsEinheitDeleteDialogComponent; + let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogComponent>; + + const deleteButton: string = getDataTestIdAttributeOf('dialog-delete-button'); + const cancelButton: string = getDataTestIdAttributeOf('dialog-cancel-button'); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [OrganisationsEinheitDeleteDialogComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('template', () => { + describe('cancel button', () => { + it('should exist', () => { + existsAsHtmlElement(fixture, cancelButton); + }); + + it('should emit cancel on click', () => { + component.cancel.emit = jest.fn(); + + dispatchEventFromFixture(fixture, cancelButton, 'clickEmitter'); + + expect(component.cancel.emit).toHaveBeenCalled(); + }); + }); + + describe('delete button', () => { + it('should exist', () => { + const stateResource: StateResource<unknown> = createEmptyStateResource(); + component.deleteOrganisationsEinheitStateResource = stateResource; + + fixture.detectChanges(); + + const button: ButtonWithSpinnerComponent = getDebugElementFromFixtureByCss(fixture, deleteButton).componentInstance; + expect(button._stateResource).toBe(stateResource); + }); + + it('should emit delete on click', () => { + component.delete.emit = jest.fn(); + + dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter'); + + expect(component.delete.emit).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts new file mode 100644 index 0000000000..5b946e192c --- /dev/null +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts @@ -0,0 +1,16 @@ +import { StateResource } from '@alfa-client/tech-shared'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ButtonWithSpinnerComponent } from '@ods/component'; + +@Component({ + selector: 'admin-organisations-einheit-delete-dialog', + standalone: true, + templateUrl: './organisations-einheit-delete-dialog.component.html', + imports: [ButtonWithSpinnerComponent], +}) +export class OrganisationsEinheitDeleteDialogComponent { + @Input() organisationsEinheitName: string; + @Input() deleteOrganisationsEinheitStateResource: StateResource<unknown>; + @Output() cancel: EventEmitter<void> = new EventEmitter<void>(); + @Output() delete: EventEmitter<void> = new EventEmitter<void>(); +} diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html index fc5ff5f376..5256146d2d 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html @@ -26,10 +26,13 @@ <ods-list data-test-id="organisations-einheit-list"> @for (organisationsEinheit of organisationsEinheitList; track $index) { <ods-list-item [attr.data-test-id]="(organisationsEinheit.name | convertForDataTest) + '-organisation-item'"> - <dl class="flex-1 basis-3/4 font-semibold"> - <dt class="sr-only">Name</dt> - <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd> - </dl> + <div class="space-between flex w-full"> + <dl class="flex-1 basis-3/4 font-semibold"> + <dt class="sr-only">Name</dt> + <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd> + </dl> + <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name"/> + </div> </ods-list-item> } </ods-list> diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts index dd2fba6125..cedf580df1 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts @@ -23,7 +23,7 @@ */ import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared'; import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; -import { existsAsHtmlElement, getElementFromFixture, mock } from '@alfa-client/test-utils'; +import { existsAsHtmlElement, getElementFromFixture, getMockComponent, mock } from '@alfa-client/test-utils'; import { CommonModule } from '@angular/common'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; @@ -31,6 +31,7 @@ import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods import { getConvertedDataTestIdOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; import { createAdminOrganisationsEinheit } from '../../../../../organisations-einheit-shared/src/test/organisations-einheit'; +import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component'; import { OrganisationsEinheitListComponent } from './organisations-einheit-list.component'; describe('OrganisationsEinheitListComponent', () => { @@ -54,6 +55,7 @@ describe('OrganisationsEinheitListComponent', () => { MockComponent(ListComponent), MockComponent(ListItemComponent), MockComponent(ExclamationIconComponent), + MockComponent(OrganisationsEinheitDeleteButtonComponent), ], }).compileComponents(); @@ -93,4 +95,18 @@ describe('OrganisationsEinheitListComponent', () => { }); }); }); + + describe('organisationsEinheit delete button', () => { + it('should exist', () => { + component.organisationsEinheitList = [createAdminOrganisationsEinheit()]; + + fixture.detectChanges(); + + const button: OrganisationsEinheitDeleteButtonComponent = getMockComponent( + fixture, + OrganisationsEinheitDeleteButtonComponent, + ); + expect(button.organisationsEinheitName).toBe(component.organisationsEinheitList[0].name); + }); + }); }); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts index 7efc0bbbe6..f268484b86 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts @@ -22,24 +22,17 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared'; -import { ConvertForDataTestPipe, ToResourceUriPipe } from '@alfa-client/tech-shared'; +import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { ExclamationIconComponent, ListComponent, ListItemComponent, TooltipDirective } from '@ods/system'; +import { ListComponent, ListItemComponent } from '@ods/system'; +import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component'; @Component({ selector: 'admin-organisations-einheit-list', templateUrl: './organisations-einheit-list.component.html', standalone: true, - imports: [ - CommonModule, - ListComponent, - ListItemComponent, - ExclamationIconComponent, - TooltipDirective, - ToResourceUriPipe, - ConvertForDataTestPipe, - ], + imports: [CommonModule, ListComponent, ListItemComponent, ConvertForDataTestPipe, OrganisationsEinheitDeleteButtonComponent], }) export class OrganisationsEinheitListComponent { @Input() public organisationsEinheitList: AdminOrganisationsEinheit[] = []; -- GitLab From 10a4dcd9a5e0afe85ebfedfd0258b5fcb479a1b8 Mon Sep 17 00:00:00 2001 From: Albert <Albert.Bruns@mgm-tp.com> Date: Tue, 25 Feb 2025 08:43:58 +0100 Subject: [PATCH 02/18] OZG-7507-7751 dialog finalize --- ...ons-einheit-delete-button.component.spec.ts | 8 +++++++- ...isations-einheit-delete-button.component.ts | 10 ++++++++-- ...t-delete-dialog-container.component.spec.ts | 18 +++++++++++++++++- ...inheit-delete-dialog-container.component.ts | 14 ++++++++++++-- ...ations-einheit-delete-dialog.component.html | 2 +- 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts index 01db4119e3..c4159af1ed 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts @@ -2,7 +2,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock } from '@alfa-client/test-utils'; import { OzgcloudDialogService } from '@alfa-client/ui'; +import { faker } from '@faker-js/faker'; import { getDataTestIdAttributeOf } from '../../../../../../../tech-shared/test/data-test'; +import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component'; import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button.component'; describe('OrganisationsEinheitDeleteButtonComponent', () => { @@ -33,9 +35,13 @@ describe('OrganisationsEinheitDeleteButtonComponent', () => { describe('component', () => { describe('delete', () => { it('should open dialog', () => { + component.organisationsEinheitName = faker.word.sample(); + component.openDeleteDialog(); - expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteButtonComponent); + expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteDialogContainerComponent, { + organisationsEinheitName: component.organisationsEinheitName, + }); }); }); }); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts index baef9b1438..50a217af68 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts @@ -1,7 +1,10 @@ import { OzgcloudDialogService } from '@alfa-client/ui'; import { Component, inject, Input } from '@angular/core'; import { ButtonWithSpinnerComponent } from '@ods/component'; -import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component'; +import { + OrganisationsEinheitDeleteDialogContainerComponent, + OrganisationsEinheitDeleteDialogData, +} from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component'; @Component({ selector: 'admin-organisations-einheit-delete-button', @@ -15,6 +18,9 @@ export class OrganisationsEinheitDeleteButtonComponent { @Input() organisationsEinheitName: string; public openDeleteDialog(): void { - this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent); + const dialogData: OrganisationsEinheitDeleteDialogData = { + organisationsEinheitName: this.organisationsEinheitName, + }; + this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent, dialogData); } } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts index 3a79c41864..90765a429c 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts @@ -2,6 +2,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { Mock, mock } from '@alfa-client/test-utils'; import { OzgcloudDialogService } from '@alfa-client/ui'; +import { DIALOG_DATA } from '@angular/cdk/dialog'; +import { faker } from '@faker-js/faker'; import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container.component'; describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { @@ -10,12 +12,20 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { let dialogService: Mock<OzgcloudDialogService>; + const dialogData = { organisationsEinheitName: faker.word.sample() }; + beforeEach(async () => { dialogService = mock(OzgcloudDialogService); await TestBed.configureTestingModule({ imports: [OrganisationsEinheitDeleteDialogContainerComponent], - providers: [{ provide: OzgcloudDialogService, useValue: dialogService }], + providers: [ + { provide: OzgcloudDialogService, useValue: dialogService }, + { + provide: DIALOG_DATA, + useValue: dialogData, + }, + ], }).compileComponents(); fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogContainerComponent); @@ -28,6 +38,12 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { }); describe('component', () => { + describe('constructor', () => { + it('should set organisationsEinheitName', () => { + expect(component.organisationsEinheitName).toBe(dialogData.organisationsEinheitName); + }); + }); + describe('closeDeleteDialog', () => { it('should call dialogService closeAll', () => { dialogService.closeAll = jest.fn(); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts index 80f6d6d8de..78a5658277 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts @@ -1,10 +1,15 @@ import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { OzgcloudDialogService } from '@alfa-client/ui'; +import { DIALOG_DATA } from '@angular/cdk/dialog'; import { AsyncPipe } from '@angular/common'; -import { Component, inject, Input } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { Observable, of } from 'rxjs'; import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component'; +export interface OrganisationsEinheitDeleteDialogData { + organisationsEinheitName: string; +} + @Component({ selector: 'admin-organisations-einheit-delete-dialog-container', standalone: true, @@ -13,8 +18,13 @@ import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einhe }) export class OrganisationsEinheitDeleteDialogContainerComponent { private readonly dialogService = inject(OzgcloudDialogService); + private readonly dialogData: OrganisationsEinheitDeleteDialogData = inject(DIALOG_DATA); - @Input() organisationsEinheitName: string; + public organisationsEinheitName: string; + + constructor() { + this.organisationsEinheitName = this.dialogData.organisationsEinheitName; + } public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html index cdc6e2f2c8..c4ea371bf7 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html @@ -1,6 +1,6 @@ <h1>Organisationseinheit</h1> -<p>Sind Sie sicher, dass sie {{organisationsEinheitName}} löschen möchten?</p> +<h2>{{organisationsEinheitName}} </h2> <p>Achtung: Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer entfernt. Benutzer sind dieser Organisationseinheit dann nicht mehr zugewiesen.</p> -- GitLab From f015884ca6221ab0b72717ca14e511f04d2bdece Mon Sep 17 00:00:00 2001 From: Albert <Albert.Bruns@mgm-tp.com> Date: Tue, 25 Feb 2025 14:53:06 +0100 Subject: [PATCH 03/18] OZG-7507-7752 organisationsEinheit loeschen service --- .../organisations-einheit.repository.spec.ts | 24 +++++ .../lib/organisations-einheit.repository.ts | 4 + .../lib/organisations-einheit.service.spec.ts | 23 ++++ .../src/lib/organisations-einheit.service.ts | 2 +- ...ns-einheit-delete-button.component.spec.ts | 2 + ...sations-einheit-delete-button.component.ts | 2 + ...eit-delete-dialog-container.component.html | 7 +- ...-delete-dialog-container.component.spec.ts | 100 ++++++++++++++++-- ...nheit-delete-dialog-container.component.ts | 25 ++++- ...tions-einheit-delete-dialog.component.html | 2 +- ...ns-einheit-delete-dialog.component.spec.ts | 2 +- ...sations-einheit-delete-dialog.component.ts | 2 +- .../organisations-einheit-list.component.html | 2 +- ...ganisations-einheit-list.component.spec.ts | 1 + 14 files changed, 179 insertions(+), 19 deletions(-) diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts index 43bc3d3856..e86fbad2ab 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.spec.ts @@ -1,6 +1,7 @@ import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared'; import { mock, Mock } from '@alfa-client/test-utils'; import { TestBed } from '@angular/core/testing'; +import { faker } from '@faker-js/faker'; import KcAdminClient from '@keycloak/keycloak-admin-client'; import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation'; import { createGroupRep } from '../../../organisations-einheit-shared/src/test/organisations-einheit'; @@ -85,4 +86,27 @@ describe('AdminOrganisationsEinheitRepository', () => { }); }); }); + + describe('delete', () => { + const organisationsEinheitId: string = faker.string.uuid(); + + beforeEach(() => { + kcAdminClient.groups = <any>{ + del: jest.fn().mockReturnValue(Promise.resolve()), + }; + }); + + it('should call kcAdminClient groups del', () => { + repository.delete(organisationsEinheitId); + + expect(kcAdminClient.groups['del']).toHaveBeenCalledWith({ id: organisationsEinheitId }); + }); + + it('should return void', (done) => { + repository.delete(organisationsEinheitId).subscribe((result: void) => { + expect(result).toBeUndefined(); + done(); + }); + }); + }); }); diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts index c2d454434e..abc3737d30 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/organisations-einheit.repository.ts @@ -43,4 +43,8 @@ export class AdminOrganisationsEinheitRepository { attributes: group.attributes, }; } + + public delete(organisationseinheitId: string): Observable<void> { + return from(this.kcAdminClient.groups.del({ id: organisationseinheitId })); + } } diff --git a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts index db8b44f6aa..12b297f16e 100644 --- a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.spec.ts @@ -23,8 +23,12 @@ */ import { AdminOrganisationsEinheit, AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared'; import { AdminOrganisationsEinheitRepository } from '@admin/keycloak-shared'; +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { Mock, mock } from '@alfa-client/test-utils'; import { TestBed } from '@angular/core/testing'; +import { faker } from '@faker-js/faker'; +import { of } from 'rxjs'; +import { singleColdCompleted } from '../../../../tech-shared/test/marbles'; import { createAdminOrganisationsEinheit } from '../test/organisations-einheit'; describe('AdminOrganisationsEinheitService', () => { @@ -55,4 +59,23 @@ describe('AdminOrganisationsEinheitService', () => { expect(repository.create).toHaveBeenCalledWith(organisationsEinheit); }); }); + + describe('deleteInKeycloak', () => { + const organisationsEinheitId: string = faker.string.uuid(); + + it('should call repository delete', () => { + service._deleteInKeycloak(organisationsEinheitId); + + expect(repository.delete).toHaveBeenCalledWith(organisationsEinheitId); + }); + + it('should return result', () => { + const state: StateResource<unknown> = createEmptyStateResource(); + repository.delete.mockReturnValue(of(state)); + + const result = service._deleteInKeycloak(organisationsEinheitId); + + expect(result).toBeObservable(singleColdCompleted(state)); + }); + }); }); diff --git a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts index 5c12d0613e..35f7580e9c 100644 --- a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts +++ b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.service.ts @@ -45,6 +45,6 @@ export class AdminOrganisationsEinheitService extends KeycloakResourceService<Ad } _deleteInKeycloak(id: string): Observable<void> { - throw new Error('Method not implemented.'); + return this.repository.delete(id); } } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts index c4159af1ed..22e9242b1a 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts @@ -36,11 +36,13 @@ describe('OrganisationsEinheitDeleteButtonComponent', () => { describe('delete', () => { it('should open dialog', () => { component.organisationsEinheitName = faker.word.sample(); + component.organisationsEinheitId = faker.string.uuid(); component.openDeleteDialog(); expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteDialogContainerComponent, { organisationsEinheitName: component.organisationsEinheitName, + organisationsEinheitId: component.organisationsEinheitId, }); }); }); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts index 50a217af68..0107b57855 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts @@ -16,10 +16,12 @@ export class OrganisationsEinheitDeleteButtonComponent { private readonly dialogService = inject(OzgcloudDialogService); @Input() organisationsEinheitName: string; + @Input() organisationsEinheitId: string; public openDeleteDialog(): void { const dialogData: OrganisationsEinheitDeleteDialogData = { organisationsEinheitName: this.organisationsEinheitName, + organisationsEinheitId: this.organisationsEinheitId, }; this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent, dialogData); } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html index b7ab8d03d3..21de75aa26 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.html @@ -1,6 +1,7 @@ <admin-organisations-einheit-delete-dialog [organisationsEinheitName]="organisationsEinheitName" - [deleteOrganisationsEinheitStateResource]="deleteUserStateResource$ | async" - (cancel)="closeDeleteDialog()" - (delete)="deleteOrganisationsEinheit()" + [deleteStateResource]="deleteStateResource$ | async" + (cancel)="closeDialog()" + (delete)="delete()" + data-test-id="organisations-einheit-delete-dialog" /> diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts index 90765a429c..a61b437b5e 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts @@ -1,26 +1,37 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { Mock, mock } from '@alfa-client/test-utils'; +import { AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared'; +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { dispatchEventFromFixture, getMockComponent, Mock, mock } from '@alfa-client/test-utils'; import { OzgcloudDialogService } from '@alfa-client/ui'; import { DIALOG_DATA } from '@angular/cdk/dialog'; import { faker } from '@faker-js/faker'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { singleColdCompleted } from 'libs/tech-shared/test/marbles'; +import { Observable, of } from 'rxjs'; import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container.component'; +import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component'; describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { let component: OrganisationsEinheitDeleteDialogContainerComponent; let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogContainerComponent>; let dialogService: Mock<OzgcloudDialogService>; + let organisationsEinheitService: Mock<AdminOrganisationsEinheitService>; - const dialogData = { organisationsEinheitName: faker.word.sample() }; + const dialogData = { organisationsEinheitName: faker.word.sample(), organisationsEinheitId: faker.string.uuid() }; - beforeEach(async () => { + const organisationsEinheitDeleteDialog: string = getDataTestIdOf('organisations-einheit-delete-dialog'); + + beforeEach(() => { dialogService = mock(OzgcloudDialogService); + organisationsEinheitService = { ...mock(AdminOrganisationsEinheitService), delete: jest.fn() }; - await TestBed.configureTestingModule({ + TestBed.configureTestingModule({ imports: [OrganisationsEinheitDeleteDialogContainerComponent], providers: [ { provide: OzgcloudDialogService, useValue: dialogService }, + { provide: AdminOrganisationsEinheitService, useValue: organisationsEinheitService }, { provide: DIALOG_DATA, useValue: dialogData, @@ -37,21 +48,98 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { expect(component).toBeTruthy(); }); + describe('template', () => { + describe('organisations einheit delete dialog', () => { + it('should exist', () => { + const stateResource: StateResource<unknown> = createEmptyStateResource(); + component.deleteStateResource$ = of(stateResource); + component.organisationsEinheitName = dialogData.organisationsEinheitName; + + const deleteDialogComponent: OrganisationsEinheitDeleteDialogComponent = getMockComponent( + fixture, + OrganisationsEinheitDeleteDialogComponent, + ); + + expect(deleteDialogComponent.organisationsEinheitName).toBe(component.organisationsEinheitName); + expect(deleteDialogComponent.deleteStateResource).toEqual(stateResource); + }); + + it('should call closeDialog on cancel emit', () => { + component.closeDialog = jest.fn(); + + dispatchEventFromFixture(fixture, organisationsEinheitDeleteDialog, 'cancel'); + + expect(component.closeDialog).toHaveBeenCalled(); + }); + + it('should call delete on delete emit', () => { + component.delete = jest.fn(); + + dispatchEventFromFixture(fixture, organisationsEinheitDeleteDialog, 'delete'); + + expect(component.delete).toHaveBeenCalled(); + }); + }); + }); + describe('component', () => { describe('constructor', () => { it('should set organisationsEinheitName', () => { expect(component.organisationsEinheitName).toBe(dialogData.organisationsEinheitName); }); + + it('should set organisationsEinheitId', () => { + expect(component.organisationsEinheitId).toBe(dialogData.organisationsEinheitId); + }); }); - describe('closeDeleteDialog', () => { + describe('closeDialog', () => { it('should call dialogService closeAll', () => { dialogService.closeAll = jest.fn(); - component.closeDeleteDialog(); + component.closeDialog(); expect(dialogService.closeAll).toHaveBeenCalled(); }); }); + + describe('delete', () => { + const stateResource: StateResource<unknown> = createEmptyStateResource(); + const stateResource$: Observable<StateResource<unknown>> = of(stateResource); + const loadingStateResource: StateResource<unknown> = createEmptyStateResource(true); + const loadingStateResource$: Observable<StateResource<unknown>> = of(loadingStateResource); + + beforeEach(() => { + organisationsEinheitService.delete.mockReturnValue(stateResource$); + }); + + it('should call organisationsEinheitService delete', () => { + component.delete(); + + expect(organisationsEinheitService.delete).toHaveBeenCalledWith(dialogData.organisationsEinheitId); + }); + + it('should set deleteStateResource$', () => { + component.delete(); + + expect(component.deleteStateResource$).toBeObservable(singleColdCompleted(stateResource)); + }); + + it('should close dialog on delete done', () => { + component.delete(); + component.deleteStateResource$.subscribe(); + + expect(dialogService.closeAll).toHaveBeenCalled(); + }); + + it('should NOT close dialog on delete loading', () => { + organisationsEinheitService.delete.mockReturnValue(loadingStateResource$); + + component.delete(); + component.deleteStateResource$.subscribe(); + + expect(dialogService.closeAll).not.toHaveBeenCalled(); + }); + }); }); }); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts index 78a5658277..c870025c8a 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts @@ -1,13 +1,15 @@ -import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared'; +import { createEmptyStateResource, isNotLoading, StateResource } from '@alfa-client/tech-shared'; import { OzgcloudDialogService } from '@alfa-client/ui'; import { DIALOG_DATA } from '@angular/cdk/dialog'; import { AsyncPipe } from '@angular/common'; import { Component, inject } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { Observable, of, tap } from 'rxjs'; import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component'; export interface OrganisationsEinheitDeleteDialogData { organisationsEinheitName: string; + organisationsEinheitId: string; } @Component({ @@ -19,18 +21,31 @@ export interface OrganisationsEinheitDeleteDialogData { export class OrganisationsEinheitDeleteDialogContainerComponent { private readonly dialogService = inject(OzgcloudDialogService); private readonly dialogData: OrganisationsEinheitDeleteDialogData = inject(DIALOG_DATA); + private readonly organisationsEinheitService = inject(AdminOrganisationsEinheitService); public organisationsEinheitName: string; + public organisationsEinheitId: string; constructor() { this.organisationsEinheitName = this.dialogData.organisationsEinheitName; + this.organisationsEinheitId = this.dialogData.organisationsEinheitId; } - public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); + public deleteStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); - public closeDeleteDialog(): void { + public closeDialog(): void { this.dialogService.closeAll(); } - public deleteOrganisationsEinheit(): void {} + public delete(): void { + this.deleteStateResource$ = this.organisationsEinheitService + .delete(this.organisationsEinheitId) + .pipe(tap((stateResource: StateResource<unknown>) => this.closeDialogOnDeleteDone(stateResource))); + } + + private closeDialogOnDeleteDone(stateResource: StateResource<unknown>): void { + if (isNotLoading(stateResource)) { + this.dialogService.closeAll(); + } + } } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html index c4ea371bf7..dc4f1c424a 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html @@ -12,7 +12,7 @@ /> <ods-button-with-spinner - [stateResource]="deleteOrganisationsEinheitStateResource" + [stateResource]="deleteStateResource" (clickEmitter)="delete.emit()" variant="outline" text="Löschen" diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts index 755251ab19..af90956f84 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts @@ -45,7 +45,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => { describe('delete button', () => { it('should exist', () => { const stateResource: StateResource<unknown> = createEmptyStateResource(); - component.deleteOrganisationsEinheitStateResource = stateResource; + component.deleteStateResource = stateResource; fixture.detectChanges(); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts index 5b946e192c..9d8e8f4bd9 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts @@ -10,7 +10,7 @@ import { ButtonWithSpinnerComponent } from '@ods/component'; }) export class OrganisationsEinheitDeleteDialogComponent { @Input() organisationsEinheitName: string; - @Input() deleteOrganisationsEinheitStateResource: StateResource<unknown>; + @Input() deleteStateResource: StateResource<unknown>; @Output() cancel: EventEmitter<void> = new EventEmitter<void>(); @Output() delete: EventEmitter<void> = new EventEmitter<void>(); } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html index 5256146d2d..c70ba97b42 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html @@ -31,7 +31,7 @@ <dt class="sr-only">Name</dt> <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd> </dl> - <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name"/> + <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name" [organisationsEinheitId]="organisationsEinheit.id"/> </div> </ods-list-item> } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts index cedf580df1..7d4f9b9af5 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts @@ -107,6 +107,7 @@ describe('OrganisationsEinheitListComponent', () => { OrganisationsEinheitDeleteButtonComponent, ); expect(button.organisationsEinheitName).toBe(component.organisationsEinheitList[0].name); + expect(button.organisationsEinheitId).toBe(component.organisationsEinheitList[0].id); }); }); }); -- GitLab From e5d76403058bf205c7a2acc626b6f8d82e9de005 Mon Sep 17 00:00:00 2001 From: Albert <Albert.Bruns@mgm-tp.com> Date: Tue, 25 Feb 2025 16:19:37 +0100 Subject: [PATCH 04/18] OZG-7507-7819 UI/UX --- ...tions-einheit-delete-button.component.html | 13 ++++--- ...sations-einheit-delete-button.component.ts | 3 +- ...tions-einheit-delete-dialog.component.html | 34 +++++++++---------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html index e180bccebc..ecda066c3e 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html @@ -1,6 +1,9 @@ -<ods-button-with-spinner - (clickEmitter)="openDeleteDialog()" - variant="outline" - text="Löschen" +<ods-button + (click)="openDeleteDialog()" + [tooltip]="'Organisationseinheit löschen'" + variant="ghost" + size="fit" dataTestId="delete-button" -/> \ No newline at end of file +> + <ods-delete-icon icon/> +</ods-button> \ No newline at end of file diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts index 0107b57855..d04e53f3a6 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts @@ -1,6 +1,7 @@ import { OzgcloudDialogService } from '@alfa-client/ui'; import { Component, inject, Input } from '@angular/core'; import { ButtonWithSpinnerComponent } from '@ods/component'; +import { ButtonComponent, DeleteIconComponent, TooltipDirective } from '@ods/system'; import { OrganisationsEinheitDeleteDialogContainerComponent, OrganisationsEinheitDeleteDialogData, @@ -9,7 +10,7 @@ import { @Component({ selector: 'admin-organisations-einheit-delete-button', standalone: true, - imports: [ButtonWithSpinnerComponent], + imports: [ButtonWithSpinnerComponent, DeleteIconComponent, ButtonComponent, TooltipDirective], templateUrl: './organisations-einheit-delete-button.component.html', }) export class OrganisationsEinheitDeleteButtonComponent { diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html index dc4f1c424a..127651d3f6 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html @@ -1,21 +1,21 @@ -<h1>Organisationseinheit</h1> +<div class="block flex flex-col gap-4 bg-background-100 p-8 max-w-xl"> + <h1 class="text-xl">Organisationseinheit</h1> -<h2>{{organisationsEinheitName}} </h2> + <h2 class="text-lg">{{ organisationsEinheitName }}</h2> -<p>Achtung: Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer entfernt. Benutzer sind dieser Organisationseinheit dann nicht mehr zugewiesen.</p> + <p> + <span class="font-bold">Achtung:</span> Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer + entfernt. + </p> -<div class="flex justify-between"> - <ods-button-with-spinner - (clickEmitter)="cancel.emit()" - text="Abbrechen" - dataTestId="dialog-cancel-button" - /> + <div class="flex justify-between"> + <ods-button-with-spinner (clickEmitter)="cancel.emit()" variant="outline" text="Abbrechen" dataTestId="dialog-cancel-button" /> - <ods-button-with-spinner - [stateResource]="deleteStateResource" - (clickEmitter)="delete.emit()" - variant="outline" - text="Löschen" - dataTestId="dialog-delete-button" - /> -</div> \ No newline at end of file + <ods-button-with-spinner + [stateResource]="deleteStateResource" + (clickEmitter)="delete.emit()" + text="Löschen" + dataTestId="dialog-delete-button" + /> + </div> +</div> -- GitLab From 058f297b0795d1092e9f3547405e56be75f1d9cf Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Thu, 27 Feb 2025 23:44:59 +0100 Subject: [PATCH 05/18] OZG-7507 use new open dialog button Sub task: OZG-7821 --- ...tions-einheit-delete-button.component.html | 9 --- ...ns-einheit-delete-button.component.spec.ts | 66 ------------------- ...sations-einheit-delete-button.component.ts | 29 -------- .../organisations-einheit-list.component.html | 10 ++- ...ganisations-einheit-list.component.spec.ts | 39 ++++++----- .../organisations-einheit-list.component.ts | 17 ++++- .../open-dialog-button.component.spec.ts | 27 +++++++- .../open-dialog-button.component.ts | 14 ++-- .../src/lib/service/component.factory.spec.ts | 9 ++- .../src/lib/service/component.factory.ts | 23 +++++-- alfa-client/libs/test-utils/src/lib/dialog.ts | 8 ++- 11 files changed, 111 insertions(+), 140 deletions(-) delete mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html delete mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts delete mode 100644 alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html deleted file mode 100644 index ecda066c3e..0000000000 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.html +++ /dev/null @@ -1,9 +0,0 @@ -<ods-button - (click)="openDeleteDialog()" - [tooltip]="'Organisationseinheit löschen'" - variant="ghost" - size="fit" - dataTestId="delete-button" -> - <ods-delete-icon icon/> -</ods-button> \ No newline at end of file diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts deleted file mode 100644 index 22e9242b1a..0000000000 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock } from '@alfa-client/test-utils'; -import { OzgcloudDialogService } from '@alfa-client/ui'; -import { faker } from '@faker-js/faker'; -import { getDataTestIdAttributeOf } from '../../../../../../../tech-shared/test/data-test'; -import { OrganisationsEinheitDeleteDialogContainerComponent } from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component'; -import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button.component'; - -describe('OrganisationsEinheitDeleteButtonComponent', () => { - let component: OrganisationsEinheitDeleteButtonComponent; - let fixture: ComponentFixture<OrganisationsEinheitDeleteButtonComponent>; - - const deleteButton: string = getDataTestIdAttributeOf('delete-button'); - - let dialogService: Mock<OzgcloudDialogService>; - - beforeEach(() => { - dialogService = mock(OzgcloudDialogService); - - TestBed.configureTestingModule({ - imports: [OrganisationsEinheitDeleteButtonComponent], - providers: [{ provide: OzgcloudDialogService, useValue: dialogService }], - }).compileComponents(); - - fixture = TestBed.createComponent(OrganisationsEinheitDeleteButtonComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - describe('component', () => { - describe('delete', () => { - it('should open dialog', () => { - component.organisationsEinheitName = faker.word.sample(); - component.organisationsEinheitId = faker.string.uuid(); - - component.openDeleteDialog(); - - expect(dialogService.open).toHaveBeenCalledWith(OrganisationsEinheitDeleteDialogContainerComponent, { - organisationsEinheitName: component.organisationsEinheitName, - organisationsEinheitId: component.organisationsEinheitId, - }); - }); - }); - }); - - describe('template', () => { - describe('button with spinner', () => { - it('should exist', () => { - existsAsHtmlElement(fixture, deleteButton); - }); - - it('should open delete dialog on click', () => { - component.openDeleteDialog = jest.fn(); - - dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter'); - - expect(component.openDeleteDialog).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts deleted file mode 100644 index d04e53f3a6..0000000000 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-button/organisations-einheit-delete-button.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { OzgcloudDialogService } from '@alfa-client/ui'; -import { Component, inject, Input } from '@angular/core'; -import { ButtonWithSpinnerComponent } from '@ods/component'; -import { ButtonComponent, DeleteIconComponent, TooltipDirective } from '@ods/system'; -import { - OrganisationsEinheitDeleteDialogContainerComponent, - OrganisationsEinheitDeleteDialogData, -} from '../organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component'; - -@Component({ - selector: 'admin-organisations-einheit-delete-button', - standalone: true, - imports: [ButtonWithSpinnerComponent, DeleteIconComponent, ButtonComponent, TooltipDirective], - templateUrl: './organisations-einheit-delete-button.component.html', -}) -export class OrganisationsEinheitDeleteButtonComponent { - private readonly dialogService = inject(OzgcloudDialogService); - - @Input() organisationsEinheitName: string; - @Input() organisationsEinheitId: string; - - public openDeleteDialog(): void { - const dialogData: OrganisationsEinheitDeleteDialogData = { - organisationsEinheitName: this.organisationsEinheitName, - organisationsEinheitId: this.organisationsEinheitId, - }; - this.dialogService.open(OrganisationsEinheitDeleteDialogContainerComponent, dialogData); - } -} diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html index c70ba97b42..a990131625 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html @@ -31,7 +31,15 @@ <dt class="sr-only">Name</dt> <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd> </dl> - <admin-organisations-einheit-delete-button [organisationsEinheitName]="organisationsEinheit.name" [organisationsEinheitId]="organisationsEinheit.id"/> + <ods-open-dialog-button + [tooltip]="'Organisationseinheit löschen'" + variant="ghost" + size="fit" + dataTestId="delete-button" + [dialogData]="{ organisationsEinheitName: organisationsEinheit.name, organisationsEinheitId: organisationsEinheit.id }" + > + <ods-delete-icon icon /> + </ods-open-dialog-button> </div> </ods-list-item> } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts index 7d4f9b9af5..75e0c4dd8e 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts @@ -23,15 +23,15 @@ */ import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared'; import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; -import { existsAsHtmlElement, getElementFromFixture, getMockComponent, mock } from '@alfa-client/test-utils'; +import { existsAsHtmlElement, getElementFromFixture, getElementFromFixtureByType, mock } from '@alfa-client/test-utils'; import { CommonModule } from '@angular/common'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; +import { OpenDialogButtonComponent } from '@ods/component'; import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods/system'; -import { getConvertedDataTestIdOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { getConvertedDataTestIdOf, getDataTestIdAttributeOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; import { createAdminOrganisationsEinheit } from '../../../../../organisations-einheit-shared/src/test/organisations-einheit'; -import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component'; import { OrganisationsEinheitListComponent } from './organisations-einheit-list.component'; describe('OrganisationsEinheitListComponent', () => { @@ -40,6 +40,7 @@ describe('OrganisationsEinheitListComponent', () => { const listSelector: string = getDataTestIdOf('organisations-einheit-list'); const listItemSuffux: string = '-organisation-item'; + const deleteButtonTestId: string = getDataTestIdAttributeOf('delete-button'); beforeEach(async () => { await TestBed.configureTestingModule({ @@ -49,13 +50,12 @@ describe('OrganisationsEinheitListComponent', () => { useValue: mock(ActivatedRoute), }, ], - imports: [CommonModule, ConvertForDataTestPipe], + imports: [CommonModule, ConvertForDataTestPipe, MockComponent(OpenDialogButtonComponent)], declarations: [ OrganisationsEinheitListComponent, MockComponent(ListComponent), MockComponent(ListItemComponent), MockComponent(ExclamationIconComponent), - MockComponent(OrganisationsEinheitDeleteButtonComponent), ], }).compileComponents(); @@ -94,20 +94,27 @@ describe('OrganisationsEinheitListComponent', () => { }); }); }); - }); - describe('organisationsEinheit delete button', () => { - it('should exist', () => { - component.organisationsEinheitList = [createAdminOrganisationsEinheit()]; + describe('open delete dialog button', () => { + const organisationsEinheit: AdminOrganisationsEinheit = createAdminOrganisationsEinheit(); + + it('should exist', () => { + component.organisationsEinheitList = [organisationsEinheit]; - fixture.detectChanges(); + fixture.detectChanges(); + + existsAsHtmlElement(fixture, deleteButtonTestId); + }); - const button: OrganisationsEinheitDeleteButtonComponent = getMockComponent( - fixture, - OrganisationsEinheitDeleteButtonComponent, - ); - expect(button.organisationsEinheitName).toBe(component.organisationsEinheitList[0].name); - expect(button.organisationsEinheitId).toBe(component.organisationsEinheitList[0].id); + it('should have inputs', () => { + component.organisationsEinheitList = [organisationsEinheit]; + + fixture.detectChanges(); + const dialog: OpenDialogButtonComponent = getElementFromFixtureByType(fixture, OpenDialogButtonComponent); + + expect(dialog.dialogData.organisationsEinheitName).toBe(organisationsEinheit.name); + expect(dialog.dialogData.organisationsEinheitId).toBe(organisationsEinheit.id); + }); }); }); }); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts index f268484b86..9fabaed44e 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.ts @@ -23,16 +23,27 @@ */ import { AdminOrganisationsEinheit } from '@admin-client/organisations-einheit-shared'; import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; +import { DIALOG_COMPONENT } from '@alfa-client/ui'; import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { ListComponent, ListItemComponent } from '@ods/system'; -import { OrganisationsEinheitDeleteButtonComponent } from './organisations-einheit-delete-button/organisations-einheit-delete-button.component'; +import { OpenDialogButtonComponent } from '@ods/component'; +import { DeleteIconComponent, ListComponent, ListItemComponent, TooltipDirective } from '@ods/system'; +import { OrganisationsEinheitDeleteDialogContainerComponent } from './organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component'; @Component({ selector: 'admin-organisations-einheit-list', templateUrl: './organisations-einheit-list.component.html', standalone: true, - imports: [CommonModule, ListComponent, ListItemComponent, ConvertForDataTestPipe, OrganisationsEinheitDeleteButtonComponent], + providers: [{ provide: DIALOG_COMPONENT, useValue: OrganisationsEinheitDeleteDialogContainerComponent }], + imports: [ + CommonModule, + ListComponent, + ListItemComponent, + ConvertForDataTestPipe, + OpenDialogButtonComponent, + TooltipDirective, + DeleteIconComponent, + ], }) export class OrganisationsEinheitListComponent { @Input() public organisationsEinheitList: AdminOrganisationsEinheit[] = []; diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts index 8cbe8c1ae0..220ba4a752 100644 --- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts +++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.spec.ts @@ -1,9 +1,18 @@ import { OzgCloudComponentFactory } from '@alfa-client/tech-shared'; -import { dispatchEventFromFixture, Mock, mock, MockEvent, mockGetValue } from '@alfa-client/test-utils'; +import { + createdClosedDialogRefMock, + dispatchEventFromFixture, + Mock, + mock, + MockEvent, + mockGetValue, +} from '@alfa-client/test-utils'; import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui'; +import { DIALOG_DATA } from '@angular/cdk/dialog'; import { ComponentType } from '@angular/cdk/portal'; import { ComponentRef, Injector, ViewContainerRef } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { expect } from '@jest/globals'; import { ButtonComponent } from '@ods/system'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; @@ -24,6 +33,7 @@ describe('OpenDialogButtonComponent', () => { const componentRef: ComponentRef<any> = <any>{ instance: { constructor: null } }; const dialogResponse: any = {}; + const dummyDialogData: any = { someField: 'someValue' }; beforeEach(async () => { dialogComponent = {}; @@ -74,9 +84,15 @@ describe('OpenDialogButtonComponent', () => { }); it('should call dialog service to open dialog', () => { + component.dialogData = dummyDialogData; + dispatchEventFromFixture(fixture, openDialog, MockEvent.CLICK); - expect(dialogService.openInContext).toHaveBeenCalledWith(componentRef.instance.constructor, viewContainerRef); + expect(dialogService.openInContext).toHaveBeenCalledWith( + componentRef.instance.constructor, + viewContainerRef, + dummyDialogData, + ); }); }); @@ -87,6 +103,7 @@ describe('OpenDialogButtonComponent', () => { it('should emit close emitter on dialog close', () => { component.close.emit = jest.fn(); + dialogService.openInContext.mockReturnValue(createdClosedDialogRefMock()); component.open(); @@ -96,9 +113,13 @@ describe('OpenDialogButtonComponent', () => { describe('create component', () => { it('should call component factory to create component', () => { + component.dialogData = dummyDialogData; + component._createComponent(); - expect(componentFactory.createComponent).toHaveBeenCalledWith(dialogComponent, injector); + expect(componentFactory.createComponent).toHaveBeenCalledWith(dialogComponent, injector, [ + { provide: DIALOG_DATA, useValue: dummyDialogData }, + ]); }); }); }); diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts index 2815aab6fd..833c45112b 100644 --- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts +++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts @@ -1,5 +1,6 @@ import { OzgCloudComponentFactory } from '@alfa-client/tech-shared'; import { DIALOG_COMPONENT, OzgcloudDialogService } from '@alfa-client/ui'; +import { DIALOG_DATA } from '@angular/cdk/dialog'; import { ComponentType } from '@angular/cdk/portal'; import { Component, ComponentRef, EventEmitter, inject, Injector, Input, Output, ViewContainerRef } from '@angular/core'; import { ButtonComponent, ButtonVariants } from '@ods/system'; @@ -9,10 +10,11 @@ import { first } from 'rxjs'; selector: 'ods-open-dialog-button', standalone: true, imports: [ButtonComponent], - template: `<ods-button + template: ` <ods-button (clickEmitter)="open()" [variant]="variant" [text]="label" + [size]="size" [dataTestId]="dataTestId" data-test-id="open-dialog" > @@ -33,17 +35,21 @@ export class OpenDialogButtonComponent { @Input() label: string; @Input() dataTestId: string; @Input() variant: ButtonVariants['variant'] = 'primary'; + @Input() dialogData: any; + @Input() size: ButtonVariants['size']; @Output() close: EventEmitter<void> = new EventEmitter(); public open(): void { this.dialogService - .openInContext(this._createComponent().instance.constructor, this.viewContainerRef) + .openInContext(this._createComponent().instance.constructor, this.viewContainerRef, this.dialogData) .closed.pipe(first()) - .subscribe(this.close.emit); + .subscribe(() => this.close.emit()); } _createComponent(): ComponentRef<any> { - return this.componentFactory.createComponent<any>(this.component, this.injector); + return this.componentFactory.createComponent<any>(this.component, this.injector, [ + { provide: DIALOG_DATA, useValue: this.dialogData }, + ]); } } diff --git a/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts b/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts index 32fb2f6d84..d8a94aec3e 100644 --- a/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.spec.ts @@ -1,8 +1,9 @@ import { Mock, mock, mockGetValue } from '@alfa-client/test-utils'; -import { ApplicationRef, ComponentRef, EnvironmentInjector, Injector, ViewRef } from '@angular/core'; +import { ApplicationRef, ComponentRef, EnvironmentInjector, Injector, Provider, ViewRef } from '@angular/core'; import { TestBed } from '@angular/core/testing'; import { OzgCloudComponentFactory } from './component.factory'; +import { DIALOG_DATA } from '@angular/cdk/dialog'; import { ComponentType } from '@angular/cdk/portal'; jest.mock('@angular/core', () => ({ @@ -16,6 +17,8 @@ describe('OzgCloudComponentFactory', () => { let appRef: Mock<ApplicationRef>; let envInjector: Mock<EnvironmentInjector>; + const dummyProvider: Provider = { provide: DIALOG_DATA, useValue: { someField: 'value' } } as Provider; + beforeEach(() => { appRef = mock(ApplicationRef); envInjector = mock(EnvironmentInjector as any); @@ -45,7 +48,7 @@ describe('OzgCloudComponentFactory', () => { }); it('should call createComponent', () => { - factory.createComponent(componentType, injector); + factory.createComponent(componentType, injector, [dummyProvider]); expect(createComponentSpy).toHaveBeenCalledWith(componentType, { environmentInjector: envInjector, @@ -76,7 +79,7 @@ describe('OzgCloudComponentFactory', () => { }); it('should create an injector by given parent selector', () => { - factory._createElementInjector(injectorMock); + factory._createElementInjector(injectorMock, [dummyProvider]); expect(createSpy).toHaveBeenCalled(); }); diff --git a/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts b/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts index e54497e9fc..b3d13c11b4 100644 --- a/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts +++ b/alfa-client/libs/tech-shared/src/lib/service/component.factory.ts @@ -1,22 +1,35 @@ import { ComponentType } from '@angular/cdk/portal'; -import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, Injectable, Injector } from '@angular/core'; +import { + ApplicationRef, + ComponentRef, + createComponent, + EnvironmentInjector, + inject, + Injectable, + Injector, + Provider, +} from '@angular/core'; @Injectable({ providedIn: 'root' }) export class OzgCloudComponentFactory { private readonly appRef = inject(ApplicationRef); private readonly envInjector = inject(EnvironmentInjector); - public createComponent<T>(componentType: ComponentType<any>, parentInjector: Injector): ComponentRef<T> { + public createComponent<T>( + componentType: ComponentType<any>, + parentInjector: Injector, + providers: Provider[] = [], + ): ComponentRef<T> { const component: ComponentRef<any> = <ComponentRef<any>>createComponent(componentType, { environmentInjector: this.envInjector, - elementInjector: this._createElementInjector(parentInjector), + elementInjector: this._createElementInjector(parentInjector, providers), }); this._registerComponentToChangeDetection(component); return component; } - _createElementInjector(parentInjector: Injector): Injector { - return Injector.create({ providers: [], parent: parentInjector }); + _createElementInjector(parentInjector: Injector, providers: Provider[] = []): Injector { + return Injector.create({ providers, parent: parentInjector }); } _registerComponentToChangeDetection(component: ComponentRef<any>): void { diff --git a/alfa-client/libs/test-utils/src/lib/dialog.ts b/alfa-client/libs/test-utils/src/lib/dialog.ts index 7e09b7bea5..5a8c5fe473 100644 --- a/alfa-client/libs/test-utils/src/lib/dialog.ts +++ b/alfa-client/libs/test-utils/src/lib/dialog.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { jest } from '@jest/globals'; -import { EMPTY, Observable } from 'rxjs'; +import { EMPTY, Observable, of } from 'rxjs'; export class DialogRefMock<R = unknown> { public keydownEvents: Observable<KeyboardEvent> = EMPTY; @@ -34,3 +34,9 @@ export class DialogRefMock<R = unknown> { export function createDialogRefMock<R = unknown>(): DialogRefMock<R> { return new DialogRefMock(); } + +export function createdClosedDialogRefMock<R = unknown>(result?: R): DialogRefMock<R> { + const dialogRefMock = createDialogRefMock<R>(); + dialogRefMock.closed = of(result); + return dialogRefMock; +} -- GitLab From a3d558941bdae4cfc393c89c40238bd679898a94 Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 11:56:16 +0100 Subject: [PATCH 06/18] OZG-7507 add data-test-id --- ...nisations-einheit-delete-dialog.component.html | 15 +++++++++++---- ...ations-einheit-delete-dialog.component.spec.ts | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html index 127651d3f6..be0ce22400 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html @@ -1,21 +1,28 @@ -<div class="block flex flex-col gap-4 bg-background-100 p-8 max-w-xl"> +<div class="block flex max-w-xl flex-col gap-4 bg-background-100 p-8"> <h1 class="text-xl">Organisationseinheit</h1> <h2 class="text-lg">{{ organisationsEinheitName }}</h2> <p> - <span class="font-bold">Achtung:</span> Durch das Entfernen der Organisationseinheit aus dieser Liste wird die Organisationseinheit auch für alle Benutzer - entfernt. + <span class="font-bold">Achtung:</span> Durch das Entfernen der Organisationseinheit aus dieser Liste wird die + Organisationseinheit auch für alle Benutzer entfernt. </p> <div class="flex justify-between"> - <ods-button-with-spinner (clickEmitter)="cancel.emit()" variant="outline" text="Abbrechen" dataTestId="dialog-cancel-button" /> + <ods-button-with-spinner + (clickEmitter)="cancel.emit()" + variant="outline" + text="Abbrechen" + dataTestId="dialog-cancel-button" + data-test-id="dialog-cancel-ods-button" + /> <ods-button-with-spinner [stateResource]="deleteStateResource" (clickEmitter)="delete.emit()" text="Löschen" dataTestId="dialog-delete-button" + data-test-id="dialog-delete-ods-button" /> </div> </div> diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts index af90956f84..4d242a5a99 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts @@ -3,15 +3,15 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { dispatchEventFromFixture, existsAsHtmlElement, getDebugElementFromFixtureByCss } from '@alfa-client/test-utils'; import { ButtonWithSpinnerComponent } from '@ods/component'; -import { getDataTestIdAttributeOf } from '../../../../../../../../tech-shared/test/data-test'; +import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test'; import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component'; describe('OrganisationsEinheitDeleteDialogComponent', () => { let component: OrganisationsEinheitDeleteDialogComponent; let fixture: ComponentFixture<OrganisationsEinheitDeleteDialogComponent>; - const deleteButton: string = getDataTestIdAttributeOf('dialog-delete-button'); - const cancelButton: string = getDataTestIdAttributeOf('dialog-cancel-button'); + const deleteButton: string = getDataTestIdOf('dialog-delete-ods-button'); + const cancelButton: string = getDataTestIdOf('dialog-cancel-ods-button'); beforeEach(async () => { await TestBed.configureTestingModule({ -- GitLab From bf7e975012d46ada9dc162c4e4f67add59c14656 Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 11:57:00 +0100 Subject: [PATCH 07/18] OZG-7507 use MockEvent --- ...anisations-einheit-delete-dialog.component.spec.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts index 4d242a5a99..78d9d0efc5 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts @@ -1,7 +1,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; -import { dispatchEventFromFixture, existsAsHtmlElement, getDebugElementFromFixtureByCss } from '@alfa-client/test-utils'; +import { + dispatchEventFromFixture, + existsAsHtmlElement, + getDebugElementFromFixtureByCss, + MockEvent, +} from '@alfa-client/test-utils'; import { ButtonWithSpinnerComponent } from '@ods/component'; import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test'; import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component'; @@ -36,7 +41,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => { it('should emit cancel on click', () => { component.cancel.emit = jest.fn(); - dispatchEventFromFixture(fixture, cancelButton, 'clickEmitter'); + dispatchEventFromFixture(fixture, cancelButton, MockEvent.CLICK); expect(component.cancel.emit).toHaveBeenCalled(); }); @@ -56,7 +61,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => { it('should emit delete on click', () => { component.delete.emit = jest.fn(); - dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter'); + dispatchEventFromFixture(fixture, deleteButton, MockEvent.CLICK); expect(component.delete.emit).toHaveBeenCalled(); }); -- GitLab From 178e82f3dc81ee2ebbbac179b7387c25a88a412b Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 11:57:35 +0100 Subject: [PATCH 08/18] OZG-7507 remove empty line --- .../organisations-einheit-delete-dialog.component.spec.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts index 78d9d0efc5..011880a964 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts @@ -1,5 +1,3 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { dispatchEventFromFixture, @@ -7,6 +5,7 @@ import { getDebugElementFromFixtureByCss, MockEvent, } from '@alfa-client/test-utils'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ButtonWithSpinnerComponent } from '@ods/component'; import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test'; import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component'; -- GitLab From 4cb9e7b3f88579ee1038601c8845f5ba220fb4db Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 12:15:22 +0100 Subject: [PATCH 09/18] OZG-7507 use button without spinner --- ...ations-einheit-delete-dialog.component.html | 2 +- ...ons-einheit-delete-dialog.component.spec.ts | 18 ++++++++++++++---- ...isations-einheit-delete-dialog.component.ts | 3 ++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html index be0ce22400..1c75a946f5 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.html @@ -9,7 +9,7 @@ </p> <div class="flex justify-between"> - <ods-button-with-spinner + <ods-button (clickEmitter)="cancel.emit()" variant="outline" text="Abbrechen" diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts index 011880a964..dc175e5e96 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts @@ -2,11 +2,13 @@ import { createEmptyStateResource, StateResource } from '@alfa-client/tech-share import { dispatchEventFromFixture, existsAsHtmlElement, - getDebugElementFromFixtureByCss, + getElementComponentFromFixtureByCss, MockEvent, } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ButtonWithSpinnerComponent } from '@ods/component'; +import { ButtonComponent } from '@ods/system'; +import { MockComponent } from 'ng-mocks'; import { getDataTestIdOf } from '../../../../../../../../tech-shared/test/data-test'; import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog.component'; @@ -19,7 +21,11 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [OrganisationsEinheitDeleteDialogComponent], + imports: [ + OrganisationsEinheitDeleteDialogComponent, + MockComponent(ButtonWithSpinnerComponent), + MockComponent(ButtonComponent), + ], }).compileComponents(); fixture = TestBed.createComponent(OrganisationsEinheitDeleteDialogComponent); @@ -48,13 +54,17 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => { describe('delete button', () => { it('should exist', () => { + existsAsHtmlElement(fixture, deleteButton); + }); + + it('should have inputs', () => { const stateResource: StateResource<unknown> = createEmptyStateResource(); component.deleteStateResource = stateResource; fixture.detectChanges(); - const button: ButtonWithSpinnerComponent = getDebugElementFromFixtureByCss(fixture, deleteButton).componentInstance; - expect(button._stateResource).toBe(stateResource); + const button: ButtonWithSpinnerComponent = getElementComponentFromFixtureByCss(fixture, deleteButton); + expect(button.stateResource).toBe(stateResource); }); it('should emit delete on click', () => { diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts index 9d8e8f4bd9..ac39d47d8c 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts @@ -1,12 +1,13 @@ import { StateResource } from '@alfa-client/tech-shared'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ButtonWithSpinnerComponent } from '@ods/component'; +import { ButtonComponent } from '@ods/system'; @Component({ selector: 'admin-organisations-einheit-delete-dialog', standalone: true, templateUrl: './organisations-einheit-delete-dialog.component.html', - imports: [ButtonWithSpinnerComponent], + imports: [ButtonWithSpinnerComponent, ButtonComponent], }) export class OrganisationsEinheitDeleteDialogComponent { @Input() organisationsEinheitName: string; -- GitLab From 8de3618f76fbad39a0b2ef2e8c4e5f100993624a Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 12:15:42 +0100 Subject: [PATCH 10/18] OZG-7507 add empty lines --- .../organisations-einheit-delete-dialog.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts index ac39d47d8c..fed45f5109 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts @@ -12,6 +12,7 @@ import { ButtonComponent } from '@ods/system'; export class OrganisationsEinheitDeleteDialogComponent { @Input() organisationsEinheitName: string; @Input() deleteStateResource: StateResource<unknown>; + @Output() cancel: EventEmitter<void> = new EventEmitter<void>(); @Output() delete: EventEmitter<void> = new EventEmitter<void>(); } -- GitLab From 6b86812cbf18cba7a1b09a4a8d7af8422cf276af Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 12:26:23 +0100 Subject: [PATCH 11/18] OZG-7507 remove unknown type --- .../src/lib/keycloak.resource.service.ts | 2 +- ...-einheit-delete-dialog-container.component.spec.ts | 10 +++++----- ...tions-einheit-delete-dialog-container.component.ts | 11 ++++++----- ...anisations-einheit-delete-dialog.component.spec.ts | 2 +- .../organisations-einheit-delete-dialog.component.ts | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts index 572761923b..3cd3bdc24a 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.resource.service.ts @@ -65,7 +65,7 @@ export abstract class KeycloakResourceService<T> { protected abstract _saveInKeycloak(item: T): Observable<T>; - public delete(id: string): Observable<StateResource<unknown>> { + public delete(id: string): Observable<StateResource<void>> { return this.handleLoading(this._deleteInKeycloak(id)); } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts index a61b437b5e..fad1b24d54 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.spec.ts @@ -51,7 +51,7 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { describe('template', () => { describe('organisations einheit delete dialog', () => { it('should exist', () => { - const stateResource: StateResource<unknown> = createEmptyStateResource(); + const stateResource: StateResource<void> = createEmptyStateResource(); component.deleteStateResource$ = of(stateResource); component.organisationsEinheitName = dialogData.organisationsEinheitName; @@ -104,10 +104,10 @@ describe('OrganisationsEinheitDeleteDialogContainerComponent', () => { }); describe('delete', () => { - const stateResource: StateResource<unknown> = createEmptyStateResource(); - const stateResource$: Observable<StateResource<unknown>> = of(stateResource); - const loadingStateResource: StateResource<unknown> = createEmptyStateResource(true); - const loadingStateResource$: Observable<StateResource<unknown>> = of(loadingStateResource); + const stateResource: StateResource<void> = createEmptyStateResource(); + const stateResource$: Observable<StateResource<void>> = of(stateResource); + const loadingStateResource: StateResource<void> = createEmptyStateResource(true); + const loadingStateResource$: Observable<StateResource<void>> = of(loadingStateResource); beforeEach(() => { organisationsEinheitService.delete.mockReturnValue(stateResource$); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts index c870025c8a..256610e511 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts @@ -31,19 +31,20 @@ export class OrganisationsEinheitDeleteDialogContainerComponent { this.organisationsEinheitId = this.dialogData.organisationsEinheitId; } - public deleteStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); + public deleteStateResource$: Observable<StateResource<void>> = of(createEmptyStateResource<void>()); public closeDialog(): void { this.dialogService.closeAll(); } public delete(): void { - this.deleteStateResource$ = this.organisationsEinheitService - .delete(this.organisationsEinheitId) - .pipe(tap((stateResource: StateResource<unknown>) => this.closeDialogOnDeleteDone(stateResource))); + this.deleteStateResource$ = this.organisationsEinheitService.delete(this.organisationsEinheitId).pipe( + tap(console.info), + tap((stateResource: StateResource<void>) => this.closeDialogOnDeleteDone(stateResource)), + ); } - private closeDialogOnDeleteDone(stateResource: StateResource<unknown>): void { + private closeDialogOnDeleteDone(stateResource: StateResource<void>): void { if (isNotLoading(stateResource)) { this.dialogService.closeAll(); } diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts index dc175e5e96..5099b902cc 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.spec.ts @@ -58,7 +58,7 @@ describe('OrganisationsEinheitDeleteDialogComponent', () => { }); it('should have inputs', () => { - const stateResource: StateResource<unknown> = createEmptyStateResource(); + const stateResource: StateResource<void> = createEmptyStateResource(); component.deleteStateResource = stateResource; fixture.detectChanges(); diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts index fed45f5109..bf433fea87 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component.ts @@ -11,7 +11,7 @@ import { ButtonComponent } from '@ods/system'; }) export class OrganisationsEinheitDeleteDialogComponent { @Input() organisationsEinheitName: string; - @Input() deleteStateResource: StateResource<unknown>; + @Input() deleteStateResource: StateResource<void>; @Output() cancel: EventEmitter<void> = new EventEmitter<void>(); @Output() delete: EventEmitter<void> = new EventEmitter<void>(); -- GitLab From 994eadc5fbca651892da91454981ed88ab1ed4dc Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 12:28:13 +0100 Subject: [PATCH 12/18] OZG-7507 move interface to model --- .../src/lib/organisations-einheit.model.ts | 5 +++++ ...ations-einheit-delete-dialog-container.component.ts | 10 ++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts index 3a93c42e6b..5fac205bca 100644 --- a/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts +++ b/alfa-client/libs/admin/organisations-einheit-shared/src/lib/organisations-einheit.model.ts @@ -26,3 +26,8 @@ export interface AdminOrganisationsEinheit { name: string; attributes: { [key: string]: string[] }; } + +export interface OrganisationsEinheitDeleteDialogData { + organisationsEinheitName: string; + organisationsEinheitId: string; +} diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts index 256610e511..5ad4b5ec78 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-delete-dialog-container/organisations-einheit-delete-dialog-container.component.ts @@ -1,4 +1,7 @@ -import { AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared'; +import { + AdminOrganisationsEinheitService, + OrganisationsEinheitDeleteDialogData, +} from '@admin-client/organisations-einheit-shared'; import { createEmptyStateResource, isNotLoading, StateResource } from '@alfa-client/tech-shared'; import { OzgcloudDialogService } from '@alfa-client/ui'; import { DIALOG_DATA } from '@angular/cdk/dialog'; @@ -7,11 +10,6 @@ import { Component, inject } from '@angular/core'; import { Observable, of, tap } from 'rxjs'; import { OrganisationsEinheitDeleteDialogComponent } from './organisations-einheit-delete-dialog/organisations-einheit-delete-dialog.component'; -export interface OrganisationsEinheitDeleteDialogData { - organisationsEinheitName: string; - organisationsEinheitId: string; -} - @Component({ selector: 'admin-organisations-einheit-delete-dialog-container', standalone: true, -- GitLab From a915b3b20e533f824f9df1a82ed1d02323c532b2 Mon Sep 17 00:00:00 2001 From: Alexander Reifschneider <alexander.reifschneider@mgm-tp.com> Date: Fri, 28 Feb 2025 13:55:06 +0100 Subject: [PATCH 13/18] OZG-7507 Add missing style --- .../organisations-einheit-list.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html index a990131625..cb289ca1d9 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html @@ -26,7 +26,7 @@ <ods-list data-test-id="organisations-einheit-list"> @for (organisationsEinheit of organisationsEinheitList; track $index) { <ods-list-item [attr.data-test-id]="(organisationsEinheit.name | convertForDataTest) + '-organisation-item'"> - <div class="space-between flex w-full"> + <div class="space-between flex w-full items-center"> <dl class="flex-1 basis-3/4 font-semibold"> <dt class="sr-only">Name</dt> <dd data-test-id="organisations-einheit-name">{{ organisationsEinheit.name }}</dd> -- GitLab From d42d528d418ef5cdf6acf91a2784f47082a19d7d Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Fri, 28 Feb 2025 14:36:14 +0100 Subject: [PATCH 14/18] OZG-7507 fix unit test Merge conflict error. --- .../src/lib/open-dialog-button/open-dialog-button.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts index cb85d5517d..59a024a94b 100644 --- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts +++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts @@ -38,7 +38,7 @@ export class OpenDialogButtonComponent { @Input() size: ButtonVariants['size']; public open(): void { - this.dialogService.openInContext(this._createComponent().instance.constructor, this.viewContainerRef); + this.dialogService.openInContext(this._createComponent().instance.constructor, this.viewContainerRef, this.dialogData); } _createComponent(): ComponentRef<any> { -- GitLab From 3a1a3fd1160283862dc780990941da83fe5530a0 Mon Sep 17 00:00:00 2001 From: Martin <git@mail.de> Date: Fri, 28 Feb 2025 15:32:43 +0100 Subject: [PATCH 15/18] OZG-7507 add data-test-class to components --- .../src/lib/open-dialog-button/open-dialog-button.component.ts | 2 ++ .../libs/design-system/src/lib/button/button.component.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts index 833c45112b..ae0e20c3b0 100644 --- a/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts +++ b/alfa-client/libs/design-component/src/lib/open-dialog-button/open-dialog-button.component.ts @@ -16,6 +16,7 @@ import { first } from 'rxjs'; [text]="label" [size]="size" [dataTestId]="dataTestId" + [dataTestClass]="dataTestClass" data-test-id="open-dialog" > <ng-container icon> @@ -34,6 +35,7 @@ export class OpenDialogButtonComponent { @Input() label: string; @Input() dataTestId: string; + @Input() dataTestClass: string; @Input() variant: ButtonVariants['variant'] = 'primary'; @Input() dialogData: any; @Input() size: ButtonVariants['size']; diff --git a/alfa-client/libs/design-system/src/lib/button/button.component.ts b/alfa-client/libs/design-system/src/lib/button/button.component.ts index c0f7892c3c..47e76172ad 100644 --- a/alfa-client/libs/design-system/src/lib/button/button.component.ts +++ b/alfa-client/libs/design-system/src/lib/button/button.component.ts @@ -96,6 +96,7 @@ export type ButtonVariants = VariantProps<typeof buttonVariants>; [attr.aria-disabled]="isDisabled" [attr.aria-label]="text" [attr.data-test-id]="dataTestId" + [attr.data-test-class]="dataTestClass" (click)="clickEmitter.emit()" > <ng-content *ngIf="!isLoading" select="[icon]"></ng-content> @@ -106,6 +107,7 @@ export type ButtonVariants = VariantProps<typeof buttonVariants>; export class ButtonComponent { @Input() text: string = ''; @Input() dataTestId: string = ''; + @Input() dataTestClass: string = ''; @Input() disabled: boolean = false; @Input() isLoading: boolean = false; @Input({ transform: booleanAttribute }) destructive: boolean = false; -- GitLab From 2977c4fed5dfe02d6f9c847b23182ca016f8d327 Mon Sep 17 00:00:00 2001 From: Martin <git@mail.de> Date: Fri, 28 Feb 2025 15:33:31 +0100 Subject: [PATCH 16/18] OZG-7507 adjust component data-test-id and test --- .../organisations-einheit-list.component.html | 3 ++- .../organisations-einheit-list.component.spec.ts | 4 ++-- alfa-client/libs/tech-shared/test/data-test.ts | 7 +++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html index a990131625..b09ebf9501 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.html @@ -35,7 +35,8 @@ [tooltip]="'Organisationseinheit löschen'" variant="ghost" size="fit" - dataTestId="delete-button" + dataTestClass="delete-button" + data-test-id="delete-organisations-einheit-dialog-button" [dialogData]="{ organisationsEinheitName: organisationsEinheit.name, organisationsEinheitId: organisationsEinheit.id }" > <ods-delete-icon icon /> diff --git a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts index 75e0c4dd8e..c016c3c9c8 100644 --- a/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts +++ b/alfa-client/libs/admin/organisations-einheit/src/lib/organisations-einheit-container/organisations-einheit-list/organisations-einheit-list.component.spec.ts @@ -29,7 +29,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { OpenDialogButtonComponent } from '@ods/component'; import { ExclamationIconComponent, ListComponent, ListItemComponent } from '@ods/system'; -import { getConvertedDataTestIdOf, getDataTestIdAttributeOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { getConvertedDataTestIdOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; import { createAdminOrganisationsEinheit } from '../../../../../organisations-einheit-shared/src/test/organisations-einheit'; import { OrganisationsEinheitListComponent } from './organisations-einheit-list.component'; @@ -40,7 +40,7 @@ describe('OrganisationsEinheitListComponent', () => { const listSelector: string = getDataTestIdOf('organisations-einheit-list'); const listItemSuffux: string = '-organisation-item'; - const deleteButtonTestId: string = getDataTestIdAttributeOf('delete-button'); + const deleteButtonTestId: string = getDataTestIdOf('delete-organisations-einheit-dialog-button'); beforeEach(async () => { await TestBed.configureTestingModule({ diff --git a/alfa-client/libs/tech-shared/test/data-test.ts b/alfa-client/libs/tech-shared/test/data-test.ts index 795b2dee30..c4fbe01458 100644 --- a/alfa-client/libs/tech-shared/test/data-test.ts +++ b/alfa-client/libs/tech-shared/test/data-test.ts @@ -35,10 +35,9 @@ export function getDataTestIdOf(value: string): string { return `[data-test-id="${value}"]`; } +/** + * @deprecated use getDataTestIfOf instead and a direct data-test-id at the component + */ export function getDataTestIdAttributeOf(value: string): string { return `[dataTestId="${value}"]`; } - -export function getDynamicDataTestIdAttributOf(value: string): string { - return `[ng-reflect-data-test-id="${value}"]`; -} -- GitLab From e3729e3d58a65b75c412d3a0089292ea8fae53f6 Mon Sep 17 00:00:00 2001 From: Martin <git@mail.de> Date: Fri, 28 Feb 2025 15:34:18 +0100 Subject: [PATCH 17/18] OZG-7507 create delete organisationsEinheit E2E Test; adjust test component structure --- .../organisationseinheiten.e2e.component.ts | 49 ++++++++++++--- .../organisations-einheit.cy.ts | 53 ++++++++++++++++ .../organisations-einheiten-page.cy.ts | 61 +++++++++++++++++++ .../organisationseinheiten-hinzufuegen.cy.ts | 48 --------------- .../organisationseinheiten-laden.cy.ts | 56 ----------------- .../organisations-einheit.executor.ts | 34 +++++++++++ .../organisations-einheit.helper.ts | 19 ++++++ .../organisations-einheit.navigator.ts | 21 +++++++ .../organisations-einheit.verifier.ts | 17 ++++++ .../src/model/organisations-einheit.ts | 4 +- .../admin-e2e/src/page-objects/header.po.ts | 4 +- .../admin-e2e/src/page-objects/login.po.ts | 1 + .../page-objects/organisations-einheit.po.ts | 14 +++++ 13 files changed, 265 insertions(+), 116 deletions(-) create mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts create mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts delete mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts delete mode 100644 alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts create mode 100644 alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts create mode 100644 alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts diff --git a/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts b/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts index bfdf6b624d..ac3917c2dd 100644 --- a/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts +++ b/alfa-client/apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component.ts @@ -21,21 +21,52 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +export class OrganisationsEinheitListE2EComponent { + private readonly root: string = 'organisations-einheit-list'; + + public getRoot(): Cypress.Chainable<Element> { + return cy.getTestElement(this.root); + } + + public getListItem(name: string): OrganisationsEinheitListItemE2EComponent { + return new OrganisationsEinheitListItemE2EComponent(name); + } +} + +export class OrganisationsEinheitListItemE2EComponent { + private root: string; -export class OrganisationsEinheitenE2EComponent { - private readonly organisationsEinheitenList: string = 'organisations-einheit-list'; - private readonly organisationsEinheitHinzufuegen: string = 'add-organisationseinheit-button'; private readonly organisationsEinheitItemSuffix: string = '-organisation-item'; + private readonly deleteButton: string = 'delete-button'; + + constructor(name: string) { + this.root = name; + } + + public getRoot(): Cypress.Chainable<Element> { + return cy.getTestElement(this.root + this.organisationsEinheitItemSuffix); + } + + public getDeleteButton(): Cypress.Chainable<Element> { + return this.getRoot().findTestElementWithClass(this.deleteButton); + } +} + +export class OrganisationsEinheitDeleteDialogE2EComponent { + private readonly root: string = 'organisations-einheit-delete-dialog'; + + private readonly deleteButton: string = 'dialog-delete-button'; + private readonly cancelButton: string = 'dialog-cancel-button'; - public getOrganisationsEinheitList(): Cypress.Chainable<Element> { - return cy.getTestElement(this.organisationsEinheitenList); + public getRoot(): Cypress.Chainable<Element> { + return cy.getTestElement(this.root); } - public getOrganisationsEinheitHinzufuegenButton(): Cypress.Chainable<Element> { - return cy.getTestElement(this.organisationsEinheitHinzufuegen); + public getDeleteButton(): Cypress.Chainable<Element> { + return cy.getTestElement(this.deleteButton); } - public getListItem(name: string) { - return cy.getTestElement(name + this.organisationsEinheitItemSuffix); + public getCancelButton(): Cypress.Chainable<Element> { + return cy.getTestElement(this.cancelButton); } } diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts new file mode 100644 index 0000000000..2f52b48806 --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheit.cy.ts @@ -0,0 +1,53 @@ +import { E2EOrganisationsEinheitHelper } from 'apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper'; +import { E2EOrganisationsEinheitVerifier } from 'apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier'; +import { OrganisationsEinheitPage } from 'apps/admin-e2e/src/page-objects/organisations-einheit.po'; +import { ZustaendigeStelleDialogE2EComponent } from '../../../components/zustaendige-stelle/zustaendige-stelle-dialog.e2e.component'; +import { exist } from '../../../support/cypress.util'; +import { loginAsAriane } from '../../../support/user-util'; + +describe('Organisationseinheit', () => { + const organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage(); + + const organisationsEinheitHelper: E2EOrganisationsEinheitHelper = new E2EOrganisationsEinheitHelper(); + const organisationsEinheitVerifier: E2EOrganisationsEinheitVerifier = new E2EOrganisationsEinheitVerifier(); + + const zustaendigeStelleSearchComponent: ZustaendigeStelleDialogE2EComponent = new ZustaendigeStelleDialogE2EComponent(); + + const organisationsEinheit: string = 'Wasserwerk - Hamburg Wasser - Hamburger Stadtentwässerung'; + + before(() => { + loginAsAriane(); + }); + + describe('hinzufügen', () => { + it('should show search dialog on add button click', () => { + organisationsEinheitHelper.openOrganisationsEinheitPage(); + + organisationsEinheitPage.getAddButton().click(); + + exist(zustaendigeStelleSearchComponent.getZustaendigeStelleForm()); + }); + + it('should find at least one organisationseinheit on search', () => { + zustaendigeStelleSearchComponent.enterSearchTerm(organisationsEinheit); + + zustaendigeStelleSearchComponent.expectNumberOfEntriesToBeGreaterThan(1); + }); + + it('should show organisationseinheit in list', () => { + organisationsEinheitHelper.addOrganisationsEinheit(organisationsEinheit); + + organisationsEinheitVerifier.verifyOrganisationsEinheitInList(organisationsEinheit); + }); + }); + + describe('löschen', () => { + it('should not show entry in list', () => { + organisationsEinheitHelper.openOrganisationsEinheitPage(); + + organisationsEinheitHelper.deleteOrganisationsEinheit(organisationsEinheit); + + organisationsEinheitVerifier.verifyOrganisationsEinheitNotInList(organisationsEinheit); + }); + }); +}); diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts new file mode 100644 index 0000000000..c17724c86b --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisations-einheiten-page.cy.ts @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +import { OrganisationsEinheitListE2EComponent } from 'apps/admin-e2e/src/components/organisationseinheiten/organisationseinheiten.e2e.component'; +import { E2EOrganisationsEinheitHelper } from 'apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper'; +import { OrganisationsEinheitE2E } from 'apps/admin-e2e/src/model/organisations-einheit'; +import { OrganisationsEinheitPage } from 'apps/admin-e2e/src/page-objects/organisations-einheit.po'; +import { exist } from '../../../support/cypress.util'; +import { loginAsAriane } from '../../../support/user-util'; + +describe('Organisationsheiten page', () => { + const organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage(); + + const organisationsEinheitHelper: E2EOrganisationsEinheitHelper = new E2EOrganisationsEinheitHelper(); + + const organisationsEinheitList: OrganisationsEinheitListE2EComponent = new OrganisationsEinheitListE2EComponent(); + + before(() => { + loginAsAriane(); + }); + + it('should show list', () => { + organisationsEinheitHelper.openOrganisationsEinheitPage(); + + exist(organisationsEinheitPage.getList().getRoot()); + }); + + it('should show add button', () => { + organisationsEinheitHelper.openOrganisationsEinheitPage(); + + exist(organisationsEinheitPage.getAddButton()); + }); + + it('should show default (Bauamt, Fundstelle, Denkmalpflege) entries', () => { + organisationsEinheitHelper.openOrganisationsEinheitPage(); + + exist(organisationsEinheitList.getListItem(OrganisationsEinheitE2E.BAUAMT).getRoot()); + exist(organisationsEinheitList.getListItem(OrganisationsEinheitE2E.FUNDSTELLE).getRoot()); + exist(organisationsEinheitList.getListItem(OrganisationsEinheitE2E.DENKMALPFLEGE).getRoot()); + }); +}); diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts deleted file mode 100644 index c88d54bf3d..0000000000 --- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-hinzufuegen.cy.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { convertToDataTestId } from 'apps/admin-e2e/src/support/tech-util'; -import { OrganisationsEinheitenE2EComponent } from '../../../components/organisationseinheiten/organisationseinheiten.e2e.component'; -import { ZustaendigeStelleDialogE2EComponent } from '../../../components/zustaendige-stelle/zustaendige-stelle-dialog.e2e.component'; -import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; -import { exist } from '../../../support/cypress.util'; -import { loginAsAriane } from '../../../support/user-util'; - -describe('Organisationseinheiten', () => { - const mainPage: MainPage = new MainPage(); - const organisationsEinheitenComponent: OrganisationsEinheitenE2EComponent = new OrganisationsEinheitenE2EComponent(); - const zustaendigeStelleSearchComponent: ZustaendigeStelleDialogE2EComponent = new ZustaendigeStelleDialogE2EComponent(); - - const searchTerm: string = 'Hamburg'; - - before(() => { - loginAsAriane(); - }); - - it('should show table with Organisationseinheiten', () => { - waitForSpinnerToDisappear(); - mainPage.clickOrganisationsEinheitenNavigationItem(); - - exist(organisationsEinheitenComponent.getOrganisationsEinheitHinzufuegenButton()); - }); - - it('should show button to add Organisationseinheit', () => { - exist(organisationsEinheitenComponent.getOrganisationsEinheitHinzufuegenButton()); - }); - - it('should show search Organisationseinheit dialog', () => { - organisationsEinheitenComponent.getOrganisationsEinheitHinzufuegenButton().click(); - - exist(zustaendigeStelleSearchComponent.getZustaendigeStelleForm()); - }); - - it('should find at least one Organisationseinheit', () => { - zustaendigeStelleSearchComponent.enterSearchTerm(searchTerm); - - zustaendigeStelleSearchComponent.expectNumberOfEntriesToBeGreaterThan(1); - }); - - it('should add first Organisationseinheit', () => { - zustaendigeStelleSearchComponent.getZustaendigeStelleTitle(0).then((name: string) => { - zustaendigeStelleSearchComponent.clickFoundItem(0); - exist(organisationsEinheitenComponent.getListItem(convertToDataTestId(name))); - }); - }); -}); diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts deleted file mode 100644 index 2b8eaeb70a..0000000000 --- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/organisationseinheiten/organisationseinheiten-laden.cy.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -import { OrganisationsEinheitenE2EComponent } from '../../../components/organisationseinheiten/organisationseinheiten.e2e.component'; -import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; -import { exist } from '../../../support/cypress.util'; -import { loginAsAriane } from '../../../support/user-util'; - -describe('Organisationsheiten list', () => { - const mainPage: MainPage = new MainPage(); - const organisationsEinheitenTab: OrganisationsEinheitenE2EComponent = new OrganisationsEinheitenE2EComponent(); - - before(() => { - loginAsAriane(); - }); - - it('should show Organisationseinheiten list', () => { - waitForSpinnerToDisappear(); - mainPage.clickOrganisationsEinheitenNavigationItem(); - waitForSpinnerToDisappear(); - - exist(organisationsEinheitenTab.getOrganisationsEinheitList()); - }); - - it('should show entry for Bauamt', () => { - exist(organisationsEinheitenTab.getListItem('Bauamt')); - }); - - it('should show entry for Fundstelle', () => { - exist(organisationsEinheitenTab.getListItem('Fundstelle')); - }); - - it('should show entry for Denkmalpflege', () => { - exist(organisationsEinheitenTab.getListItem('Denkmalpflege')); - }); -}); diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts new file mode 100644 index 0000000000..a89ad1f958 --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.executor.ts @@ -0,0 +1,34 @@ +import { + OrganisationsEinheitDeleteDialogE2EComponent, + OrganisationsEinheitListE2EComponent, +} from '../../components/organisationseinheiten/organisationseinheiten.e2e.component'; +import { ZustaendigeStelleDialogE2EComponent } from '../../components/zustaendige-stelle/zustaendige-stelle-dialog.e2e.component'; +import { OrganisationsEinheitPage } from '../../page-objects/organisations-einheit.po'; +import { exist } from '../../support/cypress.util'; +import { convertToDataTestId } from '../../support/tech-util'; + +export class E2EOrganisationsEinheitExecutor { + private readonly organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage(); + private readonly organisationsEinheitList: OrganisationsEinheitListE2EComponent = this.organisationsEinheitPage.getList(); + + private readonly deleteDialog: OrganisationsEinheitDeleteDialogE2EComponent = + new OrganisationsEinheitDeleteDialogE2EComponent(); + + private readonly zustaendigeStelleSearchComponent: ZustaendigeStelleDialogE2EComponent = + new ZustaendigeStelleDialogE2EComponent(); + + public addOrganisationsEinheit(name: string): void { + //TODO von index auf Name umstellen + this.zustaendigeStelleSearchComponent + .getZustaendigeStelleTitle(0) + .then((name: string) => this.zustaendigeStelleSearchComponent.clickFoundItem(0)); + exist(this.organisationsEinheitList.getRoot()); + } + + public deleteOrganisationsEinheit(name: string): void { + this.organisationsEinheitList.getListItem(convertToDataTestId(name)).getDeleteButton().click(); + exist(this.deleteDialog.getRoot()); + this.deleteDialog.getDeleteButton().click(); + exist(this.organisationsEinheitList.getRoot()); + } +} diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts new file mode 100644 index 0000000000..339793cde8 --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.helper.ts @@ -0,0 +1,19 @@ +import { E2EOrganisationsEinheitExecutor } from './organisations-einheit.executor'; +import { E2EOrganisationsEinheitNavigator } from './organisations-einheit.navigator'; + +export class E2EOrganisationsEinheitHelper { + private readonly navigator: E2EOrganisationsEinheitNavigator = new E2EOrganisationsEinheitNavigator(); + private readonly executor: E2EOrganisationsEinheitExecutor = new E2EOrganisationsEinheitExecutor(); + + public openOrganisationsEinheitPage(): void { + this.navigator.openOrganisationsEinheitListPage(); + } + + public addOrganisationsEinheit(name: string): void { + this.executor.addOrganisationsEinheit(name); + } + + public deleteOrganisationsEinheit(name: string): void { + this.executor.deleteOrganisationsEinheit(name); + } +} diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts new file mode 100644 index 0000000000..6274ee80d4 --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.navigator.ts @@ -0,0 +1,21 @@ +import { OrganisationsEinheitListE2EComponent } from '../../components/organisationseinheiten/organisationseinheiten.e2e.component'; +import { MainPage } from '../../page-objects/main.po'; +import { OrganisationsEinheitPage } from '../../page-objects/organisations-einheit.po'; +import { exist } from '../../support/cypress.util'; + +export class E2EOrganisationsEinheitNavigator { + private readonly mainPage: MainPage = new MainPage(); + + private readonly organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage(); + private readonly organisationsEinheitList: OrganisationsEinheitListE2EComponent = this.organisationsEinheitPage.getList(); + + public openOrganisationsEinheitListPage(): void { + this.navigateToDomain(); + this.mainPage.getOrganisationEinheitNavigationItem().click(); + exist(this.organisationsEinheitList.getRoot()); + } + + private navigateToDomain(): void { + this.mainPage.getHeader().getLogo().click(); + } +} diff --git a/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts new file mode 100644 index 0000000000..cb1b430216 --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/helper/organisations-einheit/organisations-einheit.verifier.ts @@ -0,0 +1,17 @@ +import { OrganisationsEinheitListE2EComponent } from '../../components/organisationseinheiten/organisationseinheiten.e2e.component'; +import { OrganisationsEinheitPage } from '../../page-objects/organisations-einheit.po'; +import { exist, notExist } from '../../support/cypress.util'; +import { convertToDataTestId } from '../../support/tech-util'; + +export class E2EOrganisationsEinheitVerifier { + private readonly organisationsEinheitPage: OrganisationsEinheitPage = new OrganisationsEinheitPage(); + private readonly organisationsEinheitList: OrganisationsEinheitListE2EComponent = this.organisationsEinheitPage.getList(); + + public verifyOrganisationsEinheitInList(name: string): void { + exist(this.organisationsEinheitList.getListItem(convertToDataTestId(name)).getRoot()); + } + + public verifyOrganisationsEinheitNotInList(name: string): void { + notExist(this.organisationsEinheitList.getListItem(convertToDataTestId(name)).getRoot()); + } +} diff --git a/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts b/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts index 9870f7e3f1..311c1bfd5c 100644 --- a/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts +++ b/alfa-client/apps/admin-e2e/src/model/organisations-einheit.ts @@ -1,5 +1,7 @@ export enum OrganisationsEinheitE2E { - ORDNUNGSAMT = 'Ordnungsamt', + BAUAMT = 'Bauamt', DENKMALPFLEGE = 'Denkmalpflege', + FUNDSTELLE = 'Fundstelle', + ORDNUNGSAMT = 'Ordnungsamt', WIRTSCHAFTSFOERDERUNG = 'Wirtschaftsförderung', } diff --git a/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts b/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts index fb87e566ca..60fc24b0d4 100644 --- a/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts +++ b/alfa-client/apps/admin-e2e/src/page-objects/header.po.ts @@ -24,13 +24,13 @@ import { CurrentUserProfileE2EComponent } from '../components/user-profile/current-user-profile.component.e2e'; import { UserSettingsE2EComponent } from '../components/user-settings/user-settings.component.e2e'; +//TODO Zu den Componenten packen, nicht zu den page-objects export class HeaderE2EComponent { private readonly locatorLogo: string = 'logo-link'; private readonly locatorRoot: string = 'header'; private readonly userSettings: UserSettingsE2EComponent = new UserSettingsE2EComponent(); - private readonly currentUserProfile: CurrentUserProfileE2EComponent = - new CurrentUserProfileE2EComponent(); + private readonly currentUserProfile: CurrentUserProfileE2EComponent = new CurrentUserProfileE2EComponent(); public getRoot() { return cy.getTestElement(this.locatorRoot); diff --git a/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts b/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts index 73005caaf6..48a03c246c 100644 --- a/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts +++ b/alfa-client/apps/admin-e2e/src/page-objects/login.po.ts @@ -1,3 +1,4 @@ +//TODO Das sollte eher eine Component als eine Page sein export class LoginPage { private readonly locatorLogin: string = '#kc-login'; private readonly locatorBarrierefreiheitLink: string = '#kc-barrierefreiheit'; diff --git a/alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts b/alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts new file mode 100644 index 0000000000..b37d9a9d3f --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/page-objects/organisations-einheit.po.ts @@ -0,0 +1,14 @@ +import { OrganisationsEinheitListE2EComponent } from '../components/organisationseinheiten/organisationseinheiten.e2e.component'; + +export class OrganisationsEinheitPage { + private readonly addButton: string = 'add-organisationseinheit-button'; + private readonly list: OrganisationsEinheitListE2EComponent = new OrganisationsEinheitListE2EComponent(); + + public getAddButton(): Cypress.Chainable<Element> { + return cy.getTestElement(this.addButton); + } + + public getList(): OrganisationsEinheitListE2EComponent { + return this.list; + } +} -- GitLab From 7e874d408edf1104733fce3b4844ad4f6993bcda Mon Sep 17 00:00:00 2001 From: sebo <sebastian.bergandy@external.mgm-cp.com> Date: Sat, 1 Mar 2025 16:58:32 +0100 Subject: [PATCH 18/18] OZG-7507 fix e2e test --- .../main-tests/app/user-profile-menu.cy.ts | 11 +++++++- .../apps/admin-e2e/src/support/linkrels.ts | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 alfa-client/apps/admin-e2e/src/support/linkrels.ts diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts index 80d2884a5b..19852a5277 100644 --- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts +++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/app/user-profile-menu.cy.ts @@ -21,19 +21,28 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +import { getUrl } from '@ngxp/rest'; +import { HttpMethodE2E } from '../../../model/util'; import { HeaderE2EComponent } from '../../../page-objects/header.po'; import { MainPage } from '../../../page-objects/main.po'; +import { getBaseUrl, intercept, waitOfInterceptor } from '../../../support/cypress-helper'; import { exist, shouldHaveAttribute } from '../../../support/cypress.util'; +import { ApiRootLinkRelE2E } from '../../../support/linkrels'; import { loginAsAriane } from '../../../support/user-util'; describe('User Profile Menu', () => { const mainPage: MainPage = new MainPage(); const header: HeaderE2EComponent = mainPage.getHeader(); - const documentationLink: string = 'http://dummy-leitfaden.url'; + let documentationLink: string = ''; before(() => { + const interceptor: string = 'getApiRoot'; + intercept(HttpMethodE2E.GET, `${getBaseUrl()}/api`).as(interceptor); loginAsAriane(); + waitOfInterceptor(interceptor).then( + (interception) => (documentationLink = getUrl(interception?.response?.body, ApiRootLinkRelE2E.DOCUMENTATIONS)), + ); }); describe('open user profile menu', () => { diff --git a/alfa-client/apps/admin-e2e/src/support/linkrels.ts b/alfa-client/apps/admin-e2e/src/support/linkrels.ts new file mode 100644 index 0000000000..4891aa61e1 --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/support/linkrels.ts @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +export enum ApiRootLinkRelE2E { + DOCUMENTATIONS = 'documentations', +} -- GitLab