diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html index 54add448551525bd2ece9b4c74c838430b68972b..e180bccebc7c5139936430630b94d8b40fbe4f21 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.html @@ -1,5 +1,5 @@ <ods-button-with-spinner - (clickEmitter)="delete()" + (clickEmitter)="openDeleteDialog()" variant="outline" text="Löschen" dataTestId="delete-button" diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts index 71daffb081b873e23d68a0fa5adf96239da4a6c9..cc2b06b8107649c5e49586a99ce3a8d14cf7252f 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.spec.ts @@ -5,7 +5,7 @@ import { DialogService } from '@alfa-client/ui'; import { ButtonWithSpinnerComponent } from '@ods/component'; import { MockComponent } from 'ng-mocks'; import { getDataTestIdAttributeOf } from '../../../../../../tech-shared/test/data-test'; -import { UserFormDeleteDialogComponent } from '../user-form-delete-dialog/user-form-delete-dialog.component'; +import { UserFormDeleteDialogContainerComponent } from '../user-form-delete-dialog-container/user-form-delete-dialog-container.component'; import { UserFormDeleteButtonComponent } from './user-form-delete-button.component'; describe('UserFormDeleteButtonComponent', () => { @@ -37,9 +37,9 @@ describe('UserFormDeleteButtonComponent', () => { describe('component', () => { describe('delete', () => { it('should open dialog', () => { - component.delete(); + component.openDeleteDialog(); - expect(dialogService.open).toHaveBeenCalledWith(UserFormDeleteDialogComponent); + expect(dialogService.open).toHaveBeenCalledWith(UserFormDeleteDialogContainerComponent); }); }); }); @@ -50,12 +50,12 @@ describe('UserFormDeleteButtonComponent', () => { existsAsHtmlElement(fixture, deleteButton); }); - it('should call delete on click', () => { - component.delete = jest.fn(); + it('should open delete dialog on click', () => { + component.openDeleteDialog = jest.fn(); dispatchEventFromFixture(fixture, deleteButton, 'clickEmitter'); - expect(component.delete).toHaveBeenCalled(); + expect(component.openDeleteDialog).toHaveBeenCalled(); }); }); }); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts index abe8a9be6d38ed1443b8fca282cc1b0f1b6b41d0..7cbef8bf523992dd16a0dd070b3650bdde11ca2e 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-button/user-form-delete-button.component.ts @@ -1,7 +1,7 @@ import { DialogService } from '@alfa-client/ui'; import { Component, inject } from '@angular/core'; import { ButtonWithSpinnerComponent } from '@ods/component'; -import { UserFormDeleteDialogComponent } from '../user-form-delete-dialog/user-form-delete-dialog.component'; +import { UserFormDeleteDialogContainerComponent } from '../user-form-delete-dialog-container/user-form-delete-dialog-container.component'; @Component({ selector: 'admin-user-form-delete-button', @@ -12,7 +12,7 @@ import { UserFormDeleteDialogComponent } from '../user-form-delete-dialog/user-f export class UserFormDeleteButtonComponent { private readonly dialogService = inject(DialogService); - public delete(): void { - this.dialogService.openWidely(UserFormDeleteDialogComponent); + public openDeleteDialog(): void { + this.dialogService.openWidely(UserFormDeleteDialogContainerComponent); } } diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html new file mode 100644 index 0000000000000000000000000000000000000000..2e2466e86c47be1080b899ed4d92277eb3cb0263 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html @@ -0,0 +1,7 @@ +<admin-user-form-delete-dialog + [username]="getUsername()" + [deleteUserStateResource]="deleteUserStateResource$ | async" + (cancel)="closeDeleteDialog()" + (delete)="deleteUser()" + data-test-id="delete-dialog" +/> \ No newline at end of file diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..5a25c702488c11df6a470fb68eb4ac9d139d134f --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts @@ -0,0 +1,116 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { dispatchEventFromFixture, getMockComponent, Mock, mock } from '@alfa-client/test-utils'; +import { FormControl } from '@angular/forms'; +import { faker } from '@faker-js/faker/locale/de'; +import { of } from 'rxjs'; +import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test'; +import { createUserFormGroup } from '../../../../test/form'; +import { UserFormService } from '../user.formservice'; +import { UserFormDeleteDialogContainerComponent } from './user-form-delete-dialog-container.component'; +import { UserFormDeleteDialogComponent } from './user-form-delete-dialog/user-form-delete-dialog.component'; + +describe('UserFormDeleteDialogComponent', () => { + let component: UserFormDeleteDialogContainerComponent; + let fixture: ComponentFixture<UserFormDeleteDialogContainerComponent>; + + const deletDialogLocator: string = getDataTestIdOf('delete-dialog'); + + let formService: Mock<UserFormService>; + + beforeEach(async () => { + formService = mock(UserFormService); + formService = { + ...mock(UserFormService), + form: createUserFormGroup(), + } as any; + + await TestBed.configureTestingModule({ + imports: [UserFormDeleteDialogContainerComponent, UserFormDeleteDialogComponent], + providers: [{ provide: UserFormService, useValue: formService }], + }).compileComponents(); + + fixture = TestBed.createComponent(UserFormDeleteDialogContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('user form delete dialog', () => { + it('should exist', () => { + const username: string = faker.word.sample(); + const state: StateResource<unknown> = createEmptyStateResource(); + component.getUsername = jest.fn().mockReturnValue(username); + component.deleteUserStateResource$ = of(state); + + fixture.detectChanges(); + + const deleteDialog: UserFormDeleteDialogComponent = getMockComponent(fixture, UserFormDeleteDialogComponent); + expect(deleteDialog).toBeTruthy(); + expect(deleteDialog.username).toBe(username); + expect(deleteDialog.deleteUserStateResource).toBe(state); + }); + + it('should call closeDeteleDialog on emit cancel', () => { + component.closeDeleteDialog = jest.fn(); + + dispatchEventFromFixture(fixture, 'admin-user-form-delete-dialog', 'cancel'); + + expect(component.closeDeleteDialog).toHaveBeenCalled(); + }); + + it('should call deleteUser on emit delete', () => { + component.deleteUser = jest.fn(); + + dispatchEventFromFixture(fixture, deletDialogLocator, 'delete'); + + expect(component.deleteUser).toHaveBeenCalled(); + }); + }); + + describe('component', () => { + describe('getUsername', () => { + it('should return username', () => { + const username: string = faker.word.sample(); + jest.spyOn(formService.form as any, 'get').mockReturnValue(new FormControl(username)); + + const result: string = component.getUsername(); + + expect(result).toBe(username); + }); + }); + + describe('closeDeleteDialog', () => { + it('should call dialogService closeAll', () => { + component.dialogService.closeAll = jest.fn(); + + component.closeDeleteDialog(); + + expect(component.dialogService.closeAll).toHaveBeenCalled(); + }); + }); + + describe('deleteUser', () => { + it('should call userFormService delete ', () => { + formService.delete = jest.fn(); + + component.deleteUser(); + + expect(formService.delete).toHaveBeenCalled(); + }); + + it('should set deleteUserState', () => { + const state: StateResource<unknown> = createEmptyStateResource(); + formService.delete = jest.fn().mockReturnValue(state); + + component.deleteUser(); + + expect(component.deleteUserStateResource$).toBe(state); + }); + }); + }); +}); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..b5ff2dc0d480b561a567f4639e876700d0358b26 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts @@ -0,0 +1,35 @@ +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { DialogService } from '@alfa-client/ui'; +import { AsyncPipe } from '@angular/common'; +import { Component, inject } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { UserFormService } from '../user.formservice'; +import { UserFormDeleteDialogComponent } from './user-form-delete-dialog/user-form-delete-dialog.component'; + +@Component({ + selector: 'admin-user-form-delete-dialog-container', + standalone: true, + imports: [UserFormDeleteDialogComponent, AsyncPipe], + templateUrl: './user-form-delete-dialog-container.component.html', + providers: [UserFormService], +}) +export class UserFormDeleteDialogContainerComponent { + public readonly formService = inject(UserFormService); + public readonly dialogService = inject(DialogService); + + public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); + + protected readonly UserFormService = UserFormService; + + getUsername(): string { + return this.formService.form.get(UserFormService.USERNAME).value; + } + + public closeDeleteDialog(): void { + this.dialogService.closeAll(); + } + + public deleteUser(): void { + this.deleteUserStateResource$ = this.formService.delete(); + } +} diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html new file mode 100644 index 0000000000000000000000000000000000000000..b261057d5fabafbec8e598d12dcd0b737dd89676 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html @@ -0,0 +1,17 @@ +<p>Sind Sie sicher, dass sie {{username}} löschen möchten? Hinweis: Die zugewiesenen Vorgänge bleiben bestehen.</p> + +<div class="flex justify-between"> + <ods-button-with-spinner + (clickEmitter)="cancel.emit()" + text="Abbrechen" + dataTestId="dialog-abbrechen-button" + /> + + <ods-button-with-spinner + [stateResource]="deleteUserStateResource" + (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/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ca1f2ad8fff971770c45b30f98b433accfc31f3 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-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 { UserFormDeleteDialogComponent } from './user-form-delete-dialog.component'; + +describe('UserFormDeleteDialogComponent', () => { + let component: UserFormDeleteDialogComponent; + let fixture: ComponentFixture<UserFormDeleteDialogComponent>; + + const deleteButton: string = getDataTestIdAttributeOf('dialog-delete-button'); + const cancelButton: string = getDataTestIdAttributeOf('dialog-cancel-button'); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UserFormDeleteDialogComponent, ButtonWithSpinnerComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(UserFormDeleteDialogComponent); + 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.deleteUserStateResource = 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/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..f48fe94e09e8bc6bcf9daef759ab22d6a85403c1 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-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-user-form-delete-dialog', + standalone: true, + imports: [ButtonWithSpinnerComponent], + templateUrl: './user-form-delete-dialog.component.html', +}) +export class UserFormDeleteDialogComponent { + @Input() username: string; + @Input() deleteUserStateResource: StateResource<unknown>; + @Output() cancel: EventEmitter<void> = new EventEmitter<void>(); + @Output() delete: EventEmitter<void> = new EventEmitter<void>(); +} diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.html deleted file mode 100644 index 51bec494bace9b21847aadd47aaa5e0f0851e6d6..0000000000000000000000000000000000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.html +++ /dev/null @@ -1 +0,0 @@ -<p>user-form-delete-dialog works!</p> diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts deleted file mode 100644 index b7c73d98cad4c17a15bb8b87f0577da60ac8fbee..0000000000000000000000000000000000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UserFormDeleteDialogComponent } from './user-form-delete-dialog.component'; - -describe('UserFormDeleteDialogComponent', () => { - let component: UserFormDeleteDialogComponent; - let fixture: ComponentFixture<UserFormDeleteDialogComponent>; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [UserFormDeleteDialogComponent] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UserFormDeleteDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.ts deleted file mode 100644 index 42b9a86ebcad8d8284f82063fd80a3a3cad018cf..0000000000000000000000000000000000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog/user-form-delete-dialog.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'admin-user-form-delete-dialog', - standalone: true, - imports: [], - templateUrl: './user-form-delete-dialog.component.html', -}) -export class UserFormDeleteDialogComponent {}