From 22a00b59d1e33cc7d3869da14d8559a7d07ff1f3 Mon Sep 17 00:00:00 2001 From: Albert <Albert.Bruns@mgm-tp.com> Date: Tue, 25 Feb 2025 13:10:04 +0100 Subject: [PATCH] OZG-7620-7750 delete user in service --- .../src/lib/keycloak-formservice.spec.ts | 25 ++++ .../src/lib/keycloak-formservice.ts | 6 + .../src/lib/user.repository.spec.ts | 23 ++++ .../src/lib/user.repository.ts | 4 + .../user-shared/src/lib/user.service.spec.ts | 17 +++ .../admin/user-shared/src/lib/user.service.ts | 2 +- ...er-delete-dialog-container.component.html} | 2 +- ...-delete-dialog-container.component.spec.ts | 115 ++++++++++++++++++ .../user-delete-dialog-container.component.ts | 33 +++++ .../user-delete-dialog.component.html} | 0 .../user-delete-dialog.component.spec.ts} | 10 +- .../user-delete-dialog.component.ts} | 6 +- ...-delete-dialog-container.component.spec.ts | 64 ---------- ...-form-delete-dialog-container.component.ts | 23 ---- .../src/lib/user-form/user-form.component.ts | 4 +- .../lib/user-form/user.formservice.spec.ts | 31 ++++- .../src/lib/user-form/user.formservice.ts | 4 + 17 files changed, 269 insertions(+), 100 deletions(-) rename alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/{user-form-delete-dialog-container.component.html => user-delete-dialog-container.component.html} (84%) create mode 100644 alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.spec.ts create mode 100644 alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.ts rename alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/{user-form-delete-dialog/user-form-delete-dialog.component.html => user-delete-dialog/user-delete-dialog.component.html} (100%) rename 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 => user-delete-dialog/user-delete-dialog.component.spec.ts} (85%) rename alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/{user-form-delete-dialog/user-form-delete-dialog.component.ts => user-delete-dialog/user-delete-dialog.component.ts} (76%) delete mode 100644 alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts delete mode 100644 alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts index 7cd0b9ff96..41240e84f5 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.spec.ts @@ -201,6 +201,26 @@ describe('KeycloakFormService', () => { }); }); + describe('delete', () => { + const dummyStateResource: StateResource<Dummy> = createStateResource(createDummy()); + + beforeEach(() => { + service._doDelete = jest.fn().mockReturnValue(singleHot(dummyStateResource)); + }); + + it('should call do delete', () => { + service.delete(); + + expect(service._doDelete).toHaveBeenCalled(); + }); + + it('should return delete response', () => { + const deleteResponse: Observable<StateResource<Dummy>> = service.delete(); + + expect(deleteResponse).toBeObservable(singleCold(dummyStateResource)); + }); + }); + describe('patch', () => { const valueToPatch: Dummy = { name: 'newName' }; let patchFormSpy: jest.SpyInstance; @@ -282,6 +302,7 @@ export class TestKeycloakFormService extends KeycloakFormService<Dummy> { public static readonly FIELD: string = 'attribute'; public static SUBMIT_OBSERVABLE = () => of(createEmptyStateResource()); + public static DELETE_OBSERVABLE = () => of(createEmptyStateResource()); public static LOAD_OBSERVABLE = () => of(createEmptyStateResource()); _initForm(): FormGroup { @@ -301,4 +322,8 @@ export class TestKeycloakFormService extends KeycloakFormService<Dummy> { _doSubmit(): Observable<StateResource<Dummy>> { return TestKeycloakFormService.SUBMIT_OBSERVABLE(); } + + _doDelete(): Observable<StateResource<Dummy>> { + return TestKeycloakFormService.DELETE_OBSERVABLE(); + } } diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts index 49a2e6c84e..bc8b2ea245 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak-formservice.ts @@ -75,6 +75,12 @@ export abstract class KeycloakFormService<T> { abstract _doSubmit(): Observable<StateResource<T>>; + public delete(): Observable<StateResource<unknown>> { + return this._doDelete(); + } + + abstract _doDelete(): Observable<StateResource<unknown>>; + _patch(valueToPatch: T): void { this.form.reset(); diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.spec.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.spec.ts index ae9c56bedd..d0806e198e 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.spec.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.spec.ts @@ -415,6 +415,29 @@ describe('UserRepository', () => { }); }); + describe('deleteUser', () => { + const userId: string = faker.string.uuid(); + + beforeEach(() => { + kcAdminClient.users = <any>{ + del: jest.fn().mockReturnValue(Promise.resolve(undefined)), + }; + }); + + it('should call kcAdminClient users del', () => { + repository.deleteUser(userId); + + expect(kcAdminClient.users['del']).toHaveBeenCalledWith({ id: userId }); + }); + + it('should return void', (done) => { + repository.deleteUser(userId).subscribe((result: void) => { + expect(result).toBeUndefined(); + done(); + }); + }); + }); + describe('getUsers', () => { const user: User = createUser(); const userArray: User[] = [user, user, user]; diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.ts index 130176623c..a5df128a7d 100644 --- a/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.ts +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/user.repository.ts @@ -151,6 +151,10 @@ export class UserRepository { return throwError(() => new Error('An error occurred while saving the user.')); } + public deleteUser(userId: string): Observable<void> { + return from(this.kcAdminClient.users.del({ id: userId })); + } + public getUsers(): Observable<User[]> { return from(this.kcAdminClient.users.find()).pipe( map((userReps: UserRepresentation[]): User[] => diff --git a/alfa-client/libs/admin/user-shared/src/lib/user.service.spec.ts b/alfa-client/libs/admin/user-shared/src/lib/user.service.spec.ts index 28e7e8cce9..fce4d7d2cc 100644 --- a/alfa-client/libs/admin/user-shared/src/lib/user.service.spec.ts +++ b/alfa-client/libs/admin/user-shared/src/lib/user.service.spec.ts @@ -101,4 +101,21 @@ describe('UserService', () => { expect(user).toBeObservable(cold('ab', { a: createEmptyStateResource(true), b: userStateResource })); }); }); + + describe('deleteInKeycloak', () => { + it('should call userRepository delete', () => { + service._deleteInKeycloak(user.id); + + expect(repository.deleteUser).toHaveBeenCalledWith(user.id); + }); + + it('should return void', (done) => { + repository.deleteUser.mockReturnValue(of(undefined)); + + service._deleteInKeycloak(user.id).subscribe((result: void) => { + expect(result).toBeUndefined(); + done(); + }); + }); + }); }); diff --git a/alfa-client/libs/admin/user-shared/src/lib/user.service.ts b/alfa-client/libs/admin/user-shared/src/lib/user.service.ts index e927702221..d65103108f 100644 --- a/alfa-client/libs/admin/user-shared/src/lib/user.service.ts +++ b/alfa-client/libs/admin/user-shared/src/lib/user.service.ts @@ -47,7 +47,7 @@ export class UserService extends KeycloakResourceService<User> { } _deleteInKeycloak(id: string): Observable<void> { - throw new Error('Method not implemented.'); + return this.userRepository.deleteUser(id); } public getUserById(userId: string): Observable<StateResource<User>> { 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-delete-dialog-container.component.html similarity index 84% rename from alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.html rename to alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.html index 0bc0508176..367d0a4abb 100644 --- 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-delete-dialog-container.component.html @@ -1,4 +1,4 @@ -<admin-user-form-delete-dialog +<admin-user-delete-dialog [username]="formService.getUserName()" [deleteUserStateResource]="deleteUserStateResource$ | async" (delete)="deleteUser()" diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.spec.ts new file mode 100644 index 0000000000..7d31c2336f --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.spec.ts @@ -0,0 +1,115 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ROUTES } from '@admin-client/shared'; +import { NavigationService } from '@alfa-client/navigation-shared'; +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; +import { dispatchEventFromFixture, getMockComponent, Mock, mock } from '@alfa-client/test-utils'; +import { faker } from '@faker-js/faker/locale/de'; +import { Observable, of } from 'rxjs'; +import { getDataTestIdOf } from '../../../../../../tech-shared/test/data-test'; +import { singleColdCompleted } from '../../../../../../tech-shared/test/marbles'; +import { createUserFormGroup } from '../../../../test/form'; +import { UserFormService } from '../user.formservice'; +import { UserDeleteDialogContainerComponent } from './user-delete-dialog-container.component'; +import { UserDeleteDialogComponent } from './user-delete-dialog/user-delete-dialog.component'; + +describe('UserFormDeleteDialogComponent', () => { + let component: UserDeleteDialogContainerComponent; + let fixture: ComponentFixture<UserDeleteDialogContainerComponent>; + + const deletDialogLocator: string = getDataTestIdOf('delete-dialog'); + + let formService: Mock<UserFormService>; + let navigationService: Mock<NavigationService>; + + beforeEach(async () => { + formService = mock(UserFormService); + navigationService = mock(NavigationService); + formService = { + ...mock(UserFormService), + form: createUserFormGroup(), + delete: jest.fn(), + } as any; + + await TestBed.configureTestingModule({ + imports: [UserDeleteDialogContainerComponent, UserDeleteDialogComponent], + providers: [ + { provide: UserFormService, useValue: formService }, + { provide: NavigationService, useValue: navigationService }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(UserDeleteDialogContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('user form delete dialog', () => { + it('should be called', () => { + const username: string = faker.word.sample(); + const stateResource: StateResource<unknown> = createEmptyStateResource(); + formService.getUserName = jest.fn().mockReturnValue(username); + component.deleteUserStateResource$ = of(stateResource); + + fixture.detectChanges(); + + const deleteDialog: UserDeleteDialogComponent = getMockComponent(fixture, UserDeleteDialogComponent); + expect(deleteDialog.username).toBe(username); + expect(deleteDialog.deleteUserStateResource).toBe(stateResource); + }); + + it('should call deleteUser on emit delete', () => { + component.deleteUser = jest.fn(); + + dispatchEventFromFixture(fixture, deletDialogLocator, 'delete'); + + expect(component.deleteUser).toHaveBeenCalled(); + }); + }); + + describe('component', () => { + describe('deleteUser', () => { + const loadingStateResource: StateResource<unknown> = createEmptyStateResource(true); + const loadingStateResource$: Observable<StateResource<unknown>> = of(loadingStateResource); + const loadingDoneStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); + + it('should call formService.delete', () => { + formService.delete.mockReturnValue(loadingStateResource$); + + component.deleteUser(); + + expect(formService.delete).toHaveBeenCalled(); + }); + + it('should set deleteUserStateResource$', () => { + formService.delete.mockReturnValue(loadingStateResource$); + + component.deleteUser(); + + expect(component.deleteUserStateResource$).toBeObservable(singleColdCompleted(loadingStateResource)); + }); + + it('should not navigate on loading', () => { + formService.delete.mockReturnValue(loadingStateResource$); + + component.deleteUser(); + component.deleteUserStateResource$.subscribe(); + + expect(navigationService.navigate).not.toHaveBeenCalled(); + }); + + it('should navigate on delete success', () => { + formService.delete.mockReturnValue(loadingDoneStateResource$); + + component.deleteUser(); + component.deleteUserStateResource$.subscribe(); + + expect(navigationService.navigate).toHaveBeenCalledWith(ROUTES.BENUTZER); + }); + }); + }); +}); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.ts new file mode 100644 index 0000000000..a582fc6598 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog-container.component.ts @@ -0,0 +1,33 @@ +import { ROUTES } from '@admin-client/shared'; +import { NavigationService } from '@alfa-client/navigation-shared'; +import { createEmptyStateResource, isNotLoading, StateResource } from '@alfa-client/tech-shared'; +import { AsyncPipe } from '@angular/common'; +import { Component, inject } from '@angular/core'; +import { Observable, of, tap } from 'rxjs'; +import { UserFormService } from '../user.formservice'; +import { UserDeleteDialogComponent } from './user-delete-dialog/user-delete-dialog.component'; + +@Component({ + selector: 'admin-delete-dialog-container', + standalone: true, + imports: [UserDeleteDialogComponent, AsyncPipe], + templateUrl: './user-delete-dialog-container.component.html', +}) +export class UserDeleteDialogContainerComponent { + public readonly formService = inject(UserFormService); + public readonly navigationService = inject(NavigationService); + + public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); + + public deleteUser(): void { + this.deleteUserStateResource$ = this.formService + .delete() + .pipe(tap((state: StateResource<unknown>) => this.navigateOnDeleteSuccess(state))); + } + + private navigateOnDeleteSuccess(state: StateResource<any>): void { + if (isNotLoading(state)) { + this.navigationService.navigate(ROUTES.BENUTZER); + } + } +} 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-delete-dialog/user-delete-dialog.component.html similarity index 100% rename from alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.html rename to alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog/user-delete-dialog.component.html 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-delete-dialog/user-delete-dialog.component.spec.ts similarity index 85% rename from 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 rename to alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog/user-delete-dialog.component.spec.ts index 0d9ab4a5d9..e2cfff1676 100644 --- 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-delete-dialog/user-delete-dialog.component.spec.ts @@ -4,22 +4,22 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ButtonWithSpinnerComponent, CancelDialogButtonComponent } from '@ods/component'; import { MockComponent } from 'ng-mocks'; import { getDataTestIdOf } from '../../../../../../../tech-shared/test/data-test'; -import { UserFormDeleteDialogComponent } from './user-form-delete-dialog.component'; +import { UserDeleteDialogComponent } from './user-delete-dialog.component'; describe('UserFormDeleteDialogComponent', () => { - let component: UserFormDeleteDialogComponent; - let fixture: ComponentFixture<UserFormDeleteDialogComponent>; + let component: UserDeleteDialogComponent; + let fixture: ComponentFixture<UserDeleteDialogComponent>; const deleteButton: string = getDataTestIdOf('dialog-delete-button-host'); const cancelButton: string = getDataTestIdOf('dialog-cancel-button-host'); beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [UserFormDeleteDialogComponent], + imports: [UserDeleteDialogComponent], declarations: [MockComponent(CancelDialogButtonComponent), MockComponent(ButtonWithSpinnerComponent)], }).compileComponents(); - fixture = TestBed.createComponent(UserFormDeleteDialogComponent); + fixture = TestBed.createComponent(UserDeleteDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); }); 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-delete-dialog/user-delete-dialog.component.ts similarity index 76% rename from alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog/user-form-delete-dialog.component.ts rename to alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-delete-dialog/user-delete-dialog.component.ts index a5ca4d3f99..9ced40bf33 100644 --- 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-delete-dialog/user-delete-dialog.component.ts @@ -3,12 +3,12 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ButtonWithSpinnerComponent, CancelDialogButtonComponent } from '@ods/component'; @Component({ - selector: 'admin-user-form-delete-dialog', + selector: 'admin-user-delete-dialog', standalone: true, imports: [ButtonWithSpinnerComponent, CancelDialogButtonComponent], - templateUrl: './user-form-delete-dialog.component.html', + templateUrl: './user-delete-dialog.component.html', }) -export class UserFormDeleteDialogComponent { +export class UserDeleteDialogComponent { @Input() username: string; @Input() deleteUserStateResource: StateResource<unknown>; 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 deleted file mode 100644 index 085218ad36..0000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -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 { 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 be called', () => { - const username: string = faker.word.sample(); - const stateResource: StateResource<unknown> = createEmptyStateResource(); - formService.getUserName = jest.fn().mockReturnValue(username); - component.deleteUserStateResource$ = of(stateResource); - - fixture.detectChanges(); - - const deleteDialog: UserFormDeleteDialogComponent = getMockComponent(fixture, UserFormDeleteDialogComponent); - expect(deleteDialog.username).toBe(username); - expect(deleteDialog.deleteUserStateResource).toBe(stateResource); - }); - - it('should call deleteUser on emit delete', () => { - component.deleteUser = jest.fn(); - - dispatchEventFromFixture(fixture, deletDialogLocator, 'delete'); - - expect(component.deleteUser).toHaveBeenCalled(); - }); - }); -}); 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 deleted file mode 100644 index 3837d6fb96..0000000000 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-delete-dialog-container/user-form-delete-dialog-container.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; -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', -}) -//TODO Rename -> DeleteUserDialogContainerComponent -export class UserFormDeleteDialogContainerComponent { - public readonly formService = inject(UserFormService); - - public deleteUserStateResource$: Observable<StateResource<unknown>> = of(createEmptyStateResource()); - - public deleteUser(): void { - //Implement me - } -} diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts index 9fc048a1ff..84b983e7b7 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.ts @@ -30,7 +30,7 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { OpenDialogButtonComponent, SpinnerComponent } from '@ods/component'; import { Observable } from 'rxjs'; import { UserFormDataComponent } from './user-form-data/user-form-data.component'; -import { UserFormDeleteDialogContainerComponent } from './user-form-delete-dialog-container/user-form-delete-dialog-container.component'; +import { UserDeleteDialogContainerComponent } from './user-form-delete-dialog-container/user-delete-dialog-container.component'; import { UserFormHeadlineComponent } from './user-form-headline/user-form-headline.component'; import { UserFormOrganisationsEinheitListComponent } from './user-form-organisations-einheit-list/user-form-organisations-einheit-list.component'; import { UserFormRolesComponent } from './user-form-roles/user-form-roles.component'; @@ -39,7 +39,7 @@ import { UserFormService } from './user.formservice'; @Component({ selector: 'admin-user-form', - providers: [UserFormService, { provide: DIALOG_COMPONENT, useValue: UserFormDeleteDialogContainerComponent }], + providers: [UserFormService, { provide: DIALOG_COMPONENT, useValue: UserDeleteDialogContainerComponent }], templateUrl: './user-form.component.html', standalone: true, imports: [ diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts index a7d60371fb..7b340b7fff 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.spec.ts @@ -63,7 +63,14 @@ describe('UserFormService', () => { ]); beforeEach(() => { - service = { ...mock(UserService), refresh: jest.fn(), create: jest.fn(), save: jest.fn(), getUserById: jest.fn() }; + service = { + ...mock(UserService), + refresh: jest.fn(), + create: jest.fn(), + save: jest.fn(), + delete: jest.fn(), + getUserById: jest.fn(), + }; adminOrganisationsEinheitService = { ...mock(AdminOrganisationsEinheitService), getAll: jest.fn().mockReturnValue(of(adminOrganisationsEinheitList)), @@ -351,6 +358,28 @@ describe('UserFormService', () => { })); }); + describe('doDelete', () => { + const id: string = faker.string.uuid(); + const stateResource: StateResource<unknown> = createEmptyStateResource(); + + beforeEach(() => { + formService._patchConfig = { id, doPatch: true }; + service.delete.mockReturnValue(of(stateResource)); + }); + + it('should call service delete', () => { + formService._doDelete(); + + expect(service.delete).toHaveBeenCalledWith(id); + }); + + it('should return empty stateResource', () => { + const result: Observable<StateResource<unknown>> = formService._doDelete(); + + expect(result).toBeObservable(singleColdCompleted(stateResource)); + }); + }); + describe('createOrSave', () => { const user: User = createUser(); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts index a456872659..da268c079e 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user.formservice.ts @@ -206,6 +206,10 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest ); } + _doDelete(): Observable<StateResource<unknown>> { + return this.userService.delete(this._patchConfig.id); + } + _createOrSave(user: User): Observable<StateResource<User>> { if (this.isPatch()) { return this.userService.save({ -- GitLab