diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer-bearbeiten.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer-bearbeiten.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..16d99dd00ad9ae05df7bc35fb531e981f712ceeb --- /dev/null +++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer-bearbeiten.cy.ts @@ -0,0 +1,58 @@ +import { faker } from '@faker-js/faker'; +import { BenutzerE2EComponent } from 'apps/admin-e2e/src/components/benutzer/benutzer.e2e.component'; +import { E2EBenutzerHelper } from 'apps/admin-e2e/src/helper/benutzer/benutzer.helper'; +import { E2EBenutzerVerifier } from 'apps/admin-e2e/src/helper/benutzer/benutzer.verifier'; +import { AdminUserE2E } from 'apps/admin-e2e/src/model/util'; +import { loginAsAriane } from 'apps/admin-e2e/src/support/user-util'; + +describe('Benutzer Bearbeiten', () => { + const benutzerVerifier: E2EBenutzerVerifier = new E2EBenutzerVerifier(); + const benutzerHelper: E2EBenutzerHelper = new E2EBenutzerHelper(); + const benutzerPage: BenutzerE2EComponent = new BenutzerE2EComponent(); + + const userName: string = 'testtheo' + faker.string.uuid(); + const user: AdminUserE2E = { + vorname: 'Theo', + nachname: 'Testuser', + username: userName, + email: 'theo' + faker.string.uuid() + '@ozg-sh.de', + isUser: true, + organisationseinheiten: [], + }; + + before(() => { + loginAsAriane(); + }); + + it('should add new user', () => { + benutzerHelper.openNewBenutzerPage(); + benutzerHelper.addBenutzerAndSave(user); + }); + + it('should not be able to edit username', () => { + benutzerHelper.openBenutzerPage(userName); + + benutzerPage.getBenutzernameInput().should('not.exist'); + }); + + it('should deactivate other alfa roles if "user" role is selected', () => { + benutzerVerifier.verifyAlfaRolesCorrectlyChecked(user); + }); + + it('should edit user', () => { + const editedUser: AdminUserE2E = { ...user, vorname: 'Theodor' }; + + benutzerHelper.editBenutzerAndSave(editedUser); + }); + + it('should check for new user name', () => { + benutzerHelper.openBenutzerPage(userName); + + benutzerVerifier.verifyUserVorname('Theodor'); + }); + + it('should delete user', () => { + benutzerHelper.deleteBenutzer(userName); + benutzerVerifier.verifyUserNotInList(userName); + }); +}); diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer_rollen.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer_rollen.cy.ts index 205d661f91365f4bea89867b41ae673a7f1e2c4a..d978a0cea6580068a22a4c15571d078ab56a16dc 100644 --- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer_rollen.cy.ts +++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer_rollen.cy.ts @@ -21,10 +21,23 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { BenutzerE2EComponent, BenutzerListE2EComponent, BenutzerListItemE2EComponent, } from 'apps/admin-e2e/src/components/benutzer/benutzer.e2e.component'; +import { + BenutzerE2EComponent, + BenutzerListE2EComponent, + BenutzerListItemE2EComponent, +} from 'apps/admin-e2e/src/components/benutzer/benutzer.e2e.component'; import { E2EBenutzerHelper } from 'apps/admin-e2e/src/helper/benutzer/benutzer.helper'; import { OrganisationsEinheitE2E } from 'apps/admin-e2e/src/model/organisations-einheit'; -import { beChecked, beEnabled, contains, exist, mouseEnter, notBeChecked, notBeEnabled, visible, } from 'apps/admin-e2e/src/support/cypress.util'; +import { + beChecked, + beEnabled, + contains, + exist, + mouseEnter, + notBeChecked, + notBeEnabled, + visible, +} from 'apps/admin-e2e/src/support/cypress.util'; import { AlfaRollen, AlfaUsers, loginAsAriane } from 'apps/admin-e2e/src/support/user-util'; describe('Benutzer und Rollen', () => { diff --git a/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.executor.ts b/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.executor.ts index f0ed339c63bbb596e72915d346b97c8390bf35c1..b9d17f8d68a5ba002c09da8d39fd3309d8e1bee4 100644 --- a/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.executor.ts +++ b/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.executor.ts @@ -14,24 +14,20 @@ export class E2EBenutzerExecutor { private benutzerDeleteDialog: BenutzerDeleteDialogE2EComponent = new BenutzerDeleteDialogE2EComponent(); private benutzerListPage: BenutzerListE2EComponent = new BenutzerListE2EComponent(); - public modifyBenutzer(user: AdminUserE2E): void { - this.benutzerPage.getVornameInput().type(user.vorname); - this.benutzerPage.getNachnameInput().type(user.nachname); + public createBenutzer(user: AdminUserE2E): void { this.benutzerPage.getBenutzernameInput().type(user.username); - this.benutzerPage.getMailInput().type(user.email); - - if (user.isAdmin) { - this.benutzerPage.getAdminCheckbox().getRoot().click(); - } - if (user.isUser) { - this.benutzerPage.getUserCheckbox().getRoot().click(); - } - if (user.isLoeschen) { - this.benutzerPage.getLoeschenCheckbox().getRoot().click(); - } - if (user.isPoststelle) { - this.benutzerPage.getPostCheckbox().getRoot().click(); - } + this.modifyBenutzer(user); + } + + public modifyBenutzer(user: AdminUserE2E): void { + this.benutzerPage.getVornameInput().clear().type(user.vorname); + this.benutzerPage.getNachnameInput().clear().type(user.nachname); + this.benutzerPage.getMailInput().clear().type(user.email); + + this.benutzerPage.getAdminCheckbox().getRoot()[user.isAdmin ? 'check' : 'uncheck'](); + this.benutzerPage.getUserCheckbox().getRoot()[user.isUser ? 'check' : 'uncheck'](); + this.benutzerPage.getLoeschenCheckbox().getRoot()[user.isLoeschen ? 'check' : 'uncheck'](); + this.benutzerPage.getPostCheckbox().getRoot()[user.isPoststelle ? 'check' : 'uncheck'](); this.modifyOrganisationsEinheiten(user.organisationseinheiten); } diff --git a/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.helper.ts b/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.helper.ts index 2b06766322f460cdb12f6ec065e19b9e79e756f0..e7ec4228940b8ce3b78ca5543cec2587fa163819 100644 --- a/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.helper.ts +++ b/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.helper.ts @@ -21,7 +21,7 @@ export class E2EBenutzerHelper { } public addBenutzer(user: AdminUserE2E): void { - this.modifyBenutzer(user); + this.createBenutzer(user); } public editBenutzerAndSave(user: AdminUserE2E): void { @@ -37,6 +37,10 @@ export class E2EBenutzerHelper { this.executer.modifyBenutzer(user); } + private createBenutzer(user: AdminUserE2E): void { + this.executer.createBenutzer(user); + } + public editOrganisationsEinheitenAndSave(organisationsEinheiten: OrganisationsEinheitE2E[]): void { this.executer.modifyOrganisationsEinheiten(organisationsEinheiten); this.saveAndCloseSnackbar(); diff --git a/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.verifier.ts b/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.verifier.ts index be750e3dfbfe90c3821451932ecb475bd31cbbe5..277f735a6038200c0c21c6efaa8b06d71d6d9e9c 100644 --- a/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.verifier.ts +++ b/alfa-client/apps/admin-e2e/src/helper/benutzer/benutzer.verifier.ts @@ -4,7 +4,7 @@ import { BenutzerListItemE2EComponent, } from '../../components/benutzer/benutzer.e2e.component'; import { AdminUserE2E } from '../../model/util'; -import { contains, exist, notExist } from '../../support/cypress.util'; +import { contains, exist, notBeEnabled, notExist } from '../../support/cypress.util'; import { AlfaRollen } from '../../support/user-util'; export class E2EBenutzerVerifier { @@ -29,6 +29,25 @@ export class E2EBenutzerVerifier { }); } + public verifyUserVorname(name: string): void { + this.benutzerPage.getVornameInput().should('have.value', name); + } + + public verifyAlfaRolesCorrectlyChecked(user: AdminUserE2E): void { + if (user.isUser) { + notBeEnabled(this.benutzerPage.getLoeschenCheckbox().getRoot()); + notBeEnabled(this.benutzerPage.getPostCheckbox().getRoot()); + } + if (user.isLoeschen) { + notBeEnabled(this.benutzerPage.getUserCheckbox().getRoot()); + notBeEnabled(this.benutzerPage.getPostCheckbox().getRoot()); + } + if (user.isPoststelle) { + notBeEnabled(this.benutzerPage.getUserCheckbox().getRoot()); + notBeEnabled(this.benutzerPage.getLoeschenCheckbox().getRoot()); + } + } + public verifyUserInList(user: AdminUserE2E): void { const benutzer: BenutzerListItemE2EComponent = this.getBenutzerItem(user.username); contains(benutzer.getUserName(), user.username); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.html new file mode 100644 index 0000000000000000000000000000000000000000..978716b86eca55e97a7f9d636a6ae2046823d820 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.html @@ -0,0 +1,4 @@ +<p class="flex flex-col gap-2 text-text"> + <span class="font-medium">Benutzername</span> + <span>{{ userName }}</span> +</p> diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f515c9412747b65e91386a3a5db676f2a6888271 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { UserFormDataNameComponent } from './user-form-data-name.component'; + +describe('UserFormDataNameComponent', () => { + let component: UserFormDataNameComponent; + let fixture: ComponentFixture<UserFormDataNameComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UserFormDataNameComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(UserFormDataNameComponent); + 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-data/user-form-data-name/user-form-data-name.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..931174e68ce1fc96a8e8301d79c93e8dbb8a80a6 --- /dev/null +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data-name/user-form-data-name.component.ts @@ -0,0 +1,10 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'admin-user-form-data-name', + standalone: true, + templateUrl: './user-form-data-name.component.html', +}) +export class UserFormDataNameComponent { + @Input() userName: string; +} diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.html index 430a3fde777062e005bab85507e57ef17883b311..830c7960ac97bb94267cdb6737d3a83001e44951 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.html +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.html @@ -2,7 +2,16 @@ <div class="mb-4 grid gap-4 xl:grid-cols-2"> <ods-text-editor [formControlName]="UserFormService.FIRST_NAME" [isRequired]="true" label="Vorname" /> <ods-text-editor [formControlName]="UserFormService.LAST_NAME" [isRequired]="true" label="Nachname" /> - <ods-text-editor [formControlName]="UserFormService.USERNAME" [isRequired]="true" label="Benutzername" /> + @if (isPatch) { + <admin-user-form-data-name [userName]="userName" data-test-id="user-name-info" /> + } @else { + <ods-text-editor + [formControlName]="UserFormService.USERNAME" + [isRequired]="true" + label="Benutzername" + data-test-id="user-name-editor" + /> + } <ods-text-editor [formControlName]="UserFormService.EMAIL" [isRequired]="true" label="E-Mail" /> </div> </div> diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.spec.ts index 40a8f3782988d250b27e9b7867c52eda96072b58..e8c6ef7d13ae82ecc182da1b50a0dac60d96c00f 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.spec.ts @@ -1,5 +1,7 @@ +import { existsAsHtmlElement } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createUserFormGroup } from '../../../../test/form'; import { UserFormDataComponent } from './user-form-data.component'; @@ -7,6 +9,9 @@ describe('UserFormDataComponent', () => { let component: UserFormDataComponent; let fixture: ComponentFixture<UserFormDataComponent>; + const userNameInfoSelector: string = getDataTestIdOf('user-name-info'); + const userNameEditorSelector: string = getDataTestIdOf('user-name-editor'); + beforeEach(async () => { await TestBed.configureTestingModule({ imports: [UserFormDataComponent, ReactiveFormsModule], @@ -21,4 +26,25 @@ describe('UserFormDataComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + describe('template', () => { + describe('user name', () => { + it('should show info', () => { + component.isPatch = true; + component.userName = 'ariane'; + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, userNameInfoSelector); + }); + + it('should show editor', () => { + component.isPatch = false; + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, userNameEditorSelector); + }); + }); + }); }); diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.ts index d40bee2ba526b9e7bb52d4f638bcb3f95f28095c..9bf2f6b95124810d75ee7676dadb60826cc55fc5 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-data/user-form-data.component.ts @@ -1,16 +1,19 @@ import { Component, Input } from '@angular/core'; import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms'; -import { CheckboxEditorComponent, TextEditorComponent } from '@ods/component'; +import { TextEditorComponent } from '@ods/component'; import { UserFormService } from '../user.formservice'; +import { UserFormDataNameComponent } from './user-form-data-name/user-form-data-name.component'; @Component({ selector: 'admin-user-form-data', standalone: true, - imports: [CheckboxEditorComponent, ReactiveFormsModule, TextEditorComponent], + imports: [ReactiveFormsModule, TextEditorComponent, UserFormDataNameComponent], templateUrl: './user-form-data.component.html', }) export class UserFormDataComponent { @Input() formGroupParent: UntypedFormGroup; + @Input() userName: string; + @Input() isPatch: boolean; public readonly UserFormService = UserFormService; } diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html index 101227318be65fd7a14324f401d3fadfb7ceca49..1976f243ef7a93f13201789425c4c04a2e780a91 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.html @@ -25,8 +25,8 @@ --> <ods-spinner [stateResource]="userStateResource$ | async"> <div class="max-w-[960px]" data-test-id="user-content"> - <admin-user-form-headline [isPatch]="formService.isPatch()" /> - <admin-user-form-data [formGroupParent]="formService.form" /> + <admin-user-form-headline [isPatch]="isPatch" /> + <admin-user-form-data [formGroupParent]="formService.form" [isPatch]="isPatch" [userName]="userName" /> <admin-user-form-roles [formGroupParent]="formService.form" /> <admin-user-form-organisations-einheit-list [formGroupParent]="formService.form" @@ -34,8 +34,8 @@ /> <div class="flex justify-between"> <admin-user-form-save-button /> - @if (formService.isPatch()) { - <admin-delete-open-dialog-button data-test-id="delete-button-container"/> + @if (isPatch) { + <admin-delete-open-dialog-button data-test-id="delete-button-container" /> } </div> </div> diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts index fdfb961a94c43f26d9fbbcaf7bba52bf8e8e066d..bbaa75605aa2bc1071ceba8302892ee5088be620 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form.component.spec.ts @@ -51,10 +51,12 @@ describe('UserFormComponent', () => { const userContent: string = getDataTestIdOf('user-content'); const deleteButtonContainer: string = getDataTestIdOf('delete-button-container'); + const userStateResource: StateResource<User> = createStateResource(createUser()); + beforeEach(async () => { formService = <any>{ ...mock(UserFormService), - get: jest.fn(), + get: jest.fn().mockReturnValue(of(userStateResource)), isInvalid: jest.fn(), form: new FormGroup({}), isPatch: jest.fn(), @@ -96,10 +98,11 @@ describe('UserFormComponent', () => { describe('component', () => { describe('on init', () => { - const userStateResource: StateResource<User> = createStateResource(createUser()); + const userName: string = 'ariane'; beforeEach(() => { - formService.get.mockReturnValue(of(userStateResource)); + formService.isPatch.mockReturnValue(true); + formService.getUserName.mockReturnValue(userName); }); it('should call formservice to get user', () => { @@ -115,13 +118,39 @@ describe('UserFormComponent', () => { expect(component.userStateResource$).toBeObservable(cold('(a|)', { a: userStateResource })); }); + + it('should call formservice to get is patch', () => { + component.ngOnInit(); + + expect(formService.isPatch).toHaveBeenCalled(); + }); + + it('should set is patch', () => { + component.ngOnInit(); + fixture.detectChanges(); + + expect(component.isPatch).toBe(true); + }); + + it('should call formservice to get user name', () => { + component.ngOnInit(); + + expect(formService.getUserName).toHaveBeenCalled(); + }); + + it('should set user name', () => { + component.ngOnInit(); + fixture.detectChanges(); + + expect(component.userName).toBe(userName); + }); }); }); describe('template', () => { describe('admin headline', () => { it('should exist with input', () => { - formService.isPatch.mockReturnValue(true); + component.isPatch = true; fixture.detectChanges(); @@ -133,8 +162,15 @@ describe('UserFormComponent', () => { describe('admin data', () => { it('should exist with input', () => { const formDataComponent: UserFormDataComponent = getMockComponent(fixture, UserFormDataComponent); + const userName: string = 'testUser'; + component.isPatch = true; + component.userName = userName; + + fixture.detectChanges(); expect(formDataComponent.formGroupParent).toBe(component.formService.form); + expect(formDataComponent.isPatch).toBeTruthy(); + expect(formDataComponent.userName).toBe(userName); }); }); @@ -172,7 +208,7 @@ describe('UserFormComponent', () => { describe('admin delete button container', () => { it('should exist', () => { - formService.isPatch.mockReturnValue(true); + component.isPatch = true; fixture.detectChanges(); @@ -180,7 +216,7 @@ describe('UserFormComponent', () => { }); it('should not exist', () => { - formService.isPatch.mockReturnValue(false); + component.isPatch = false; fixture.detectChanges(); 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 0bcae1640c4ee01122bf83091f51d4eccc1e9d3f..f60e03692eed409a960bdeb3b27caa64b12d1ef9 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 @@ -29,7 +29,7 @@ import { AsyncPipe } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { SpinnerComponent } from '@ods/component'; -import { Observable } from 'rxjs'; +import { Observable, tap } from 'rxjs'; import { UserFormDataComponent } from './user-form-data/user-form-data.component'; import { UserDeleteDialogContainerComponent } from './user-form-delete-dialog-container/user-delete-dialog-container.component'; import { UserFormHeadlineComponent } from './user-form-headline/user-form-headline.component'; @@ -60,8 +60,15 @@ export class UserFormComponent implements OnInit { public readonly formService = inject(UserFormService); public userStateResource$: Observable<StateResource<User>>; + public isPatch: boolean; + public userName: string; ngOnInit(): void { - this.userStateResource$ = this.formService.get(); + this.userStateResource$ = this.formService.get().pipe( + tap(() => { + this.isPatch = this.formService.isPatch(); + this.userName = this.formService.getUserName(); + }), + ); } } 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 724564f208c9f26cb6265da1bbad81b52ad92b13..abb31e6062eba1eb79af8f741f3edb624be19bfc 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 @@ -152,6 +152,14 @@ describe('UserFormService', () => { }); describe('listenToAlfaGroupChanges', () => { + it('should call handleAlfaGroupChange on initial change', () => { + formService._handleAlfaGroupChange = jest.fn(); + + formService.listenToAlfaGroupChanges(); + + expect(formService._handleAlfaGroupChange).toHaveBeenCalled(); + }); + it('should call handleAlfaGroupChange when value of form element changes', fakeAsync(() => { formService._handleAlfaGroupChange = jest.fn(); @@ -481,6 +489,14 @@ describe('UserFormService', () => { expect(formService._initOrganisationsEinheiten$.unsubscribe).toHaveBeenCalled(); }); + + it('should unsubscribe from initOrganisationsEinheiten$', () => { + formService._alfaGroupChanges.unsubscribe = jest.fn(); + + formService.ngOnDestroy(); + + expect(formService._alfaGroupChanges.unsubscribe).toHaveBeenCalled(); + }); }); describe('get userName', () => { 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 494673b77cf049e6219418f7a726173af20e3fd0..cfccff6fbc249d1eb8174bee7fb25ac9e1cf8b56 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 @@ -59,6 +59,7 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest public static readonly POSTSTELLE: string = 'VERWALTUNG_POSTSTELLE'; _initOrganisationsEinheiten$: Subscription; + _alfaGroupChanges: Subscription; _organisationsEinheitToGroupIdMap: Map<string, string> = new Map<string, string>(); @@ -163,9 +164,10 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest }); } - protected listenToAlfaGroupChanges(): void { + listenToAlfaGroupChanges(): void { const alfaGroup: UntypedFormGroup = this.getRoleGroup(UserFormService.ALFA_GROUP); - alfaGroup.valueChanges.subscribe(() => { + this._handleAlfaGroupChange(alfaGroup); + this._alfaGroupChanges = alfaGroup.valueChanges.subscribe(() => { this._handleAlfaGroupChange(alfaGroup); }); } @@ -185,7 +187,7 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest _disableUncheckedCheckboxes(alfaGroup: UntypedFormGroup): void { for (const control of Object.values<AbstractControl>(alfaGroup.controls)) { - if (control.value === false) control.disable({ emitEvent: false }); + if (!control.value) control.disable({ emitEvent: false }); } } @@ -265,6 +267,7 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest ngOnDestroy(): void { this._initOrganisationsEinheiten$.unsubscribe(); + this._alfaGroupChanges.unsubscribe(); } public getUserName(): string {