diff --git a/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts b/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts index 7b9027ffdc33f6f5cef1980aac392859a457237d..5fcf9293386a9ad8b80322055dd470149b483a99 100644 --- a/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts +++ b/alfa-client/apps/admin-e2e/src/components/benutzer/benutzer.e2e.component.ts @@ -94,10 +94,10 @@ export class BenutzerE2EComponent { private readonly userBenutzername: string = 'Benutzername-text-input'; private readonly userMail: string = 'E-Mail-text-input'; - private readonly adminCheckbox: string = 'Admin-checkbox-editor'; - private readonly loeschenCheckbox: string = 'Loschen-checkbox-editor'; - private readonly userCheckbox: string = 'User-checkbox-editor'; - private readonly postCheckbox: string = 'Poststelle-checkbox-editor'; + private readonly adminCheckboxLabel: string = 'Admin'; + private readonly loeschenCheckboxLabel: string = 'Löschen'; + private readonly userCheckboxLabel: string = 'User'; + private readonly postCheckboxLabel: string = 'Poststelle'; private readonly organisationsEinheitCheckboxSuffix: string = '-checkbox-editor'; @@ -119,20 +119,20 @@ export class BenutzerE2EComponent { return cy.getTestElement(this.userMail); } - public getAdminCheckbox(): Cypress.Chainable<Element> { - return cy.getTestElement(this.adminCheckbox); + public getAdminCheckbox(): BenutzerCheckboxE2EComponent { + return new BenutzerCheckboxE2EComponent(this.adminCheckboxLabel); } - public getLoeschenCheckbox(): Cypress.Chainable<Element> { - return cy.getTestElement(this.loeschenCheckbox); + public getLoeschenCheckbox(): BenutzerCheckboxE2EComponent { + return new BenutzerCheckboxE2EComponent(this.loeschenCheckboxLabel); } - public getUserCheckbox(): Cypress.Chainable<Element> { - return cy.getTestElement(this.userCheckbox); + public getUserCheckbox(): BenutzerCheckboxE2EComponent { + return new BenutzerCheckboxE2EComponent(this.userCheckboxLabel); } - public getPostCheckbox(): Cypress.Chainable<Element> { - return cy.getTestElement(this.postCheckbox); + public getPostCheckbox(): BenutzerCheckboxE2EComponent { + return new BenutzerCheckboxE2EComponent(this.postCheckboxLabel); } public getSaveButton(): Cypress.Chainable<Element> { @@ -147,3 +147,29 @@ export class BenutzerE2EComponent { return cy.getTestElement(this.headline); } } + +export class BenutzerCheckboxE2EComponent { + private rootPrefix: string; + private prefix: string; + + private readonly adminCheckbox: string = '-checkbox-editor'; + private readonly adminInfoButtonSuffix: string = '-role-info-button'; + private readonly adminInfoButtonTooltipSuffix: string = '-role-info-button-tooltip'; + + constructor(label: string) { + this.rootPrefix = convertToDataTestId(label); + this.prefix = convertToDataTestId(label.toLocaleLowerCase()); + } + + public getRoot(): Cypress.Chainable<Element> { + return cy.getTestElement(`${this.rootPrefix}${this.adminCheckbox}`); + } + + public getInfoButton(): Cypress.Chainable<Element> { + return cy.getTestElement(`${this.prefix}${this.adminInfoButtonSuffix}`); + } + + public getInfoButtonTooltip(): Cypress.Chainable<Element> { + return cy.getTestElement(`${this.prefix}${this.adminInfoButtonTooltipSuffix}`); + } +} 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 6f2aeed20740461f3dc978afdc2b974fec471f00..b45dc8f07dd52c1c89315663866c0cbf4350fc71 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,15 +21,24 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { E2EBenutzerHelper } from 'apps/admin-e2e/src/helper/benutzer/benutzer.helper'; -import { OrganisationsEinheitE2E } from 'apps/admin-e2e/src/model/organisations-einheit'; import { BenutzerE2EComponent, BenutzerListE2EComponent, BenutzerListItemE2EComponent, -} from '../../../components/benutzer/benutzer.e2e.component'; -import { beChecked, beEnabled, contains, exist, notBeChecked, notBeEnabled } from '../../../support/cypress.util'; -import { AlfaRollen, AlfaUsers, loginAsAriane } from '../../../support/user-util'; +} 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 { AlfaRollen, AlfaUsers, loginAsAriane } from 'apps/admin-e2e/src/support/user-util'; describe('Benutzer und Rollen', () => { const benutzerPage: BenutzerE2EComponent = new BenutzerE2EComponent(); @@ -84,56 +93,82 @@ describe('Benutzer und Rollen', () => { exist(benutzerPage.getBenutzernameInput()); exist(benutzerPage.getMailInput()); - notBeChecked(benutzerPage.getAdminCheckbox()); - notBeChecked(benutzerPage.getLoeschenCheckbox()); - notBeChecked(benutzerPage.getUserCheckbox()); - notBeChecked(benutzerPage.getPostCheckbox()); + notBeChecked(benutzerPage.getAdminCheckbox().getRoot()); + notBeChecked(benutzerPage.getLoeschenCheckbox().getRoot()); + notBeChecked(benutzerPage.getUserCheckbox().getRoot()); + notBeChecked(benutzerPage.getPostCheckbox().getRoot()); }); it('should activate loeschen checkbox and deactivate the other two checkboxes', () => { - benutzerPage.getLoeschenCheckbox().click(); - beChecked(benutzerPage.getLoeschenCheckbox()); - notBeEnabled(benutzerPage.getUserCheckbox()); - notBeEnabled(benutzerPage.getPostCheckbox()); - - benutzerPage.getLoeschenCheckbox().click(); - notBeChecked(benutzerPage.getLoeschenCheckbox()); - beEnabled(benutzerPage.getUserCheckbox()); - beEnabled(benutzerPage.getPostCheckbox()); + benutzerPage.getLoeschenCheckbox().getRoot().click(); + beChecked(benutzerPage.getLoeschenCheckbox().getRoot()); + notBeEnabled(benutzerPage.getUserCheckbox().getRoot()); + notBeEnabled(benutzerPage.getPostCheckbox().getRoot()); + + benutzerPage.getLoeschenCheckbox().getRoot().click(); + notBeChecked(benutzerPage.getLoeschenCheckbox().getRoot()); + beEnabled(benutzerPage.getUserCheckbox().getRoot()); + beEnabled(benutzerPage.getPostCheckbox().getRoot()); }); it('should additionally activate and deactivate admin checkbox', () => { - benutzerPage.getLoeschenCheckbox().click(); - benutzerPage.getAdminCheckbox().click(); - beChecked(benutzerPage.getLoeschenCheckbox()); - beChecked(benutzerPage.getAdminCheckbox()); + benutzerPage.getLoeschenCheckbox().getRoot().click(); + benutzerPage.getAdminCheckbox().getRoot().click(); + beChecked(benutzerPage.getLoeschenCheckbox().getRoot()); + beChecked(benutzerPage.getAdminCheckbox().getRoot()); - benutzerPage.getAdminCheckbox().click(); - notBeChecked(benutzerPage.getAdminCheckbox()); + benutzerPage.getAdminCheckbox().getRoot().click(); + notBeChecked(benutzerPage.getAdminCheckbox().getRoot()); }); it('should activate user checkbox and deactivate the other two checkboxes', () => { - benutzerPage.getLoeschenCheckbox().click(); - benutzerPage.getUserCheckbox().click(); - beChecked(benutzerPage.getUserCheckbox()); - notBeEnabled(benutzerPage.getLoeschenCheckbox()); - notBeEnabled(benutzerPage.getPostCheckbox()); - - benutzerPage.getUserCheckbox().click(); - notBeChecked(benutzerPage.getUserCheckbox()); - beEnabled(benutzerPage.getLoeschenCheckbox()); - beEnabled(benutzerPage.getPostCheckbox()); + benutzerPage.getLoeschenCheckbox().getRoot().click(); + benutzerPage.getUserCheckbox().getRoot().click(); + beChecked(benutzerPage.getUserCheckbox().getRoot()); + notBeEnabled(benutzerPage.getLoeschenCheckbox().getRoot()); + notBeEnabled(benutzerPage.getPostCheckbox().getRoot()); + + benutzerPage.getUserCheckbox().getRoot().click(); + notBeChecked(benutzerPage.getUserCheckbox().getRoot()); + beEnabled(benutzerPage.getLoeschenCheckbox().getRoot()); + beEnabled(benutzerPage.getPostCheckbox().getRoot()); }); it('should activate post checkbox and deactivate the other two checkboxes', () => { - benutzerPage.getPostCheckbox().click(); - beChecked(benutzerPage.getPostCheckbox()); - notBeEnabled(benutzerPage.getLoeschenCheckbox()); - notBeEnabled(benutzerPage.getUserCheckbox()); - - benutzerPage.getPostCheckbox().click(); - notBeChecked(benutzerPage.getPostCheckbox()); - beEnabled(benutzerPage.getLoeschenCheckbox()); - beEnabled(benutzerPage.getUserCheckbox()); + benutzerPage.getPostCheckbox().getRoot().click(); + beChecked(benutzerPage.getPostCheckbox().getRoot()); + notBeEnabled(benutzerPage.getLoeschenCheckbox().getRoot()); + notBeEnabled(benutzerPage.getUserCheckbox().getRoot()); + + benutzerPage.getPostCheckbox().getRoot().click(); + notBeChecked(benutzerPage.getPostCheckbox().getRoot()); + beEnabled(benutzerPage.getLoeschenCheckbox().getRoot()); + beEnabled(benutzerPage.getUserCheckbox().getRoot()); + }); + + describe('hint text', () => { + it('should be visible on admin role mouse hover', () => { + mouseEnter(benutzerPage.getAdminCheckbox().getInfoButton()); + + visible(benutzerPage.getAdminCheckbox().getInfoButtonTooltip()); + }); + + it('should be visible on loeschen role mouse hover', () => { + mouseEnter(benutzerPage.getLoeschenCheckbox().getInfoButton()); + + visible(benutzerPage.getLoeschenCheckbox().getInfoButtonTooltip()); + }); + + it('should be visible on user role mouse hover', () => { + mouseEnter(benutzerPage.getUserCheckbox().getInfoButton()); + + visible(benutzerPage.getUserCheckbox().getInfoButtonTooltip()); + }); + + it('should be visible on poststellt role mouse hover', () => { + mouseEnter(benutzerPage.getPostCheckbox().getInfoButton()); + + visible(benutzerPage.getPostCheckbox().getInfoButtonTooltip()); + }); }); }); 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 9c8898bc0fcddef20b538919cc20bde8bc6e1993..938ddad2366dd0cf1ec9fff884c291e8f4836b79 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 @@ -15,16 +15,16 @@ export class E2EBenutzerExecutor { this.benutzerPage.getMailInput().type(user.email); if (user.isAdmin) { - this.benutzerPage.getAdminCheckbox().click(); + this.benutzerPage.getAdminCheckbox().getRoot().click(); } if (user.isUser) { - this.benutzerPage.getUserCheckbox().click(); + this.benutzerPage.getUserCheckbox().getRoot().click(); } if (user.isLoeschen) { - this.benutzerPage.getLoeschenCheckbox().click(); + this.benutzerPage.getLoeschenCheckbox().getRoot().click(); } if (user.isPoststelle) { - this.benutzerPage.getPostCheckbox().click(); + this.benutzerPage.getPostCheckbox().getRoot().click(); } this.modifyOrganisationsEinheiten(user.organisationseinheiten); diff --git a/alfa-client/apps/admin-e2e/src/support/cypress.util.ts b/alfa-client/apps/admin-e2e/src/support/cypress.util.ts index 637963609081aa8cddbd24bbf5f56369b80cf0ef..d18cc34fbfe2cedb9d21aae60b730283b96e9392 100644 --- a/alfa-client/apps/admin-e2e/src/support/cypress.util.ts +++ b/alfa-client/apps/admin-e2e/src/support/cypress.util.ts @@ -60,10 +60,6 @@ export function mouseEnter(element: Cypress.Chainable<Element>): void { element.trigger('mouseenter'); } -export function mouseOver(element: Cypress.Chainable<Element>): void { - element.trigger('mouseover'); -} - export function contains(element: Cypress.Chainable<Element>, containing: string): void { element.should('exist').contains(containing); } diff --git a/alfa-client/apps/admin-e2e/src/support/tech-util.ts b/alfa-client/apps/admin-e2e/src/support/tech-util.ts index a1bbcb74ae2b53c9fc3fc05bbcab81896c4e183e..6e6c57d156a011e83fe53bee52ad26a56a384ad2 100644 --- a/alfa-client/apps/admin-e2e/src/support/tech-util.ts +++ b/alfa-client/apps/admin-e2e/src/support/tech-util.ts @@ -10,6 +10,6 @@ export function replaceAllWhitespaces(value: string, replaceWith: string): strin return value.replace(/ /g, replaceWith); } -export function simpleTransliteration(value: string) { +export function simpleTransliteration(value: string): string { return value.normalize('NFKD').replace(/[^-A-Za-z0-9_]/g, ''); } diff --git a/alfa-client/libs/admin/user/src/lib/user-form/user-form-roles/user-form-roles.component.html b/alfa-client/libs/admin/user/src/lib/user-form/user-form-roles/user-form-roles.component.html index 10b190c0ac68f5387b66c02fe39a4c3929040501..b604db41588c7f1fbd381c194a8fb98a69aad0c3 100644 --- a/alfa-client/libs/admin/user/src/lib/user-form/user-form-roles/user-form-roles.component.html +++ b/alfa-client/libs/admin/user/src/lib/user-form/user-form-roles/user-form-roles.component.html @@ -6,6 +6,7 @@ <div class="flex items-center gap-2"> <ods-checkbox-editor [formControlName]="UserFormService.ADMIN" label="Admin" inputId="admin" /> <button + data-test-id="admin-role-info-button" tooltip="Diese Rolle kann Funktionen der OZG-Cloud konfigurieren, z.B. Benutzer anlegen, Organisationseinheiten hinzufügen und Rollen zuweisen." > <ods-info-icon /> @@ -17,6 +18,7 @@ <div class="flex items-center gap-2"> <ods-checkbox-editor [formControlName]="UserFormService.LOESCHEN" label="Löschen" inputId="delete" /> <button + data-test-id="loschen-role-info-button" tooltip='Diese Rolle hat dieselben Rechte wie die Rolle "User". Zusätzlich kann "Löschen" Löschanträge aus Alfa bestätigen. ' > <ods-info-icon /> @@ -25,6 +27,7 @@ <div class="flex items-center gap-2"> <ods-checkbox-editor [formControlName]="UserFormService.USER" label="User" inputId="user" /> <button + data-test-id="user-role-info-button" tooltip="Diese Rolle kann alle Vorgänge sehen und bearbeiten, wenn diese seiner Organisationseinheit zugewiesen sind." > <ods-info-icon /> @@ -32,7 +35,7 @@ </div> <div class="flex items-center gap-2"> <ods-checkbox-editor [formControlName]="UserFormService.POSTSTELLE" label="Poststelle" inputId="post_office" /> - <button tooltip="Diese Rolle kann alle neu eingegangenen Vorgänge sehen."> + <button data-test-id="poststelle-role-info-button" tooltip="Diese Rolle kann alle neu eingegangenen Vorgänge sehen."> <ods-info-icon /> </button> </div> diff --git a/alfa-client/libs/test-utils/src/lib/mocking.ts b/alfa-client/libs/test-utils/src/lib/mocking.ts index 0fb616db60420994880e9acfddec1d0d37e10486..13ea6f602d26172b07d0a82f1c48136adbc9d28d 100644 --- a/alfa-client/libs/test-utils/src/lib/mocking.ts +++ b/alfa-client/libs/test-utils/src/lib/mocking.ts @@ -53,3 +53,7 @@ export function mockGetValue(object: any, name: string, returnValue: any): void get: jest.fn(() => returnValue), }); } + +export function assignValue<T>(object: any, attributeName: string, toAssignValue: any): T { + return Object.assign(object, { [attributeName]: toAssignValue }); +}