diff --git a/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer-anlegen.cy.ts b/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer-anlegen.cy.ts index e2cbf35c6a1488905f98fa26df189a6fe1425ccd..6869eafd381b1d9df0dde4b213466d4c8db8b4db 100644 --- a/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer-anlegen.cy.ts +++ b/alfa-client/apps/admin-e2e/src/e2e/main-tests/benutzer_rollen/benutzer-anlegen.cy.ts @@ -1,10 +1,11 @@ +import { faker } from '@faker-js/faker'; import { E2EBenutzerHelper } from 'apps/admin-e2e/src/helper/benutzer/benutzer.helper'; import { E2EBenutzerVerifier } from 'apps/admin-e2e/src/helper/benutzer/benutzer.verifier'; import { getCypressEnv, interceptWithResponse, waitOfInterceptor } from 'apps/admin-e2e/src/support/cypress-helper'; import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component'; import { AdminUserE2E, HttpMethodE2E, SnackbarMessagesE2E } from '../../../model/util'; import { contains, notExist } from '../../../support/cypress.util'; -import { loginAsAriane } from '../../../support/user-util'; +import { loginAsAriane, loginByUsernameAndPassword } from '../../../support/user-util'; describe('Benutzer anlegen', () => { const benutzerHelper: E2EBenutzerHelper = new E2EBenutzerHelper(); @@ -12,7 +13,8 @@ describe('Benutzer anlegen', () => { const snackBar: SnackBarE2EComponent = new SnackBarE2EComponent(); - const newUser: AdminUserE2E = { + const newUserPassword: string = 'TestTestTest'; + const newAdminUser: AdminUserE2E = { vorname: 'Theo', nachname: 'Testuser', username: 'testtheo', @@ -22,6 +24,15 @@ describe('Benutzer anlegen', () => { organisationseinheiten: [], }; + const newRegularUser: AdminUserE2E = { + vorname: 'Max', + nachname: 'Mustermann', + username: 'maxmust', + email: 'max.mustermann@ozg-sh.de', + isUser: true, + organisationseinheiten: [], + }; + before(() => { loginAsAriane(); }); @@ -34,7 +45,7 @@ describe('Benutzer anlegen', () => { interceptWithResponse(HttpMethodE2E.POST, url, { errorCode, errorBody }).as(interceptor); benutzerHelper.openNewBenutzerPage(); - benutzerHelper.addBenutzer(newUser); + benutzerHelper.addBenutzer(newAdminUser); benutzerHelper.saveBenutzer(); waitOfInterceptor(interceptor).then(() => { @@ -47,7 +58,7 @@ describe('Benutzer anlegen', () => { it('should show snackbar after save', () => { benutzerHelper.openNewBenutzerPage(); - benutzerHelper.addBenutzer(newUser); + benutzerHelper.addBenutzer(newAdminUser); benutzerHelper.saveBenutzer(); contains(snackBar.getMessage(), SnackbarMessagesE2E.NUTZER_ANGELEGT); @@ -55,11 +66,60 @@ describe('Benutzer anlegen', () => { }); it('should show created user in list', () => { - benutzerVerifier.verifyUserInList(newUser); + benutzerVerifier.verifyUserInList(newAdminUser); }); it('should remove benutzer', () => { - benutzerHelper.deleteBenutzer(newUser.username); - benutzerVerifier.verifyUserNotInList(newUser.username); + benutzerHelper.deleteBenutzer(newAdminUser.username); + benutzerVerifier.verifyUserNotInList(newAdminUser.username); + }); + + describe('newly created admin user', () => { + it('should create new admin user', () => { + benutzerHelper.openNewBenutzerPage(); + + benutzerHelper.addBenutzer(newAdminUser); + benutzerHelper.saveBenutzer(); + + benutzerVerifier.verifyUserInList(newAdminUser); + }); + + it('should create new regular user', () => { + benutzerHelper.openNewBenutzerPage(); + + benutzerHelper.addBenutzer(newRegularUser); + benutzerHelper.saveBenutzer(); + + benutzerVerifier.verifyUserInList(newRegularUser); + }); + + it('should modify user', () => { + const userWithChangedFirstName = { ...newRegularUser, vorname: faker.person.firstName() }; + + benutzerHelper.activateUser(newAdminUser.username, newUserPassword).then(() => { + loginByUsernameAndPassword(newAdminUser.username, newUserPassword); + benutzerHelper.openBenutzerPage(newRegularUser.username); + + benutzerHelper.editBenutzer(userWithChangedFirstName); + benutzerHelper.saveBenutzer(); + + benutzerVerifier.verifyUserInList(userWithChangedFirstName); + }); + }); + + it('should have rights to delete user', () => { + loginByUsernameAndPassword(newAdminUser.username, newUserPassword); + benutzerHelper.openBenutzerListPage(); + + benutzerHelper.deleteBenutzer(newRegularUser.username); + + benutzerVerifier.verifyUserNotInList(newRegularUser.username); + }); + + it('should delete user', () => { + loginAsAriane(); + + benutzerHelper.deleteBenutzer(newAdminUser.username); + }); }); }); 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..ec1bbb05e560d3c45de062711da3da9ed8cf39c1 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 @@ -1,3 +1,4 @@ +import UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; import { BenutzerDeleteDialogE2EComponent, BenutzerE2EComponent, @@ -7,6 +8,7 @@ import { SnackBarE2EComponent } from '../../components/ui/snackbar.e2e.component import { OrganisationsEinheitE2E } from '../../model/organisations-einheit'; import { AdminUserE2E } from '../../model/util'; import { exist, notExist } from '../../support/cypress.util'; +import Chainable = Cypress.Chainable; export class E2EBenutzerExecutor { private benutzerPage: BenutzerE2EComponent = new BenutzerE2EComponent(); @@ -14,24 +16,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); } @@ -58,4 +56,16 @@ export class E2EBenutzerExecutor { this.benutzerDeleteDialog.getDeleteButton().click(); exist(this.benutzerListPage.getList()); } + + public verifyEmail(userId: string): Chainable<Cypress.Response<void>> { + return cy.verifyEmail(userId); + } + + public resetPassword(userId: string, newPassword: string): Chainable<Cypress.Response<void>> { + return cy.resetPassword(userId, newPassword); + } + + public findUser(username: string): Chainable<UserRepresentation> { + return cy.findUser(username); + } } 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..0c0ad0c26492851788cb31352522ac0244f4217f 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 @@ -1,3 +1,4 @@ +import UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; import { OrganisationsEinheitE2E } from '../../model/organisations-einheit'; import { AdminUserE2E } from '../../model/util'; import { E2EBenutzerExecutor } from './benutzer.executor'; @@ -5,7 +6,7 @@ import { E2EBenutzerNavigator } from './benutzer.navigator'; export class E2EBenutzerHelper { private navigator: E2EBenutzerNavigator = new E2EBenutzerNavigator(); - private executer: E2EBenutzerExecutor = new E2EBenutzerExecutor(); + private executor: E2EBenutzerExecutor = new E2EBenutzerExecutor(); public openBenutzerListPage(): void { this.navigator.openBenutzerListPage(); @@ -21,7 +22,7 @@ export class E2EBenutzerHelper { } public addBenutzer(user: AdminUserE2E): void { - this.modifyBenutzer(user); + this.createBenutzer(user); } public editBenutzerAndSave(user: AdminUserE2E): void { @@ -34,28 +35,41 @@ export class E2EBenutzerHelper { } private modifyBenutzer(user: AdminUserE2E): void { - this.executer.modifyBenutzer(user); + this.executor.modifyBenutzer(user); + } + + private createBenutzer(user: AdminUserE2E): void { + this.executor.createBenutzer(user); } public editOrganisationsEinheitenAndSave(organisationsEinheiten: OrganisationsEinheitE2E[]): void { - this.executer.modifyOrganisationsEinheiten(organisationsEinheiten); + this.executor.modifyOrganisationsEinheiten(organisationsEinheiten); this.saveAndCloseSnackbar(); } private saveAndCloseSnackbar(): void { - this.executer.saveAndCloseSnackbar(); + this.executor.saveAndCloseSnackbar(); } public saveBenutzer(): void { - this.executer.saveBenutzer(); + this.executor.saveBenutzer(); } public deleteBenutzer(userName: string): void { this.openBenutzerPage(userName); - this.executer.deleteBenutzer(); + this.executor.deleteBenutzer(); } public openBenutzerPage(userName: string): void { this.navigator.openBenutzerPage(userName); } + + public activateUser(username: string, newPassword: string): Cypress.Chainable<UserRepresentation> { + return cy + .findUser(username) + .then((userRepresentation: UserRepresentation) => cy.verifyEmail(userRepresentation.id!).then(() => userRepresentation)) + .then((userRepresentation: UserRepresentation) => + cy.resetPassword(userRepresentation.id!, newPassword).then(() => userRepresentation), + ); + } } 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/apps/admin-e2e/src/support/commands.ts b/alfa-client/apps/admin-e2e/src/support/commands.ts index 15e9839f02fc0b236bc23a554de9caa710947cf1..5442317e9972045e9b6be4644c4bbd5621377682 100644 --- a/alfa-client/apps/admin-e2e/src/support/commands.ts +++ b/alfa-client/apps/admin-e2e/src/support/commands.ts @@ -24,8 +24,12 @@ /// <reference types="cypress" /> +import UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; +import { getCypressEnv } from './cypress-helper'; + enum HttpMethod { POST = 'POST', + PUT = 'PUT', GET = 'GET', } @@ -81,12 +85,57 @@ Cypress.Commands.add('getUserInfo', () => { return cy.request({ method: HttpMethod.GET, url: `${getKeycloakBaseRealmUrl()}/userinfo`, - headers: { - [Header.AUTHORIZATION]: `bearer ${window.sessionStorage.getItem(ACCES_TOKEN)}`, - }, + headers: { ...buildBearerTokenAuthorizationHeader() }, }); }); +Cypress.Commands.add('findUser', (username: string) => + cy + .request<UserRepresentation[]>({ + method: HttpMethod.GET, + url: getUsersApiUrl(), + headers: { ...buildBearerTokenAuthorizationHeader() }, + }) + .then<UserRepresentation>((response: Cypress.Response<UserRepresentation[]>) => { + const users: UserRepresentation[] = response.body; + const found: UserRepresentation | undefined = users.find((u: UserRepresentation) => u.username === username); + if (found) return found; + return Promise.reject(`User with username ${username} not found`); + }), +); + +Cypress.Commands.add('verifyEmail', (userId: string) => + cy.request<void>({ + method: HttpMethod.PUT, + url: getUsersApiUrl() + '/' + userId, + headers: { ...buildBearerTokenAuthorizationHeader() }, + body: { emailVerified: true }, + }), +); + +Cypress.Commands.add('resetPassword', (userId: string, newPassword: string) => + cy.request<void>({ + method: HttpMethod.PUT, + url: getUsersApiUrl() + '/' + userId + '/reset-password', + headers: { ...buildBearerTokenAuthorizationHeader() }, + body: { type: 'password', temporary: false, value: newPassword }, + }), +); + +function buildBearerTokenAuthorizationHeader(): object { + return { + [Header.AUTHORIZATION]: `Bearer ${getAccessToken()}`, + }; +} + +function getAccessToken(): string | null { + return window.sessionStorage.getItem(ACCES_TOKEN); +} + +function getUsersApiUrl(): string { + return getCypressEnv('keycloakUrl') + '/admin/realms/' + getCypressEnv('keycloakRealm') + '/users'; +} + function getKeycloakBaseRealmUrl(): string { return `${Cypress.env(CypressEnv.KEYCLOAK_URL)}realms/${Cypress.env(CypressEnv.KEYCLOAK_REALM)}/protocol/openid-connect`; } @@ -115,6 +164,12 @@ declare global { findElement(selector: string): Chainable<Element>; getUserInfo(): Chainable<void>; + + findUser(username: string): Chainable<UserRepresentation>; + + verifyEmail(userId: string): Chainable<Response<void>>; + + resetPassword(userId: string, password: string): Chainable<Response<void>>; } } } diff --git a/alfa-client/apps/admin-e2e/src/support/user-util.ts b/alfa-client/apps/admin-e2e/src/support/user-util.ts index 989e061babc526985e62ace05e516bdb2d058516..0b8f311d0e9cbb0e5f453ee3e7c1e72a80548529 100644 --- a/alfa-client/apps/admin-e2e/src/support/user-util.ts +++ b/alfa-client/apps/admin-e2e/src/support/user-util.ts @@ -50,15 +50,19 @@ function login(userJson: string): void { // Hinweis: cacheAcrossSpecs: true lässt Tests umfallen export function loginByUi(user: UserE2E): void { + loginByUsernameAndPassword(user.name, user.password); +} + +export function loginByUsernameAndPassword(username: string, password: string): void { cy.session( - user.name, + username, () => { cy.visit('/') .get('#kc-login') .should('exist') .then(() => { - cy.get('#username').type(user.name); - cy.get('#password').type(user.password); + cy.get('#username').type(username); + cy.get('#password').type(password); cy.get('#kc-login').click(); }); }, diff --git a/alfa-client/apps/alfa-e2e/src/components/navigation/navigation.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/navigation/navigation.e2e.component.ts index 7e1a233687f36196443be78c7d3d56c2601cc51e..5f4b16d3b7c03aaf22996fa476bcc6cde954c363 100644 --- a/alfa-client/apps/alfa-e2e/src/components/navigation/navigation.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/navigation/navigation.e2e.component.ts @@ -28,19 +28,19 @@ export class NavigationE2EComponent { private readonly locatorRoot: string = 'navigation'; - public getRoot() { + public getRoot(): Cypress.Chainable<Element> { return cy.getTestElement(this.locatorRoot); } - public getAlleFilter() { + public getAlleFilter(): Cypress.Chainable<Element> { return cy.getTestElement(this.alleFilterToggleButton); } - public getMeineVorgaengeFilter() { + public getMeineVorgaengeFilter(): Cypress.Chainable<Element> { return cy.getTestElement(this.meineVorgaengeToggleButton); } - public getUnassignedFilter() { + public getUnassignedFilter(): Cypress.Chainable<Element> { return cy.getTestElement(this.unassignedToggleButton); } } diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward-formular.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward-formular.e2e.component.ts index a4c4310c17db187a33065e33cb60e21cbff21b47..a550f4adf9a9e0a864640917ce66fcd10a42ed20 100644 --- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward-formular.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward-formular.e2e.component.ts @@ -50,13 +50,7 @@ export class ForwardFormularE2EComponent { return cy.getTestElement(this.locatorZustaendigeStelleError); } - //TODO Getter draus machen und im Test den click durchführen - public forward() { - return this.getForwardButton().click(); - } - // - - private getForwardButton() { + public getForwardButton() { return cy.getTestElement(this.locatorForwardButton); } } diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward.e2e.component.ts index b6e8c7ca678c84bc16b90780b606e8858406b042..ee138ef9c37dc0daffcefd25286206011b778f2f 100644 --- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forward.e2e.component.ts @@ -23,7 +23,7 @@ */ import { ForwardFormularE2EComponent } from './vorgang-forward-formular.e2e.component'; -export class VorgangForwardingE2EComponent { +export class ForwardingByEmailE2EComponent { private readonly locatorForwardingSpinner: string = 'forwarding-spinner'; private readonly locatorForwardingSuccessMessage: string = 'forwarding-success-message'; private readonly locatorForwardingErrorMessage: string = 'forwarding-error-message'; @@ -32,8 +32,7 @@ export class VorgangForwardingE2EComponent { private readonly locatorForwardingMarkAsFailButton: string = 'mark-as-fail-button'; private readonly locatorFailedMessage: string = 'failed-message'; - private readonly forwardingFormular: ForwardFormularE2EComponent = - new ForwardFormularE2EComponent(); + private readonly forwardingFormular: ForwardFormularE2EComponent = new ForwardFormularE2EComponent(); private readonly locatorRoot: string = 'forwarding'; diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forwarding-dialog.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forwarding-dialog.e2e.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..ace192e02ceaee278e0db6c036e249bd35b75ccb --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-forwarding-dialog.e2e.component.ts @@ -0,0 +1,51 @@ +export class ForwardingDialogE2EComponent { + private readonly root: string = 'forwarding-dialog'; + private readonly cancelButton: string = 'cancel-dialog-button'; + private readonly cancelIconButton: string = 'cancel-dialog-icon-button'; + private readonly forwardingButton: string = 'forwarding-dialog-button'; + private readonly searchText: string = 'instant_search-text-input'; + private readonly searchEntry: string = 'item-button'; + private readonly searchItemSelected: string = 'search-item-selected'; + private readonly changeButton: string = 'forwarding-item-change-button'; + private readonly organisationsEinheitSearch: string = 'organisations-einheit-search'; + + public getRoot() { + return cy.getTestElement(this.root); + } + + public getCancelButton() { + return cy.getTestElement(this.cancelButton); + } + + public getCancelIconButton() { + return cy.getTestElement(this.cancelIconButton); + } + + public getForwardingButton() { + return cy.getTestElement(this.forwardingButton); + } + + public getSearchText() { + return cy.getTestElement(this.searchText); + } + + public search(text: string) { + this.getSearchText().type(text); + } + + public clickSearchEntry(index: number): void { + cy.getTestElement(this.searchEntry).eq(index).click(); + } + + public getSearchItemSelected() { + return cy.getTestElement(this.searchItemSelected); + } + + public getChangeButton() { + return cy.getTestElement(this.changeButton); + } + + public getOrganisationsEinheitSearch() { + return cy.getTestElement(this.organisationsEinheitSearch); + } +} diff --git a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts index 9ada0f2e5a1a3f6a6b52e516037e1040e5948fd0..09585caa4a0cf07a4e271b9c0f071afa5b8052da 100644 --- a/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component.ts @@ -23,33 +23,16 @@ */ export class VorgangViewsE2EComponent { private readonly neuViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Neu'); - private readonly angenommenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Angenommen', - ); - private readonly inBearbeitungViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'In_Bearbeitung', - ); - private readonly beschiedenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Beschieden', - ); - private readonly abgeschlossenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Abgeschlossen', - ); - private readonly verworfenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Verworfen', - ); - private readonly zuLoeschenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Zu_Loschen', - ); - private readonly ungelesenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Ungelesen', - ); - private readonly wiedervorlagenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Wiedervorlagen', - ); - private readonly vorgangListViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent( - 'Vorgangsliste', - ); + private readonly angenommenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Angenommen'); + private readonly inBearbeitungViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('In_Bearbeitung'); + private readonly beschiedenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Beschieden'); + private readonly abgeschlossenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Abgeschlossen'); + private readonly weitergeleitetViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Weitergeleitet'); + private readonly verworfenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Verworfen'); + private readonly zuLoeschenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Zu_Loschen'); + private readonly ungelesenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Ungelesen'); + private readonly wiedervorlagenViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Wiedervorlagen'); + private readonly vorgangListViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Vorgangsliste'); private readonly searchViewItem: VorgangViewE2EComponent = new VorgangViewE2EComponent('Suche'); public getNeu(): VorgangViewE2EComponent { @@ -72,6 +55,10 @@ export class VorgangViewsE2EComponent { return this.abgeschlossenViewItem; } + public getWeitergeleitet(): VorgangViewE2EComponent { + return this.weitergeleitetViewItem; + } + public getVerworfen(): VorgangViewE2EComponent { return this.verworfenViewItem; } @@ -108,15 +95,15 @@ export class VorgangViewE2EComponent { this.rootId = rootId; } - public getRoot() { + public getRoot(): Cypress.Chainable<Element> { return cy.getTestElement(`${this.root}${this.rootId}`); } - public getCount() { + public getCount(): Cypress.Chainable<Element> { return this.getRoot().getTestElement(`${this.count}${this.rootId}`); } - public getButton() { + public getButton(): Cypress.Chainable<Element> { return this.getRoot().findTestElementWithClass(this.button); } } diff --git a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.ts b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.ts deleted file mode 100644 index 8b346e0d75ba810435adc064d63adf36e2ef0991..0000000000000000000000000000000000000000 --- a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { registerLocaleData } from '@angular/common'; -import localeDe from '@angular/common/locales/de'; -import localeDeExtra from '@angular/common/locales/extra/de'; -import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; -import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; -import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; -import { VorgangPage } from '../../../page-objects/vorgang.po'; -import { dropCollections } from '../../../support/cypress-helper'; -import { exist, notExist } from '../../../support/cypress.util'; -import { loginAsEmil } from '../../../support/user-util'; -import { createVorgang, initVorgaenge } from '../../../support/vorgang-util'; - -registerLocaleData(localeDe, 'de', localeDeExtra); - -describe('Vorgang weiterleiten innerhalb der OzgCloud', () => { - const mainPage: MainPage = new MainPage(); - const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); - - const vorgangPage: VorgangPage = new VorgangPage(); - const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons(); - - const vorgangWeiterleiten: VorgangE2E = { ...createVorgang(), name: 'Weiterleitung' }; - - before(() => { - initVorgaenge([vorgangWeiterleiten]); - - loginAsEmil(); - - waitForSpinnerToDisappear(); - exist(vorgangList.getRoot()); - }); - - after(() => { - dropCollections(); - }); - - describe('Weiterleiten', () => { - it('should display Weiterleiten button in Status Neu', () => { - vorgangList.getListItem(vorgangWeiterleiten.name).getRoot().click(); - waitForSpinnerToDisappear(); - - notExist(vorgangFormularButtons.getForwardButton()); - }); - }); -}); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email-fail.cy.ts similarity index 76% rename from alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.cy.ts rename to alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email-fail.cy.ts index 717b730610c3be2da7d0f12e9c1f2783c553ae97..e90a6964108c52d02bd0503f615268fc50b0da5b 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email-fail.cy.ts @@ -21,7 +21,8 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { VorgangForwardingE2EComponent } from '../../../components/vorgang/vorgang-forward.e2e.component'; +import { ForwardFormularE2EComponent } from '../../../components/vorgang/vorgang-forward-formular.e2e.component'; +import { ForwardingByEmailE2EComponent } from '../../../components/vorgang/vorgang-forward.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; @@ -32,12 +33,12 @@ import { FORWARDING_INVALID_EMAIL } from '../../../support/data.util'; import { loginAsEmil } from '../../../support/user-util'; import { createVorgang, initVorgang } from '../../../support/vorgang-util'; -describe.skip('{TODO: need to fix with a mock} Vorgang forwarding fail', () => { +describe.skip('{TODO: need to fix with a mock} Vorgang forwarding by email fail', () => { const mainPage: MainPage = new MainPage(); const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); const vorgangPage: VorgangPage = new VorgangPage(); - const forwardingContainer: VorgangForwardingE2EComponent = vorgangPage.getForwardingContainer(); + const forwardingByEmailContainer: ForwardingByEmailE2EComponent = vorgangPage.getForwardingByEmailContainer(); const vorgang: VorgangE2E = createVorgang(); @@ -60,20 +61,20 @@ describe.skip('{TODO: need to fix with a mock} Vorgang forwarding fail', () => { exist(vorgangPage.getVorgangDetailHeader().getRoot()); }); - it('should show forwarding', () => { - exist(forwardingContainer.getRoot()); + it('should show forwarding by email', () => { + exist(forwardingByEmailContainer.getRoot()); }); }); describe('fill forward formular', () => { it('should show spinner with text on valid formular', () => { - const forwardForumlar = forwardingContainer.getFormular(); + const forwardForumlar: ForwardFormularE2EComponent = forwardingByEmailContainer.getFormular(); forwardForumlar.getZustaendigeStelle().clear().type(FORWARDING_INVALID_EMAIL); forwardForumlar.getPasswort().clear().type('validespasswort'); - forwardForumlar.forward(); + forwardForumlar.getForwardButton().click(); - exist(forwardingContainer.getSpinner()); + exist(forwardingByEmailContainer.getSpinner()); }); }); @@ -81,22 +82,19 @@ describe.skip('{TODO: need to fix with a mock} Vorgang forwarding fail', () => { it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG], () => { waitForSpinnerToDisappear(); - haveText( - vorgangPage.getVorgangDetailHeader().getStatus(), - vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG], - ); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); }); it('should show forward fail text', () => { - exist(forwardingContainer.getForwardingErrorMessage()); + exist(forwardingByEmailContainer.getForwardingErrorMessage()); }); it('should NOT show "mark as success" button', () => { - notExist(forwardingContainer.getMarkAsSuccessButton()); + notExist(forwardingByEmailContainer.getMarkAsSuccessButton()); }); it('should show formular', () => { - exist(forwardingContainer.getFormular().getRoot()); + exist(forwardingByEmailContainer.getFormular().getRoot()); }); }); }); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email-failed.cy.ts similarity index 80% rename from alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-cy.ts rename to alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email-failed.cy.ts index f9b5af08c1bffc8e87594aa775c383a222255876..8a9bc49f7aa34bf2e1f47da5d31419bf891ea3b9 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email-failed.cy.ts @@ -21,7 +21,8 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { VorgangForwardingE2EComponent } from '../../../components/vorgang/vorgang-forward.e2e.component'; +import { ForwardFormularE2EComponent } from '../../../components/vorgang/vorgang-forward-formular.e2e.component'; +import { ForwardingByEmailE2EComponent } from '../../../components/vorgang/vorgang-forward.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; @@ -32,12 +33,12 @@ import { FORWARDING_TEST_EMAIL } from '../../../support/data.util'; import { loginAsEmil } from '../../../support/user-util'; import { createVorgang, initVorgang } from '../../../support/vorgang-util'; -describe('Vorgang forwarding failed', () => { +describe.skip('{TODO: needs fixing} Vorgang forwarding by email failed', () => { const mainPage: MainPage = new MainPage(); const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); const vorgangPage: VorgangPage = new VorgangPage(); - const forwardingContainer: VorgangForwardingE2EComponent = vorgangPage.getForwardingContainer(); + const forwardingContainer: ForwardingByEmailE2EComponent = vorgangPage.getForwardingByEmailContainer(); const vorgang: VorgangE2E = createVorgang(); @@ -69,11 +70,11 @@ describe('Vorgang forwarding failed', () => { describe('fill forward formular', () => { it('should show spinner with text on valid formular', { defaultCommandTimeout: 30000 }, () => { - const formular = forwardingContainer.getFormular(); + const formular: ForwardFormularE2EComponent = forwardingContainer.getFormular(); formular.getZustaendigeStelle().clear().type(FORWARDING_TEST_EMAIL); formular.getPasswort().clear().type('validespasswort'); - formular.forward(); + formular.getForwardButton().click(); exist(forwardingContainer.getSpinner()); }); @@ -83,10 +84,7 @@ describe('Vorgang forwarding failed', () => { it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], () => { waitForSpinnerToDisappear(); - haveText( - vorgangPage.getVorgangDetailHeader().getStatus(), - vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], - ); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET]); }); it('should show forward success text', () => { @@ -121,17 +119,11 @@ describe('Vorgang forwarding failed', () => { }); describe('switch to list view', () => { - it( - 'should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG] + ' in list', - () => { - vorgangPage.getSubnavigation().getBackButton().click(); - waitForSpinnerToDisappear(); - - haveText( - vorgangList.getListItem(vorgang.name).getStatus(), - vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG], - ); - }, - ); + it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG] + ' in list', () => { + vorgangPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); + + haveText(vorgangList.getListItem(vorgang.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.IN_BEARBEITUNG]); + }); }); }); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email.cy.ts similarity index 77% rename from alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.cy.ts rename to alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email.cy.ts index f090dd3185bf81dffdb06b6f8f3dc48fc7f378a2..279337199a74e46b323388ba33ca09b47d7a80d6 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-by-email.cy.ts @@ -21,32 +21,23 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { VorgangForwardingE2EComponent } from '../../../components/vorgang/vorgang-forward.e2e.component'; +import { ForwardingByEmailE2EComponent } from '../../../components/vorgang/vorgang-forward.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { dropCollections } from '../../../support/cypress-helper'; import { exist, haveText, haveValue, notExist } from '../../../support/cypress.util'; -import { - FORWARDING_INVALID_EMAIL, - FORWARDING_TEST_EMAIL, - VORGANG_ZUSTAENDIGE_STELLE_EMAIL, -} from '../../../support/data.util'; +import { FORWARDING_INVALID_EMAIL, FORWARDING_TEST_EMAIL, VORGANG_ZUSTAENDIGE_STELLE_EMAIL } from '../../../support/data.util'; import { loginAsEmil } from '../../../support/user-util'; -import { - buildVorgang, - createVorgang, - initVorgaenge, - objectIds, -} from '../../../support/vorgang-util'; - -describe.skip('Vorgang forward', () => { +import { buildVorgang, createVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util'; + +describe.skip('Vorgang forwarding by email', () => { const mainPage: MainPage = new MainPage(); const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); const vorgangPage: VorgangPage = new VorgangPage(); - const forwardingContainer: VorgangForwardingE2EComponent = vorgangPage.getForwardingContainer(); + const forwardingContainer: ForwardingByEmailE2EComponent = vorgangPage.getForwardingByEmailContainer(); const vorgang: VorgangE2E = { ...createVorgang(), name: 'TestVorgangRedirectSpinner' }; const vorgangEmpty: VorgangE2E = buildVorgang(objectIds[0], 'TestVorgangRedirectEmpty'); @@ -77,10 +68,7 @@ describe.skip('Vorgang forward', () => { }); it('should be prefilled', () => { - haveValue( - forwardingContainer.getFormular().getZustaendigeStelle(), - VORGANG_ZUSTAENDIGE_STELLE_EMAIL, - ); + haveValue(forwardingContainer.getFormular().getZustaendigeStelle(), VORGANG_ZUSTAENDIGE_STELLE_EMAIL); }); }); @@ -91,7 +79,7 @@ describe.skip('Vorgang forward', () => { forwardFormular.getZustaendigeStelle().clear().type(FORWARDING_INVALID_EMAIL); //TODO create valid email-address without adding it to landesnetzlist forwardFormular.getPasswort().clear().type('zukurz'); - forwardFormular.forward(); + forwardFormular.getForwardButton().click(); waitForSpinnerToDisappear(); exist(forwardFormular.getPasswortError()); @@ -101,7 +89,7 @@ describe.skip('Vorgang forward', () => { const forwardFormular = forwardingContainer.getFormular(); forwardFormular.getZustaendigeStelle().clear().type(FORWARDING_INVALID_EMAIL); - forwardFormular.forward(); + forwardFormular.getForwardButton().click(); waitForSpinnerToDisappear(); exist(forwardFormular.getZustaendigeStelleError()); @@ -114,7 +102,7 @@ describe.skip('Vorgang forward', () => { forwardFormular.getZustaendigeStelle().clear().type(FORWARDING_TEST_EMAIL); forwardFormular.getPasswort().clear(); - forwardFormular.forward(); + forwardFormular.getForwardButton().click(); exist(forwardingContainer.getSpinner()); }); @@ -122,18 +110,11 @@ describe.skip('Vorgang forward', () => { }); describe('success forwarding', () => { - it( - 'should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], - { defaultCommandTimeout: 30000 }, - () => { - waitForSpinnerToDisappear(); + it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], { defaultCommandTimeout: 30000 }, () => { + waitForSpinnerToDisappear(); - haveText( - vorgangPage.getVorgangDetailHeader().getStatus(), - vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], - ); - }, - ); + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET]); + }); it('should show forward success text', () => { exist(forwardingContainer.getForwardingSuccessMessage()); @@ -156,18 +137,12 @@ describe.skip('Vorgang forward', () => { }); describe('switch to list view', () => { - it( - 'should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET] + ' in list', - () => { - vorgangPage.getSubnavigation().getBackButton().click(); - waitForSpinnerToDisappear(); + it('should have status ' + vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET] + ' in list', () => { + vorgangPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); - haveText( - vorgangList.getListItem(vorgang.name).getStatus(), - vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET], - ); - }, - ); + haveText(vorgangList.getListItem(vorgang.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.WEITERGELEITET]); + }); }); describe('change to non forwarding vorgang', () => { diff --git a/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..82dd57a8ae88f5879ed473712a489e31520d0c0e --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding.cy.ts @@ -0,0 +1,42 @@ +import { registerLocaleData } from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import localeDeExtra from '@angular/common/locales/extra/de'; +import { E2EVorgangNavigator } from '../../../helper/vorgang/vorgang.navigator'; +import { E2EVorgangVerifier } from '../../../helper/vorgang/vorgang.verifier'; +import { VorgangE2E } from '../../../model/vorgang'; +import { dropCollections } from '../../../support/cypress-helper'; +import { loginAsEmil } from '../../../support/user-util'; +import { createVorgang, initVorgaenge } from '../../../support/vorgang-util'; + +registerLocaleData(localeDe, 'de', localeDeExtra); + +describe('Vorgang weiterleiten innerhalb der OzgCloud', () => { + const vorgangNavigator: E2EVorgangNavigator = new E2EVorgangNavigator(); + const vorgangVerifier: E2EVorgangVerifier = new E2EVorgangVerifier(); + + const vorgangWeiterleiten: VorgangE2E = { ...createVorgang(), name: 'Weiterleitung' }; + + before(() => { + initVorgaenge([vorgangWeiterleiten]); + }); + + after(() => { + dropCollections(); + }); + + describe('Weiterleiten', () => { + describe('Emil', () => { + it('should login as Emil', () => { + loginAsEmil(); + }); + + it('should open vorgang', () => { + vorgangNavigator.openVorgangDetailByName(vorgangWeiterleiten.name); + }); + + it('should display Weiterleiten button in Status Neu', () => { + vorgangVerifier.verifyForwardingButtonExists(); + }); + }); + }); +}); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts index a254ba3a092baa3b88fa2579ecf0399e5a83029c..c92fb955a61b78ce58d2222f12b3ff8785c04670 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts @@ -161,6 +161,12 @@ describe('VorgangList Page', () => { isKeyboardFocused(views.getAbgeschlossen().getButton()); }); + it('should focus Weitergeleitet view', () => { + pressTab(); + + isKeyboardFocused(views.getWeitergeleitet().getButton()); + }); + it('should focus Verworfen view', () => { pressTab(); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-forward.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-forward.ts deleted file mode 100644 index d4661c6d5f536cda3e4286f4064b157cd5e56cf0..0000000000000000000000000000000000000000 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-forward.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { registerLocaleData } from '@angular/common'; -import localeDe from '@angular/common/locales/de'; -import localeDeExtra from '@angular/common/locales/extra/de'; -import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; -import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; -import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; -import { VorgangPage } from '../../../page-objects/vorgang.po'; -import { dropCollections } from '../../../support/cypress-helper'; -import { exist, notExist } from '../../../support/cypress.util'; -import { loginAsPeter, loginAsSabine } from '../../../support/user-util'; -import { createVorgang, initVorgaenge } from '../../../support/vorgang-util'; - -registerLocaleData(localeDe, 'de', localeDeExtra); - -describe('Vorgang weiterleiten innerhalb der OzgCloud', () => { - const mainPage: MainPage = new MainPage(); - const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); - - const vorgangPage: VorgangPage = new VorgangPage(); - const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons(); - - const vorgangWeiterleiten: VorgangE2E = { ...createVorgang(), name: 'Weiterleitung' }; - - after(() => { - dropCollections(); - }); - - describe('For Sabine', () => { - before(() => { - initVorgaenge([vorgangWeiterleiten]); - - loginAsSabine(); - - waitForSpinnerToDisappear(); - exist(vorgangList.getRoot()); - }); - - it('should display Weiterleiten button in Status Neu', () => { - vorgangList.getListItem(vorgangWeiterleiten.name).getRoot().click(); - waitForSpinnerToDisappear(); - - exist(vorgangFormularButtons.getForwardButton()); - }); - - it('should not display Weiterleiten button in Status Angenommen', () => { - vorgangFormularButtons.getAnnehmenButton().click(); - waitForSpinnerToDisappear(); - - notExist(vorgangFormularButtons.getForwardButton()); - }); - - it('should not display Weiterleiten button in Status In Bearbeitung', () => { - vorgangFormularButtons.getBearbeitenButton().click(); - waitForSpinnerToDisappear(); - - notExist(vorgangFormularButtons.getForwardButton()); - }); - }); - - describe('For Peter', () => { - before(() => { - initVorgaenge([vorgangWeiterleiten]); - - loginAsPeter(); - - waitForSpinnerToDisappear(); - exist(vorgangList.getRoot()); - }); - - it('should not display Weiterleiten button in Status In Neu', () => { - vorgangList.getListItem(vorgangWeiterleiten.name).getRoot().click(); - waitForSpinnerToDisappear(); - - notExist(vorgangFormularButtons.getForwardButton()); - }); - }); -}); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-forwarding.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-forwarding.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..e0b1b6c25c3da5d05e92a55ae8c01b0cfd33bb63 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-forwarding.cy.ts @@ -0,0 +1,148 @@ +import { registerLocaleData } from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import localeDeExtra from '@angular/common/locales/extra/de'; +import { VorgangFormularButtonsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; +import { ForwardingDialogE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-forwarding-dialog.e2e.component'; +import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; +import { E2EVorgangNavigator } from '../../../helper/vorgang/vorgang.navigator'; +import { E2EVorgangVerifier } from '../../../helper/vorgang/vorgang.verifier'; +import { VorgangE2E } from '../../../model/vorgang'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; +import { VorgangPage } from '../../../page-objects/vorgang.po'; +import { dropCollections } from '../../../support/cypress-helper'; +import { beAriaDisabled, contains, exist, notBeAriaDisabled, notExist } from '../../../support/cypress.util'; +import { loginAsPeter, loginAsSabine } from '../../../support/user-util'; +import { createVorgang, initVorgaenge } from '../../../support/vorgang-util'; + +registerLocaleData(localeDe, 'de', localeDeExtra); + +describe('Vorgang weiterleiten', () => { + const vorgangNavigator: E2EVorgangNavigator = new E2EVorgangNavigator(); + const vorgangVerifier: E2EVorgangVerifier = new E2EVorgangVerifier(); + + const mainPage: MainPage = new MainPage(); + const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); + + const organisationsEinheitName = 'Landeshauptstadt Kiel - Pries-Friedrichsort Stadtteilamt'; + const organisationsEinheitAddress = 'An der Schanze 45, 24159 Kiel'; + + const vorgangPage: VorgangPage = new VorgangPage(); + const forwardingDialog: ForwardingDialogE2EComponent = vorgangPage.getForwardingDialogContainer(); + const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons(); + + const vorgangWeiterleiten: VorgangE2E = { ...createVorgang(), name: 'Weiterleitung' }; + + after(() => { + dropCollections(); + }); + + describe('For Sabine', () => { + before(() => { + initVorgaenge([vorgangWeiterleiten]); + + loginAsSabine(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }); + + it('should display Weiterleiten button in Status Neu', () => { + vorgangList.getListItem(vorgangWeiterleiten.name).getRoot().click(); + waitForSpinnerToDisappear(); + + vorgangVerifier.verifyForwardingButtonExists(); + }); + + it('should open forwarding dialog on forward button click', () => { + vorgangFormularButtons.getForwardButton().click(); + + exist(forwardingDialog.getRoot()); + }); + + it('should have organisations einheit search', () => { + exist(forwardingDialog.getOrganisationsEinheitSearch()); + }); + + it('should have disabled forwarding button', () => { + beAriaDisabled(forwardingDialog.getForwardingButton()); + }); + + it('should close dialog on escape', () => { + forwardingDialog.getRoot().type('{esc}'); + + notExist(forwardingDialog.getRoot()); + }); + + it('should close dialog on abbrechen button', () => { + vorgangFormularButtons.getForwardButton().click(); + forwardingDialog.getCancelButton().click(); + + notExist(forwardingDialog.getRoot()); + }); + + it('should close dialog on x icon', () => { + vorgangFormularButtons.getForwardButton().click(); + forwardingDialog.getCancelIconButton().click(); + + notExist(forwardingDialog.getRoot()); + }); + + it('should show selected search item on search select', () => { + vorgangFormularButtons.getForwardButton().click(); + forwardingDialog.search(organisationsEinheitName); + forwardingDialog.clickSearchEntry(0); + + exist(forwardingDialog.getSearchItemSelected()); + contains(forwardingDialog.getSearchItemSelected(), organisationsEinheitName); + contains(forwardingDialog.getSearchItemSelected(), organisationsEinheitAddress); + }); + + it('should not show zufi search on search select', () => { + notExist(forwardingDialog.getOrganisationsEinheitSearch()); + }); + + it('should not disable forwarding button on search select', () => { + notBeAriaDisabled(forwardingDialog.getForwardingButton()); + }); + + it('should clear selected search item on change button click', () => { + forwardingDialog.getChangeButton().click(); + + notExist(forwardingDialog.getSearchItemSelected()); + exist(forwardingDialog.getOrganisationsEinheitSearch()); + beAriaDisabled(forwardingDialog.getForwardingButton()); + }); + + it('should not display Weiterleiten button in status Angenommen', () => { + forwardingDialog.getCancelButton().click(); + vorgangFormularButtons.getAnnehmenButton().click(); + waitForSpinnerToDisappear(); + + vorgangVerifier.verifyNoForwardingButtonExists(); + }); + + it('should not display Weiterleiten button in status In Bearbeitung', () => { + vorgangFormularButtons.getBearbeitenButton().click(); + waitForSpinnerToDisappear(); + + vorgangVerifier.verifyNoForwardingButtonExists(); + }); + }); + + describe('For Peter', () => { + before(() => { + initVorgaenge([vorgangWeiterleiten]); + + loginAsPeter(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }); + + it('should display Weiterleiten button in Status In Neu', () => { + vorgangNavigator.openVorgangDetailByName(vorgangWeiterleiten.name); + + vorgangVerifier.verifyForwardingButtonExists(); + }); + }); +}); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts index 2a2316dfc645ba0cbb99af05b34b041ce5d7646e..d8374f8aa947247e627e8d5d437f4aca9f61c9a7 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts @@ -23,13 +23,22 @@ */ import { NavigationE2EComponent } from 'apps/alfa-e2e/src/components/navigation/navigation.e2e.component'; import { VorgangListE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-list.e2e.component'; -import { VorgangViewsE2EComponent } from 'apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component'; +import { + VorgangViewE2EComponent, + VorgangViewsE2EComponent, +} from 'apps/alfa-e2e/src/components/vorgang/vorgang-views.e2e.component'; import { MainPage, waitForSpinnerToDisappear } from 'apps/alfa-e2e/src/page-objects/main.po'; import { exist } from 'apps/alfa-e2e/src/support/cypress.util'; import { Interception } from 'cypress/types/net-stubbing'; import { HttpMethodE2E } from '../../../model/util'; import { VorgangE2E, VorgangStatusE2E } from '../../../model/vorgang'; -import { dropCollections, intercept, scrollToWindowBottom, waitOfInterceptor } from '../../../support/cypress-helper'; +import { + dropCollections, + intercept, + scrollToWindowBottom, + scrollToWindowTop, + waitOfInterceptor, +} from '../../../support/cypress-helper'; import { generateIds } from '../../../support/tech.util'; import { getUserSabineId, initUsermanagerUsers, loginAsSabine } from '../../../support/user-util'; import { buildVorgang, initVorgaenge } from '../../../support/vorgang-util'; @@ -43,6 +52,7 @@ describe('VorgangList View Pages', () => { const views: VorgangViewsE2EComponent = mainPage.getViews(); + const VORGANG_NAME_PREFIX: string = 'Vorgang'; const PAGE_SIZE: number = 100; const assignedTo: string = getUserSabineId(); @@ -57,6 +67,8 @@ describe('VorgangList View Pages', () => { createAssignedVorgaengeWithStatus(VorgangStatusE2E.BESCHIEDEN), createVorgaengeWithStatus(VorgangStatusE2E.ABGESCHLOSSEN), createAssignedVorgaengeWithStatus(VorgangStatusE2E.ABGESCHLOSSEN), + createVorgaengeWithStatus(VorgangStatusE2E.WEITERGELEITET), + createAssignedVorgaengeWithStatus(VorgangStatusE2E.WEITERGELEITET), createVorgaengeWithStatus(VorgangStatusE2E.VERWORFEN), createAssignedVorgaengeWithStatus(VorgangStatusE2E.VERWORFEN), ); @@ -73,914 +85,259 @@ describe('VorgangList View Pages', () => { }); describe('Neu', () => { - const ALLE_NAME_PREFIX: string = 'VorgangNEU_'; - const MEINE_VORGAENGE_NAME_PREFIX: string = 'VorgangNEUAssigned_'; + const STATUS: string = VorgangStatusE2E.NEU; - describe('Alle filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangNeuPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge NEU', () => { - views.getNeu().getRoot().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangNeuPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge NEU and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 3', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangNeuPageLink(3)).as(loadPageInterceptor); - }); - - it('should show page 3 with 10 vorgaenge NEU ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 20); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 80); - assert(interception.response.body._embedded.vorgangHeaderList[19].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - function buildVorgangNeuPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&status=NEU`; - } - }); - - describe('Meine Vorgänge filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangNeuAssignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge NEU', () => { - navigation.getMeineVorgaengeFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangNeuAssignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge NEU and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, MEINE_VORGAENGE_NAME_PREFIX + 110); - }); - }); - }); - - function buildVorgangNeuAssignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=${assignedTo}&status=NEU`; - } - }); - - describe('Nicht zugewiesen filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangUnassignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge NEU', () => { - navigation.getUnassignedFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangUnassignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, ALLE_NAME_PREFIX + 110); - }); - }); - }); - - function buildVorgangUnassignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=&status=NEU`; - } - }); + testAlleFilter(STATUS, views.getNeu()); + testMeineVorgaengeFilter(STATUS); + testNichtZugewiesenFilter(STATUS); }); describe('Angenommen', () => { - const ALLE_NAME_PREFIX: string = 'VorgangANGENOMMEN_'; - const MEINE_VORGAENGE_NAME_PREFIX: string = 'VorgangANGENOMMENAssigned_'; - - describe('Alle filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - navigation.getAlleFilter().click(); - waitForSpinnerToDisappear(); - intercept(HttpMethodE2E.GET, buildVorgangAngenommenPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge ANGENOMMEN', () => { - views.getAngenommen().getRoot().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAngenommenPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge ANGENOMMEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 3', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAngenommenPageLink(3)).as(loadPageInterceptor); - }); - - it('should show page 3 with 10 vorgaenge ANGENOMMEN ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); + const STATUS: string = VorgangStatusE2E.ANGENOMMEN; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 20); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 80); - assert(interception.response.body._embedded.vorgangHeaderList[19].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - function buildVorgangAngenommenPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&status=ANGENOMMEN`; - } - }); - - describe('Meine Vorgänge filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAngenommenAssignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge ANGENOMMEN', () => { - navigation.getMeineVorgaengeFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAngenommenAssignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge ANGENOMMEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, MEINE_VORGAENGE_NAME_PREFIX + 110); - }); - }); - }); - - function buildVorgangAngenommenAssignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=${assignedTo}&status=ANGENOMMEN`; - } - }); - - describe('Nicht zugewiesen filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAngenommenUnassignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge ANGENOMMEN', () => { - navigation.getUnassignedFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAngenommenUnassignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, ALLE_NAME_PREFIX + 110); - }); - }); - }); - - function buildVorgangAngenommenUnassignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=&status=ANGENOMMEN`; - } - }); + testAlleFilter(STATUS, views.getAngenommen()); + testMeineVorgaengeFilter(STATUS); + testNichtZugewiesenFilter(STATUS); }); describe('In Bearbeitung', () => { - const ALLE_NAME_PREFIX: string = 'VorgangIN_BEARBEITUNG_'; - const MEINE_VORGAENGE_NAME_PREFIX: string = 'VorgangIN_BEARBEITUNGAssigned_'; + const STATUS: string = VorgangStatusE2E.IN_BEARBEITUNG; - describe('Alle filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - navigation.getAlleFilter().click(); - waitForSpinnerToDisappear(); - intercept(HttpMethodE2E.GET, buildVorgangInBearbeitungPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge IN_BEARBEITUNG', () => { - views.getInBearbeitung().getRoot().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); + testAlleFilter(STATUS, views.getInBearbeitung()); + testMeineVorgaengeFilter(STATUS); + testNichtZugewiesenFilter(STATUS); + }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; + describe('Bescheiden', () => { + const STATUS: string = VorgangStatusE2E.BESCHIEDEN; - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBearbeitungPageLink(2)).as(loadPageInterceptor); - }); + testAlleFilter(STATUS, views.getBeschieden()); + testMeineVorgaengeFilter(STATUS); + testNichtZugewiesenFilter(STATUS); + }); - it('should show page 2 with 10 vorgaenge IN_BEARBEITUNG and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); + describe('Abgeschlossen', () => { + const STATUS: string = VorgangStatusE2E.ABGESCHLOSSEN; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); + testAlleFilter(STATUS, views.getAbgeschlossen()); + testMeineVorgaengeFilter(STATUS); + testNichtZugewiesenFilter(STATUS); + }); - describe('page 3', () => { - const loadPageInterceptor: string = 'loadPage'; + describe('Weitergeleitet', () => { + const STATUS: string = VorgangStatusE2E.WEITERGELEITET; - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBearbeitungPageLink(3)).as(loadPageInterceptor); - }); + testAlleFilter(STATUS, views.getWeitergeleitet()); + testMeineVorgaengeFilter(STATUS); + testNichtZugewiesenFilter(STATUS); + }); - it('should show page 3 with 10 vorgaenge IN_BEARBEITUNG ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); + describe('Verworfen', () => { + const STATUS: string = VorgangStatusE2E.VERWORFEN; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 20); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 80); - assert(interception.response.body._embedded.vorgangHeaderList[19].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); + testAlleFilter(STATUS, views.getVerworfen()); + testMeineVorgaengeFilter(STATUS); + testNichtZugewiesenFilter(STATUS); + }); - function buildVorgangInBearbeitungPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&status=IN_BEARBEITUNG`; - } + function testAlleFilter(status: string, view: VorgangViewE2EComponent) { + describe('Alle filter', () => { + testAlleFilterPage1(status, view); + testAlleFilterPage2(status); + testAlleFilterPage3(status); }); + } - describe('Meine Vorgänge filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBearbeitungAssignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge IN_BEARBEITUNG', () => { - navigation.getMeineVorgaengeFilter().click(); + function testAlleFilterPage1(status: string, view: VorgangViewE2EComponent): void { + describe('page 1', () => { + const loadPageInterceptor: string = 'loadPage'; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); + beforeEach(() => { + navigation.getAlleFilter().click(); + waitForSpinnerToDisappear(); + intercept(HttpMethodE2E.GET, buildVorgangStatusPageLink(1, status)).as(loadPageInterceptor); }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; + it(`should show page 1 with 100 vorgaenge ${status}`, () => { + view.getRoot().click(); - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBearbeitungAssignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge IN_BEARBEITUNG and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, MEINE_VORGAENGE_NAME_PREFIX + 110); - }); + waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { + assert(getVorgangList(interception).length === PAGE_SIZE); + assert(getVorgangList(interception)[0].name, VORGANG_NAME_PREFIX + status + 1); + assert(getVorgangList(interception)[99].name, VORGANG_NAME_PREFIX + status + PAGE_SIZE); }); }); - - function buildVorgangInBearbeitungAssignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=${assignedTo}&status=IN_BEARBEITUNG`; - } }); + } - describe('Nicht zugewiesen filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBearbeitungUnassignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge IN_BEARBEITUNG', () => { - navigation.getUnassignedFilter().click(); + function testAlleFilterPage2(status: string): void { + describe('page 2', () => { + const loadPageInterceptor: string = 'loadPage'; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); + beforeEach(() => { + intercept(HttpMethodE2E.GET, buildVorgangStatusPageLink(2, status)).as(loadPageInterceptor); }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; + it(`should show page 2 with 10 vorgaenge ${status} and 90 vorgaenge ASSIGNED on scrolling to bottom`, () => { + scrollToWindowBottom(); - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBearbeitungUnassignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, ALLE_NAME_PREFIX + 110); - }); + waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { + assert(getVorgangList(interception).length === PAGE_SIZE); + assert(getVorgangList(interception)[0].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + 1); + assert(getVorgangList(interception)[99].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + PAGE_SIZE); }); }); - - function buildVorgangInBearbeitungUnassignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=&status=IN_BEARBEITUNG`; - } }); - }); - - describe('Beschieden', () => { - const ALLE_NAME_PREFIX: string = 'VorgangBESCHIEDEN_'; - const MEINE_VORGAENGE_NAME_PREFIX: string = 'VorgangBESCHIEDENAssigned_'; - - describe('Alle filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - navigation.getAlleFilter().click(); - waitForSpinnerToDisappear(); - intercept(HttpMethodE2E.GET, buildVorgangBeschiedenPageLink(1)).as(loadPageInterceptor); - }); + } - it('should show page 1 with 100 vorgaenge BESCHIEDEN', () => { - views.getBeschieden().getRoot().click(); + function testAlleFilterPage3(status: string): void { + describe('page 3', () => { + const loadPageInterceptor: string = 'loadPage'; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); + beforeEach(() => { + intercept(HttpMethodE2E.GET, buildVorgangStatusPageLink(3, status)).as(loadPageInterceptor); }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangBeschiedenPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge BESCHIEDEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); + after(() => { + scrollToWindowTop(); }); - describe('page 3', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangBeschiedenPageLink(3)).as(loadPageInterceptor); - }); - - it('should show page 3 with 10 vorgaenge BESCHIEDEN ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); + it(`should show page 3 with 10 vorgaenge ${status} ASSIGNED on scrolling to bottom`, () => { + scrollToWindowBottom(); - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 20); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 80); - assert(interception.response.body._embedded.vorgangHeaderList[19].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); + waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { + assert(getVorgangList(interception).length === 20); + assert(getVorgangList(interception)[0].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + 80); + assert(getVorgangList(interception)[19].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + PAGE_SIZE); }); }); - - function buildVorgangBeschiedenPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&status=BESCHIEDEN`; - } }); + } - describe('Meine Vorgänge filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBescheidenAssignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge BESCHIEDEN', () => { - navigation.getMeineVorgaengeFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBescheidenAssignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge BESCHIEDEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, MEINE_VORGAENGE_NAME_PREFIX + 110); - }); - }); - }); + function buildVorgangStatusPageLink(page: number, status: string): string { + return `${buildVorgangPageLink(page)}&status=${status}`; + } - function buildVorgangInBescheidenAssignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=${assignedTo}&status=BESCHIEDEN`; - } + function testMeineVorgaengeFilter(status: string): void { + describe('Meine Vorgänge filter', () => { + testMeineVorgaengePage1(status); + testMeineVorgaengePage2(status); }); + } - describe('Nicht zugewiesen filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBescheidenUnassignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge BESCHIEDEN', () => { - navigation.getUnassignedFilter().click(); + function testMeineVorgaengePage1(status: string): void { + describe('page 1', () => { + const loadPageInterceptor: string = 'loadPage'; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); + beforeEach(() => { + intercept(HttpMethodE2E.GET, buildVorgangInStatusAssignedPageLink(1, status)).as(loadPageInterceptor); }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; + it(`should show page 1 with 100 vorgaenge ${status}`, () => { + navigation.getMeineVorgaengeFilter().click(); - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInBescheidenUnassignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, ALLE_NAME_PREFIX + 110); - }); + waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { + assert(getVorgangList(interception).length === PAGE_SIZE); + assert(getVorgangList(interception)[0].name, VORGANG_NAME_PREFIX + 'Assigned_' + 1); + assert(getVorgangList(interception)[99].name, VORGANG_NAME_PREFIX + 'Assigned_' + PAGE_SIZE); }); }); - - function buildVorgangInBescheidenUnassignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=&status=BESCHIEDEN`; - } }); - }); - - describe('Abgeschlossen', () => { - const ALLE_NAME_PREFIX: string = 'VorgangABGESCHLOSSEN_'; - const MEINE_VORGAENGE_NAME_PREFIX: string = 'VorgangABGESCHLOSSENAssigned_'; - - describe('Alle filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - navigation.getAlleFilter().click(); - waitForSpinnerToDisappear(); - intercept(HttpMethodE2E.GET, buildVorgangAbgeschlossenPageLink(1)).as(loadPageInterceptor); - }); + } - it('should show page 1 with 100 vorgaenge ABGESCHLOSSEN', () => { - views.getAbgeschlossen().getRoot().click(); + function testMeineVorgaengePage2(status: string): void { + describe('page 2', () => { + const loadPageInterceptor: string = 'loadPage'; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); + beforeEach(() => { + intercept(HttpMethodE2E.GET, buildVorgangInStatusAssignedPageLink(2, status)).as(loadPageInterceptor); }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAbgeschlossenPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge ABGESCHLOSSEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); + after(() => { + scrollToWindowTop(); }); - describe('page 3', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangAbgeschlossenPageLink(3)).as(loadPageInterceptor); - }); - - it('should show page 3 with 10 vorgaenge ABGESCHLOSSEN ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); + it(`should show page 2 with 10 vorgaenge ${status} and 90 vorgaenge ASSIGNED on scrolling to bottom`, () => { + scrollToWindowBottom(); - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 20); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 80); - assert(interception.response.body._embedded.vorgangHeaderList[19].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); + waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { + assert(getVorgangList(interception).length === 10); + assert(getVorgangList(interception)[0].name, VORGANG_NAME_PREFIX + 'Assigned_' + 101); + assert(getVorgangList(interception)[9].name, VORGANG_NAME_PREFIX + 'Assigned_' + 110); }); }); - - function buildVorgangAbgeschlossenPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&status=ABGESCHLOSSEN`; - } }); + } - describe('Meine Vorgänge filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInAbgeschlossenAssignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge ABGESCHLOSSEN', () => { - navigation.getMeineVorgaengeFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInAbgeschlossenAssignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge ABGESCHLOSSEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, MEINE_VORGAENGE_NAME_PREFIX + 110); - }); - }); - }); - - function buildVorgangInAbgeschlossenAssignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=${assignedTo}&status=ABGESCHLOSSEN`; - } - }); + function buildVorgangInStatusAssignedPageLink(page: number, status: string): string { + return `${buildVorgangPageLink(page)}&assignedTo=${assignedTo}&status=${status}`; + } + function testNichtZugewiesenFilter(status: string): void { describe('Nicht zugewiesen filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInAbgeschlossenUnassignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge ABGESCHLOSSEN', () => { - navigation.getUnassignedFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInAbgeschlossenUnassignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, MEINE_VORGAENGE_NAME_PREFIX + 110); - }); - }); - }); - - function buildVorgangInAbgeschlossenUnassignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=&status=ABGESCHLOSSEN`; - } + testNichtZugewiesenPage1(status); + testNichtZugewiesenPage2(status); }); - }); - - describe('Verworfen', () => { - const ALLE_NAME_PREFIX: string = 'VorgangVERWORFEN_'; - const MEINE_VORGAENGE_NAME_PREFIX: string = 'VorgangVERWORFENAssigned_'; - - describe('Alle filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - navigation.getAlleFilter().click(); - waitForSpinnerToDisappear(); - intercept(HttpMethodE2E.GET, buildVorgangVerworfenPageLink(1)).as(loadPageInterceptor); - }); + } - it('should show page 1 with 100 vorgaenge VERWORFEN', () => { - views.getVerworfen().getRoot().click(); + function testNichtZugewiesenPage1(status: string): void { + describe('page 1', () => { + const loadPageInterceptor: string = 'loadPage'; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); + beforeEach(() => { + intercept(HttpMethodE2E.GET, buildVorgangInStatusUnassignedPageLink(1, status)).as(loadPageInterceptor); }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; + it(`should show page 1 with 100 vorgaeng ${status}`, () => { + navigation.getUnassignedFilter().click(); - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangVerworfenPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge VERWORFEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); + waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { + assert(getVorgangList(interception).length === PAGE_SIZE); + assert(getVorgangList(interception)[0].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + 1); + assert(getVorgangList(interception)[99].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + PAGE_SIZE); }); }); - - describe('page 3', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangVerworfenPageLink(3)).as(loadPageInterceptor); - }); - - it('should show page 3 with 10 vorgaenge VERWORFEN ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 20); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 80); - assert(interception.response.body._embedded.vorgangHeaderList[19].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - function buildVorgangVerworfenPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&status=VERWORFEN`; - } }); + } - describe('Meine Vorgänge filter', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInVerworfenAssignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge VERWORFEN', () => { - navigation.getMeineVorgaengeFilter().click(); + function testNichtZugewiesenPage2(status: string): void { + describe('page 2', () => { + const loadPageInterceptor: string = 'loadPage'; - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, MEINE_VORGAENGE_NAME_PREFIX + PAGE_SIZE); - }); - }); + beforeEach(() => { + intercept(HttpMethodE2E.GET, buildVorgangInStatusUnassignedPageLink(2, status)).as(loadPageInterceptor); }); - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; + it('should show page 2 with 10 vorgaenge on scrolling to bottom', () => { + scrollToWindowBottom(); - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInVerworfenAssignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge VERWORFEN and 90 vorgaenge ASSIGNED on scrolling to bottom', () => { - scrollToWindowBottom(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, MEINE_VORGAENGE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, MEINE_VORGAENGE_NAME_PREFIX + 110); - }); + waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { + assert(getVorgangList(interception).length === 10); + assert(getVorgangList(interception)[0].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + 101); + assert(getVorgangList(interception)[9].name, VORGANG_NAME_PREFIX + status + 'Assigned_' + 110); }); + scrollToWindowTop(); }); - - function buildVorgangInVerworfenAssignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=${assignedTo}&status=VERWORFEN`; - } }); + } - describe('Nicht zugewiesen', () => { - describe('page 1', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInVerworfenUnassignedPageLink(1)).as(loadPageInterceptor); - }); - - it('should show page 1 with 100 vorgaenge VERWORFEN', () => { - navigation.getUnassignedFilter().click(); - - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === PAGE_SIZE); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 1); - assert(interception.response.body._embedded.vorgangHeaderList[99].name, ALLE_NAME_PREFIX + PAGE_SIZE); - }); - }); - }); - - describe('page 2', () => { - const loadPageInterceptor: string = 'loadPage'; - - beforeEach(() => { - intercept(HttpMethodE2E.GET, buildVorgangInVerworfenUnassignedPageLink(2)).as(loadPageInterceptor); - }); - - it('should show page 2 with 10 vorgaenge on scrolling to bottom', () => { - scrollToWindowBottom(); + function buildVorgangInStatusUnassignedPageLink(page: number, status: string): string { + return `${buildVorgangPageLink(page)}&assignedTo=&status=${status}`; + } - waitOfInterceptor(loadPageInterceptor).then((interception: Interception) => { - assert(interception.response.body._embedded.vorgangHeaderList.length === 10); - assert(interception.response.body._embedded.vorgangHeaderList[0].name, ALLE_NAME_PREFIX + 101); - assert(interception.response.body._embedded.vorgangHeaderList[9].name, ALLE_NAME_PREFIX + 110); - }); - }); - }); + function buildVorgangPageLink(page: number): string { + return `vorgangs?page=${page - 1}&limit=100`; + } - function buildVorgangInVerworfenUnassignedPageLink(page: number): string { - return `${buildVorgangPageLink(page)}&assignedTo=&status=VERWORFEN`; - } - }); - }); + function getVorgangList(interception: Interception): VorgangE2E[] { + return interception.response.body._embedded.vorgangHeaderList; + } function createVorgaengeWithStatus(status: VorgangStatusE2E): VorgangE2E[] { let count = 1; return generateIds(110).map((randomId) => { const vorgang: VorgangE2E = { - ...buildVorgang(randomId, 'Vorgang' + status + '_' + count), + ...buildVorgang(randomId, VORGANG_NAME_PREFIX + status + '_' + count), status, }; count++; @@ -992,7 +349,7 @@ describe('VorgangList View Pages', () => { let count = 1; return generateIds(110).map((randomId) => { const vorgang: VorgangE2E = { - ...buildVorgang(randomId, 'Vorgang' + status + 'Assigned_' + count), + ...buildVorgang(randomId, VORGANG_NAME_PREFIX + status + 'Assigned_' + count), status, assignedTo, }; @@ -1000,8 +357,4 @@ describe('VorgangList View Pages', () => { return vorgang; }); } - - function buildVorgangPageLink(page: number): string { - return `vorgangs?page=${page - 1}&limit=100`; - } }); diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts index 2547f4523c44b68ebd98dacc223c38f8db94abf0..d2b2f5c137420c986239141c7b60c4dff57868f0 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts @@ -66,12 +66,29 @@ describe('Vorgang views and filter', () => { const inBearbeitungView: VorgangViewE2EComponent = views.getInBearbeitung(); const beschiedenView: VorgangViewE2EComponent = views.getBeschieden(); const abgeschlossenView: VorgangViewE2EComponent = views.getAbgeschlossen(); + const weitergeleitetView: VorgangViewE2EComponent = views.getWeitergeleitet(); const verworfenView: VorgangViewE2EComponent = views.getVerworfen(); const zuLoeschenView: VorgangViewE2EComponent = views.getZuLoeschen(); + const ungelesenView: VorgangViewE2EComponent = views.getUngelesen(); const wiedervorlagenView: VorgangViewE2EComponent = views.getWiedervorlagen(); const vorgangListView: VorgangViewE2EComponent = views.getVorgangList(); const sucheView: VorgangViewE2EComponent = views.getSuche(); + const ALL_VIEW_COMPONENTS: VorgangViewE2EComponent[] = [ + neuView, + angenommenView, + inBearbeitungView, + beschiedenView, + abgeschlossenView, + weitergeleitetView, + verworfenView, + zuLoeschenView, + ungelesenView, + wiedervorlagenView, + vorgangListView, + sucheView, + ]; + const navigation: NavigationE2EComponent = mainPage.getNavigation(); const vorgangNeuAssigned: VorgangE2E = { @@ -134,6 +151,16 @@ describe('Vorgang views and filter', () => { status: VorgangStatusE2E.ABGESCHLOSSEN, }; + const vorgangWeitergeleitetAssigned: VorgangE2E = { + ...buildVorgang(objectIds[13], 'VorgangWeitergeleitetAssigned'), + status: VorgangStatusE2E.WEITERGELEITET, + assignedTo: getUserSabineId(), + }; + const vorgangWeitergeleitetUnassigned: VorgangE2E = { + ...buildVorgang(objectIds[14], 'VorgangWeitergeleitetUnassigned'), + status: VorgangStatusE2E.WEITERGELEITET, + }; + const vorgangVerworfenAssigned: VorgangE2E = { ...buildVorgang(objectIds[9], 'VorgangVerworfenAssigned'), status: VorgangStatusE2E.VERWORFEN, @@ -181,6 +208,13 @@ describe('Vorgang views and filter', () => { vorgangAbgeschlossenUnassigned.name, ); + const vorgangWeitergeleitetAssignedInList: VorgangListItemE2EComponent = vorgangList.getListItem( + vorgangWeitergeleitetAssigned.name, + ); + const vorgangWeitergeleitetUnassignedInList: VorgangListItemE2EComponent = vorgangList.getListItem( + vorgangWeitergeleitetUnassigned.name, + ); + const vorgangVerworfenAssignedInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangVerworfenAssigned.name); const vorgangVerworfenUnassignedInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangVerworfenUnassigned.name); @@ -189,7 +223,7 @@ describe('Vorgang views and filter', () => { vorgangZuLoeschenUnassigned.name, ); - const LIST_SIZE: number = 14; + const LIST_SIZE: number = 16; before(() => { const vorgaenge: VorgangE2E[] = [ @@ -203,6 +237,8 @@ describe('Vorgang views and filter', () => { vorgangBeschiedenUnassigned, vorgangAbgeschlossenAssigned, vorgangAbgeschlossenUnassigned, + vorgangWeitergeleitetAssigned, + vorgangWeitergeleitetUnassigned, vorgangVerworfenAssigned, vorgangVerworfenUnassigned, vorgangZuLoeschenAssigned, @@ -214,8 +250,6 @@ describe('Vorgang views and filter', () => { initUsermanagerUsers(); loginAsSabine(); - - waitForSpinnerToDisappear(); }); after(() => { @@ -257,6 +291,7 @@ describe('Vorgang views and filter', () => { isNotSelected(inBearbeitungView.getRoot()); isNotSelected(beschiedenView.getRoot()); isNotSelected(abgeschlossenView.getRoot()); + isNotSelected(weitergeleitetView.getRoot()); isNotSelected(verworfenView.getRoot()); isNotSelected(zuLoeschenView.getRoot()); isNotSelected(sucheView.getRoot()); @@ -283,6 +318,10 @@ describe('Vorgang views and filter', () => { contains(abgeschlossenView.getCount(), '2'); }); + it('weitergeleitet', () => { + contains(abgeschlossenView.getCount(), '2'); + }); + it('verworfen', () => { contains(verworfenView.getCount(), '2'); }); @@ -300,262 +339,82 @@ describe('Vorgang views and filter', () => { describe('Select view', () => { describe('Neu', () => { - it('should set selected after click', () => { - neuView.getRoot().click(); - waitForSpinnerToDisappear(); - - isSelected(neuView.getRoot()); - }); - - it('should unselect other views', () => { - isNotSelected(angenommenView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); - - it('should filter List', () => { - haveLength(vorgangList.getItems(), 2); - exist(vorgangNeuAssignedInList.getRoot()); - exist(vorgangNeuUnassignedInList.getRoot()); - }); + testAlleFilterViewSelection(neuView, [vorgangNeuAssignedInList, vorgangNeuUnassignedInList]); }); describe('Angenommen', () => { - it('should set selected after click', () => { - angenommenView.getRoot().click(); - waitForSpinnerToDisappear(); - - isSelected(angenommenView.getRoot()); - }); - - it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); - - it('should filter List', () => { - haveLength(vorgangList.getItems(), 2); - exist(vorgangAngenommenAssignedInList.getRoot()); - exist(vorgangAngenommenUnassignedInList.getRoot()); - }); + testAlleFilterViewSelection(angenommenView, [vorgangAngenommenAssignedInList, vorgangAngenommenUnassignedInList]); }); describe('In Bearbeitung', () => { - it('should set selected after click', () => { - inBearbeitungView.getRoot().click(); - waitForSpinnerToDisappear(); - - isSelected(inBearbeitungView.getRoot()); - }); - - it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(angenommenView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); - - it('should filter List', () => { - haveLength(vorgangList.getItems(), LIST_SIZE - 12); - exist(vorgangInBearbeitungAssignedInList.getRoot()); - exist(vorgangInBearbeitungUnassignedInList.getRoot()); - }); + testAlleFilterViewSelection(inBearbeitungView, [vorgangInBearbeitungAssignedInList, vorgangInBearbeitungUnassignedInList]); }); describe('Beschieden', () => { - it('should set selected after click', () => { - beschiedenView.getRoot().click(); - waitForSpinnerToDisappear(); - - isSelected(beschiedenView.getRoot()); - }); - - it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(angenommenView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); - - it('should filter List', () => { - haveLength(vorgangList.getItems(), LIST_SIZE - 12); - exist(vorgangBeschiedenAssignedInList.getRoot()); - exist(vorgangBeschiedenUnassignedInList.getRoot()); - }); + testAlleFilterViewSelection(beschiedenView, [vorgangBeschiedenAssignedInList, vorgangBeschiedenUnassignedInList]); }); describe('Abgeschlossen', () => { - it('should set selected after click', () => { - abgeschlossenView.getRoot().click(); - waitForSpinnerToDisappear(); - - isSelected(abgeschlossenView.getRoot()); - }); - - it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(angenommenView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); + testAlleFilterViewSelection(abgeschlossenView, [vorgangAbgeschlossenAssignedInList, vorgangAbgeschlossenUnassignedInList]); + }); - it('should filter List', () => { - haveLength(vorgangList.getItems(), LIST_SIZE - 12); - exist(vorgangAbgeschlossenAssignedInList.getRoot()); - exist(vorgangAbgeschlossenUnassignedInList.getRoot()); - }); + describe('Weitergeleitet', () => { + testAlleFilterViewSelection(weitergeleitetView, [ + vorgangWeitergeleitetAssignedInList, + vorgangWeitergeleitetUnassignedInList, + ]); }); describe('Verworfen', () => { - it('should set selected after click', () => { - verworfenView.getRoot().click(); - waitForSpinnerToDisappear(); - - isSelected(verworfenView.getRoot()); - }); - - it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(angenommenView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); - - it('should filter List', () => { - haveLength(vorgangList.getItems(), LIST_SIZE - 12); - exist(vorgangVerworfenAssignedInList.getRoot()); - exist(vorgangVerworfenUnassignedInList.getRoot()); - }); + testAlleFilterViewSelection(verworfenView, [vorgangVerworfenAssignedInList, vorgangVerworfenUnassignedInList]); }); describe('Zu Löschen', () => { - it('should set selected after click', () => { - zuLoeschenView.getRoot().click(); - waitForSpinnerToDisappear(); - - isSelected(zuLoeschenView.getRoot()); - }); - - it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(angenommenView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); - - it('should filter List', () => { - haveLength(vorgangList.getItems(), LIST_SIZE - 12); - exist(vorgangZuLoeschenAssignedInList.getRoot()); - exist(vorgangZuLoeschenUnassignedInList.getRoot()); - }); + testAlleFilterViewSelection(zuLoeschenView, [vorgangZuLoeschenAssignedInList, vorgangZuLoeschenUnassignedInList]); }); describe('Wiedervorlagen', () => { + testAlleFilterViewSelection(wiedervorlagenView, [vorgangAngenommenUnassignedInList, vorgangAbgeschlossenAssignedInList]); + }); + + function testAlleFilterViewSelection(view: VorgangViewE2EComponent, listItems: VorgangListItemE2EComponent[]): void { + testViewSelection(view); + testOtherViewsAreUnselected(view); + testAlleFilterIsSelected(); + testVorgangListItem(listItems); + } + + function testViewSelection(view: VorgangViewE2EComponent): void { it('should set selected after click', () => { - wiedervorlagenView.getRoot().click(); + view.getRoot().click(); waitForSpinnerToDisappear(); - isSelected(wiedervorlagenView.getRoot()); + isSelected(view.getRoot()); }); + } + function testOtherViewsAreUnselected(selectedView: VorgangViewE2EComponent): void { it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(angenommenView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - isNotSelected(sucheView.getRoot()); + ALL_VIEW_COMPONENTS.filter((view: VorgangViewE2EComponent) => view != selectedView).forEach( + (view: VorgangViewE2EComponent) => isNotSelected(view.getRoot()), + ); }); + } + function testAlleFilterIsSelected(): void { it('should keep filter selection', () => { isOdsButtonToggleChecked(navigation.getAlleFilter()); isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); }); + } + function testVorgangListItem(listItems: VorgangListItemE2EComponent[]): void { it('should filter List', () => { - haveLength(vorgangList.getItems(), 2); - - exist(vorgangAngenommenUnassignedInList.getRoot()); - exist(vorgangAbgeschlossenAssignedInList.getRoot()); + haveLength(vorgangList.getItems(), LIST_SIZE - 14); + listItems.forEach((item: VorgangListItemE2EComponent) => exist(item.getRoot())); }); - }); + } describe('VorgangList', () => { it('should set selected after click', () => { @@ -571,6 +430,7 @@ describe('Vorgang views and filter', () => { isNotSelected(inBearbeitungView.getRoot()); isNotSelected(beschiedenView.getRoot()); isNotSelected(abgeschlossenView.getRoot()); + isNotSelected(weitergeleitetView.getRoot()); isNotSelected(zuLoeschenView.getRoot()); isNotSelected(verworfenView.getRoot()); isNotSelected(sucheView.getRoot()); @@ -595,22 +455,8 @@ describe('Vorgang views and filter', () => { isSelected(sucheView.getRoot()); }); - it('should unselect other views', () => { - isNotSelected(neuView.getRoot()); - isNotSelected(angenommenView.getRoot()); - isNotSelected(inBearbeitungView.getRoot()); - isNotSelected(beschiedenView.getRoot()); - isNotSelected(abgeschlossenView.getRoot()); - isNotSelected(zuLoeschenView.getRoot()); - isNotSelected(verworfenView.getRoot()); - isNotSelected(vorgangListView.getRoot()); - }); - - it('should keep filter selection', () => { - isOdsButtonToggleChecked(navigation.getAlleFilter()); - isOdsButtonToggleNotChecked(navigation.getMeineVorgaengeFilter()); - isOdsButtonToggleNotChecked(navigation.getUnassignedFilter()); - }); + testOtherViewsAreUnselected(sucheView); + testAlleFilterIsSelected(); it('should show message', () => { haveText(vorgangList.getEmptySucheMessage(), 'Bitte geben Sie einen Suchbegriff ein.'); @@ -643,6 +489,7 @@ describe('Vorgang views and filter', () => { isNotSelected(inBearbeitungView.getRoot()); isNotSelected(beschiedenView.getRoot()); isNotSelected(abgeschlossenView.getRoot()); + isNotSelected(weitergeleitetView.getRoot()); isNotSelected(verworfenView.getRoot()); isNotSelected(zuLoeschenView.getRoot()); isNotSelected(vorgangListView.getRoot()); @@ -892,11 +739,11 @@ describe('Vorgang views and filter', () => { vorgangSearch.doSearch(searchString); } - function isNotSelected(element) { + function isNotSelected(element: Cypress.Chainable<Element>): void { notContainClass(element, 'selected'); } - function isSelected(element) { + function isSelected(element: Cypress.Chainable<Element>): void { containClass(element, 'selected'); } }); diff --git a/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.helper.ts b/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..14855ec9447435b69b037074d1e17fb695c54ab4 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.helper.ts @@ -0,0 +1,7 @@ +import { E2EVorgangNavigator } from './vorgang.navigator'; +import { E2EVorgangVerifier } from './vorgang.verifier'; + +export class E2EVorgangHelper { + private readonly verifier: E2EVorgangVerifier = new E2EVorgangVerifier(); + private readonly navigator: E2EVorgangNavigator = new E2EVorgangNavigator(); +} diff --git a/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.navigator.ts b/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.navigator.ts new file mode 100644 index 0000000000000000000000000000000000000000..7b4fc54b196ff4dc2c83ffbf029a8b063c6b1054 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.navigator.ts @@ -0,0 +1,15 @@ +import { VorgangListE2EComponent } from '../../components/vorgang/vorgang-list.e2e.component'; +import { waitForSpinnerToDisappear } from '../../page-objects/main.po'; +import { E2EVorgangVerifier } from './vorgang.verifier'; + +export class E2EVorgangNavigator { + private readonly verifier: E2EVorgangVerifier = new E2EVorgangVerifier(); + + private readonly vorgangListPage = new VorgangListE2EComponent(); + + public openVorgangDetailByName(vorgangName: string): void { + this.vorgangListPage.getListItem(vorgangName).getRoot().click(); + waitForSpinnerToDisappear(); + this.verifier.verifyVorgangDetailOpen(vorgangName); + } +} diff --git a/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.verifier.ts b/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.verifier.ts new file mode 100644 index 0000000000000000000000000000000000000000..c42945065f7c18f03c4f74fbcbf2809c9b2a8021 --- /dev/null +++ b/alfa-client/apps/alfa-e2e/src/helper/vorgang/vorgang.verifier.ts @@ -0,0 +1,19 @@ +import { VorgangPage } from '../../page-objects/vorgang.po'; +import { contains, exist, notExist } from '../../support/cypress.util'; + +export class E2EVorgangVerifier { + private readonly vorgangPage: VorgangPage = new VorgangPage(); + + public verifyVorgangDetailOpen(vorgangName: string): void { + exist(this.vorgangPage.getVorgangDetailHeader().getRoot()); + contains(this.vorgangPage.getVorgangDetailHeader().getName(), vorgangName); + } + + public verifyForwardingButtonExists(): void { + exist(this.vorgangPage.getFormularButtons().getForwardButton()); + } + + public verifyNoForwardingButtonExists(): void { + notExist(this.vorgangPage.getFormularButtons().getForwardButton()); + } +} diff --git a/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts b/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts index 6a1d1b397b3e0a9eb91362cd0220230b67a5db14..8a2647fd1d0a8b47aaf41cd8e007177991b1fe1f 100644 --- a/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts +++ b/alfa-client/apps/alfa-e2e/src/page-objects/vorgang.po.ts @@ -33,7 +33,8 @@ import { VorgangBescheideE2EComponent } from '../components/vorgang/vorgang-besc import { VorgangDetailHeaderE2EComponent } from '../components/vorgang/vorgang-detail-header.e2e.component'; import { VorgangFormularButtonsE2EComponent } from '../components/vorgang/vorgang-formular-buttons.e2e.components'; import { VorgangFormularDatenE2EComponent } from '../components/vorgang/vorgang-formular.e2e.component'; -import { VorgangForwardingE2EComponent } from '../components/vorgang/vorgang-forward.e2e.component'; +import { ForwardingByEmailE2EComponent } from '../components/vorgang/vorgang-forward.e2e.component'; +import { ForwardingDialogE2EComponent } from '../components/vorgang/vorgang-forwarding-dialog.e2e.component'; import { VorgangMoreMenuE2EComponent } from '../components/vorgang/vorgang-more-menu.e2e.components'; import { VorgangSubnavigationE2EComponent } from '../components/vorgang/vorgang-subnavigation'; import { VorgangZusammenarbeitE2EComponent } from '../components/vorgang/vorgang-zusammenarbeit.e2e.component'; @@ -49,7 +50,8 @@ export class VorgangPage { private readonly bescheidWizard: VorgangBescheidWizardE2EComponent = new VorgangBescheidWizardE2EComponent(); private readonly bescheide: VorgangBescheideE2EComponent = new VorgangBescheideE2EComponent(); private readonly wiedervorlagen: WiedervorlagenInVorgangE2EComponent = new WiedervorlagenInVorgangE2EComponent(); - private readonly forwardingContainer: VorgangForwardingE2EComponent = new VorgangForwardingE2EComponent(); + private readonly forwardingDialogContainer: ForwardingDialogE2EComponent = new ForwardingDialogE2EComponent(); + private readonly forwardingByEmailContainer: ForwardingByEmailE2EComponent = new ForwardingByEmailE2EComponent(); private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent(); private readonly kommentarContainer: KommentarListInVorgangE2EComponent = new KommentarListInVorgangE2EComponent(); private readonly postfachMailContainer: PostfachMailE2EComponent = new PostfachMailE2EComponent(); @@ -66,8 +68,12 @@ export class VorgangPage { return this.kommentarContainer; } - public getForwardingContainer(): VorgangForwardingE2EComponent { - return this.forwardingContainer; + public getForwardingDialogContainer(): ForwardingDialogE2EComponent { + return this.forwardingDialogContainer; + } + + public getForwardingByEmailContainer(): ForwardingByEmailE2EComponent { + return this.forwardingByEmailContainer; } public getSubnavigation(): VorgangSubnavigationE2EComponent { diff --git a/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts b/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts index b4f477e2422f3bd0ea391d7d3259c29bd4b2a8a6..9e520f34e3c7641fc9dd0c0b2d6d4ff25ac39ab0 100644 --- a/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts +++ b/alfa-client/apps/alfa-e2e/src/support/cypress-helper.ts @@ -28,6 +28,7 @@ import { SmockerMocks } from '../model/smocker'; import { UsermanagerUserE2E } from '../model/usermanager'; import { VorgangE2E } from '../model/vorgang'; import { VorgangAttachedItemE2E } from '../model/vorgang-attached-item'; +import { waitForSpinnerToDisappear } from '../page-objects/main.po'; enum CypressTasks { DROP_COLLECTIONS = 'dropCollections', @@ -62,6 +63,7 @@ export function login(userJsonPath: string): void { cy.fixture(userJsonPath).then((user) => { cy.login(user.name, user.password); }); + waitForSpinnerToDisappear(); } export function visitUrl(url: string): void { @@ -170,6 +172,10 @@ export function scrollToWindowBottom(): void { cy.window().scrollTo('bottom'); } +export function scrollToWindowTop(): void { + cy.window().scrollTo('top'); +} + export function intercept(method: string, url: string): Cypress.Chainable<null> { return cy.intercept(method, url); } diff --git a/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts b/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts index 3dbd6155939b778a411f9b2fd18822286feaf958..768db5ed90ce7662d1e2358b58aff85d86655f6b 100644 --- a/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts +++ b/alfa-client/apps/alfa-e2e/src/support/cypress.util.ts @@ -97,6 +97,14 @@ export function notBeChecked(element: any): void { element.should('not.be.checked'); } +export function beAriaDisabled(element: any): void { + element.should('have.attr', 'aria-disabled', 'true'); +} + +export function notBeAriaDisabled(element: any): void { + element.should('have.attr', 'aria-disabled', 'false'); +} + //TODO: "first()" rausnehmen -> im html eine entprechende data-test-id ansprechen?! | trennen in "get" und "verify" export function shouldFirstContains(element: any, containing: string) { element.first().should('exist').contains(containing); diff --git a/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.model.ts b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a2a5d7eabcfd524c1846a53c47f4d31d54f75a1 --- /dev/null +++ b/alfa-client/libs/admin/keycloak-shared/src/lib/keycloak.model.ts @@ -0,0 +1,12 @@ +export const KeycloakDefaults = { + clients: { + realmManagement: { + clientName: 'realm-management', + roles: { + managerUsers: { roleName: 'manage-users' }, + queryGroups: { roleName: 'query-groups' }, + viewClients: { roleName: 'view-clients' }, + }, + }, + }, +}; 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 afbb09bee049b4e79cda30ee0d97f3e4810799f9..c0ef6b387b57946efc4336573809b55582b7912e 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 @@ -21,15 +21,17 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { RoleMappings, User } from '@admin-client/user-shared'; +import { AdminRoles, RoleMappings, User } from '@admin-client/user-shared'; import { UserRepository } from '@admin/keycloak-shared'; import { StateResource } from '@alfa-client/tech-shared'; import { Mock, mock } from '@alfa-client/test-utils'; -import { TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { fakeAsync, TestBed, tick } from '@angular/core/testing'; import { faker } from '@faker-js/faker'; +import { expect } from '@jest/globals'; import KcAdminClient from '@keycloak/keycloak-admin-client'; import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation'; import MappingsRepresentation from '@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation'; +import { RequiredActionAlias } from '@keycloak/keycloak-admin-client/lib/defs/requiredActionProviderRepresentation'; import { RoleMappingPayload } from '@keycloak/keycloak-admin-client/lib/defs/roleRepresentation'; import { Users } from '@keycloak/keycloak-admin-client/lib/resources/users'; import { cold } from 'jest-marbles'; @@ -37,6 +39,7 @@ import { omit, times } from 'lodash-es'; import { throwError } from 'rxjs'; import { createUser } from '../../../user-shared/test/user'; import { UserFormService } from '../../../user/src/lib/user-form/user.formservice'; +import { KeycloakDefaults } from './keycloak.model'; describe('UserRepository', () => { let repository: UserRepository; @@ -530,6 +533,50 @@ describe('UserRepository', () => { }); }); + describe('update user roles for admin', () => { + const clientId: string = faker.string.uuid(); + + beforeEach(() => { + repository._updateUserRolesForClient = jest.fn(); + repository._getClientId = jest.fn().mockReturnValue(new Promise((resolve) => resolve(clientId))); + }); + + it('should get client id', async () => { + await repository._updateUserRolesForAdmin(user.id, { + admin: [AdminRoles.ADMIN], + alfa: [], + }); + + expect(repository._getClientId).toHaveBeenCalledWith(KeycloakDefaults.clients.realmManagement.clientName); + }); + + it('should update user roles', async () => { + await repository._updateUserRolesForAdmin(user.id, { + admin: [AdminRoles.ADMIN], + alfa: [], + }); + + expect(repository._updateUserRolesForClient).toHaveBeenCalledWith( + user.id, + [ + KeycloakDefaults.clients.realmManagement.roles.managerUsers.roleName, + KeycloakDefaults.clients.realmManagement.roles.queryGroups.roleName, + KeycloakDefaults.clients.realmManagement.roles.viewClients.roleName, + ], + clientId, + ); + }); + + it('should NOT update user roles for no ADMIN_ADMIN role', async () => { + await repository._updateUserRolesForAdmin(user.id, { + admin: [faker.word.noun()], + alfa: [], + }); + + expect(repository._updateUserRolesForClient).not.toHaveBeenCalled(); + }); + }); + describe('sendActivationMail', () => { it('should call kcAdminClient users executeActionsEmail', () => { const userId: string = faker.string.uuid(); @@ -538,7 +585,7 @@ describe('UserRepository', () => { expect(kcAdminClientUsers.executeActionsEmail).toHaveBeenCalledWith({ id: userId, - actions: ['VERIFY_EMAIL'], + actions: [RequiredActionAlias.VERIFY_EMAIL, RequiredActionAlias.UPDATE_PASSWORD], lifespan: 3600 * 24 * 7, }); }); 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 e5eca5be54120f7fdf51b66d130053a330ced543..c510b595f5b6157f20093328d23fa31bcc11e242 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 @@ -21,19 +21,20 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ClientMapping, ClientRoles, RoleMappings, User } from '@admin-client/user-shared'; +import { AdminRoles, ClientMapping, ClientRoles, RoleMappings, User } from '@admin-client/user-shared'; import { createStateResource, StateResource } from '@alfa-client/tech-shared'; import { inject, Injectable } from '@angular/core'; import KcAdminClient from '@keycloak/keycloak-admin-client'; import ClientRepresentation from '@keycloak/keycloak-admin-client/lib/defs/clientRepresentation'; import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation'; import MappingsRepresentation from '@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation'; +import { RequiredActionAlias } from '@keycloak/keycloak-admin-client/lib/defs/requiredActionProviderRepresentation'; import { RoleMappingPayload } from '@keycloak/keycloak-admin-client/lib/defs/roleRepresentation'; import UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; +import * as _ from 'lodash-es'; import { isNil, omit } from 'lodash-es'; import { catchError, concatMap, forkJoin, from, map, mergeMap, Observable, tap, throwError } from 'rxjs'; - -import * as _ from 'lodash-es'; +import { KeycloakDefaults } from './keycloak.model'; @Injectable({ providedIn: 'root', @@ -104,6 +105,7 @@ export class UserRepository { async _updateUserRoles(userId: string, clientRoles: ClientRoles): Promise<void> { await this._updateUserRolesForClient(userId, clientRoles.admin, await this._getClientId(UserRepository.ADMIN_CLIENT_NAME)); await this._updateUserRolesForClient(userId, clientRoles.alfa, await this._getClientId(UserRepository.ALFA_CLIENT_NAME)); + await this._updateUserRolesForAdmin(userId, clientRoles); } async _updateUserRolesForClient(userId: string, clientRoles: string[], clientId: string): Promise<void> { @@ -177,10 +179,24 @@ export class UserRepository { }); } + async _updateUserRolesForAdmin(userId: string, clientRoles: ClientRoles): Promise<void> { + if (clientRoles.admin.includes(AdminRoles.ADMIN)) { + await this._updateUserRolesForClient( + userId, + [ + KeycloakDefaults.clients.realmManagement.roles.managerUsers.roleName, + KeycloakDefaults.clients.realmManagement.roles.queryGroups.roleName, + KeycloakDefaults.clients.realmManagement.roles.viewClients.roleName, + ], + await this._getClientId(KeycloakDefaults.clients.realmManagement.clientName), + ); + } + } + _sendActivationMail(userId: string): void { this.kcAdminClient.users.executeActionsEmail({ id: userId, - actions: ['VERIFY_EMAIL'], + actions: [RequiredActionAlias.VERIFY_EMAIL, RequiredActionAlias.UPDATE_PASSWORD], lifespan: 3600 * 24 * 7, }); } diff --git a/alfa-client/libs/admin/user-shared/src/lib/user.model.ts b/alfa-client/libs/admin/user-shared/src/lib/user.model.ts index f496e42b8734907ab060fe4872fc91cb29b14c42..45d8e171c2c2b1cde1e96e25d76cac23bcf6e5e2 100644 --- a/alfa-client/libs/admin/user-shared/src/lib/user.model.ts +++ b/alfa-client/libs/admin/user-shared/src/lib/user.model.ts @@ -48,3 +48,7 @@ export interface RoleMappings { newClientRoleMappings: RoleMappingPayload[]; oldClientRoleMappings: RoleMappingPayload[]; } + +export enum AdminRoles { + ADMIN = 'ADMIN_ADMIN', +} 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..ef80c0f57a92cc1f284caa5b6b0afe83e6973f1d --- /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-0.5 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-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 a8931fbcb6be03bbd9b0a5c97b7194e2e9605453..1dda4319a297a47b72c1d1c8bc6e1401a796a7ee 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 @@ -1,7 +1,7 @@ <h2 class="heading-2 mt-4">Rollen für OZG-Cloud</h2> <div [formGroup]="formGroupParent"> - <div [formGroupName]="UserFormService.CLIENT_ROLES" class="mb-8 flex gap-56"> - <div [formGroupName]="UserFormService.ADMINISTRATION_GROUP" class="flex flex-col gap-2"> + <div [formGroupName]="UserFormService.CLIENT_ROLES" class="mb-8 flex flex-col gap-4 md:flex-row"> + <div [formGroupName]="UserFormService.ADMINISTRATION_GROUP" class="flex flex-1 flex-col gap-2"> <h3 class="text-md block font-medium text-text">Administration</h3> <div class="flex items-center gap-2"> <ods-checkbox-editor [formControlName]="UserFormService.ADMIN" label="Admin" inputId="admin" /> @@ -26,7 +26,7 @@ </button> </div> </div> - <div [formGroupName]="UserFormService.ALFA_GROUP" class="flex flex-col gap-2"> + <div [formGroupName]="UserFormService.ALFA_GROUP" class="flex flex-1 flex-col gap-2"> <h3 class="text-md block font-medium text-text">Alfa</h3> <div class="flex items-center gap-2"> <ods-checkbox-editor [formControlName]="UserFormService.LOESCHEN" label="Löschen" inputId="delete" /> 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..132dc6ba2c8eb40cfc12c0f163ba94092afca6a2 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,17 +25,17 @@ --> <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" [formGroupOrganisationsEinheiten]="formService.getOrganisationsEinheitenGroup()" /> - <div class="flex justify-between"> + <div class="mb-6 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..99e28aabc946516a2076a89eb850c1df7b5594cd 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 @@ -26,18 +26,14 @@ import { ROUTES } from '@admin-client/shared'; import { User, UserService } from '@admin-client/user-shared'; import { PatchConfig } from '@admin/keycloak-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { - createEmptyStateResource, - createLoadingStateResource, - createStateResource, - StateResource, -} from '@alfa-client/tech-shared'; +import { createEmptyStateResource, createLoadingStateResource, createStateResource, StateResource, } from '@alfa-client/tech-shared'; import { Mock, mock, mockWindowError } from '@alfa-client/test-utils'; import { SnackBarService } from '@alfa-client/ui'; import { fakeAsync, TestBed, tick } from '@angular/core/testing'; import { AbstractControl, FormControl, FormGroup, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { ActivatedRoute, UrlSegment } from '@angular/router'; import { faker } from '@faker-js/faker/locale/de'; +import { expect } from '@jest/globals'; import { cold } from 'jest-marbles'; import { createUser } from 'libs/admin/user-shared/test/user'; import { Observable, of, throwError } from 'rxjs'; @@ -45,7 +41,6 @@ import { createUrlSegment } from '../../../../../navigation-shared/test/navigati import { singleCold, singleColdCompleted, singleHot } from '../../../../../tech-shared/test/marbles'; import { createAdminOrganisationsEinheit } from '../../../../organisations-einheit-shared/src/test/organisations-einheit'; import { UserFormService } from './user.formservice'; - import SpyInstance = jest.SpyInstance; describe('UserFormService', () => { @@ -152,6 +147,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 +484,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..666d4d192605be0c6e14cca6008225b86570e1d5 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 @@ -23,21 +23,13 @@ */ import { AdminOrganisationsEinheit, AdminOrganisationsEinheitService } from '@admin-client/organisations-einheit-shared'; import { ROUTES } from '@admin-client/shared'; -import { User, UserService } from '@admin-client/user-shared'; +import { AdminRoles, User, UserService } from '@admin-client/user-shared'; import { KeycloakFormService, PatchConfig } from '@admin/keycloak-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { createEmptyStateResource, EMPTY_STRING, isLoaded, mapToResource, StateResource } from '@alfa-client/tech-shared'; import { SnackBarService } from '@alfa-client/ui'; import { Injectable, OnDestroy } from '@angular/core'; -import { - AbstractControl, - FormControl, - UntypedFormBuilder, - UntypedFormGroup, - ValidationErrors, - ValidatorFn, - Validators, -} from '@angular/forms'; +import { AbstractControl, FormControl, UntypedFormBuilder, UntypedFormGroup, ValidationErrors, ValidatorFn, Validators, } from '@angular/forms'; import { UrlSegment } from '@angular/router'; import { catchError, filter, Observable, of, Subscription, tap } from 'rxjs'; @@ -51,7 +43,7 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest public static readonly CLIENT_ROLES: string = 'clientRoles'; public static readonly GROUPS: string = 'groups'; public static readonly ADMINISTRATION_GROUP: string = 'admin'; - public static readonly ADMIN: string = 'ADMIN_ADMIN'; + public static readonly ADMIN: string = AdminRoles.ADMIN; public static readonly DATENBEAUFTRAGUNG: string = 'DATENBEAUFTRAGUNG'; public static readonly ALFA_GROUP: string = 'alfa'; public static readonly LOESCHEN: string = 'VERWALTUNG_LOESCHEN'; @@ -59,6 +51,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 +156,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 +179,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 +259,7 @@ export class UserFormService extends KeycloakFormService<User> implements OnDest ngOnDestroy(): void { this._initOrganisationsEinheiten$.unsubscribe(); + this._alfaGroupChanges.unsubscribe(); } public getUserName(): string { diff --git a/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts b/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts index 1ea618d47d18ed73a95030929bf0d581d41d3c6c..9d89989e6f5eb294ee5d7215b881a2584f3490db 100644 --- a/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts +++ b/alfa-client/libs/api-root-shared/src/lib/api-root.linkrel.ts @@ -46,6 +46,9 @@ export enum ApiRootLinkRel { ALLE_VORGAENGE_ABGESCHLOSSEN = 'vorgaenge_abgeschlossen_all', MEINE_VORGAENGE_ABGESCHLOSSEN = 'vorgaenge_abgeschlossen_my', UNASSIGNED_ABGESCHLOSSEN = 'vorgaenge_abgeschlossen_unassigned', + ALLE_VORGAENGE_WEITERGELEITET = 'vorgaenge_weitergeleitet_all', + MEINE_VORGAENGE_WEITERGELEITET = 'vorgaenge_weitergeleitet_my', + UNASSIGNED_WEITERGELEITET = 'vorgaenge_weitergeleitet_unassigned', ALLE_VORGAENGE_VERWORFEN = 'vorgaenge_verworfen_all', MEINE_VORGAENGE_VERWORFEN = 'vorgaenge_verworfen_my', UNASSIGNED_VERWORFEN = 'vorgaenge_verworfen_unassigned', diff --git a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts index 6adabee9688a1af7ac880621d85af1a90e04c326..8a67d24b410454a80ae2d62f7bbbd6a86a08fd9e 100644 --- a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts +++ b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.spec.ts @@ -12,8 +12,8 @@ describe('CancelDialogButtonComponent', () => { let dialogService: Mock<OzgcloudDialogService>; - const cancelDialogButton: string = getDataTestIdOf('cancel-dialog-button'); - const cancelDialogIconButton: string = getDataTestIdOf('cancel-dialog-icon-button'); + const cancelDialogButton: string = getDataTestIdOf('cancel-dialog-button-container'); + const cancelDialogIconButton: string = getDataTestIdOf('cancel-dialog-icon-button-container'); beforeEach(async () => { dialogService = mock(OzgcloudDialogService); diff --git a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts index 7211cb480d8d88a6eefa984f42146d6da197a63b..03ac3acbe39b7907df7af242da47d4d3f70a5fa3 100644 --- a/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts +++ b/alfa-client/libs/design-component/src/lib/cancel-dialog-button/cancel-dialog-button.component.ts @@ -14,7 +14,7 @@ import { ButtonComponent, CloseIconComponent, TooltipDirective } from '@ods/syst variant="ghost" size="fit" dataTestId="cancel-dialog-icon-button" - data-test-id="cancel-dialog-icon-button" + data-test-id="cancel-dialog-icon-button-container" > <ng-container icon> <ods-close-icon class="fill-primary" /> @@ -26,7 +26,7 @@ import { ButtonComponent, CloseIconComponent, TooltipDirective } from '@ods/syst variant="outline" text="Abbrechen" dataTestId="cancel-dialog-button" - data-test-id="cancel-dialog-button" + data-test-id="cancel-dialog-button-container" > <ng-container icon> <ods-close-icon class="fill-primary" /> diff --git a/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts b/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts index 0e77b51c101f31ac094b7c59f6fbae9834f76b9a..89c0cd5fb117bc5c11c2aa254dfd810ec7616b32 100644 --- a/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts +++ b/alfa-client/libs/design-component/src/lib/form/formcontrol-editor.abstract.component.ts @@ -64,12 +64,15 @@ export abstract class FormControlEditorAbstractComponent implements ControlValue this.fieldControl.setValue(text); this.setErrors(); } + registerOnChange(fn: (text: string | Date) => {}): void { this.onChange = fn; } + registerOnTouched(fn: () => {}): void { this.onTouched = fn; } + setDisabledState?(isDisabled: boolean): void { this.disabled = isDisabled; } @@ -83,9 +86,9 @@ export abstract class FormControlEditorAbstractComponent implements ControlValue if (this.control) { this.fieldControl.setErrors(this.control.errors); if (this.control.invalid) { - this._updateInvalidParams(); this.fieldControl.markAsTouched(); } + this._updateInvalidParams(); } } diff --git a/alfa-client/libs/design-system/src/index.ts b/alfa-client/libs/design-system/src/index.ts index a820f6d4ce30953ae4b1de7a42341cdc51d9c822..c17fdb29f53e0948d6f7b3a61d0d3725c18e2ffc 100644 --- a/alfa-client/libs/design-system/src/index.ts +++ b/alfa-client/libs/design-system/src/index.ts @@ -28,6 +28,7 @@ export * from './lib/bescheid-status-text/bescheid-status-text.component'; export * from './lib/bescheid-wrapper/bescheid-wrapper.component'; export * from './lib/button-card/button-card.component'; export * from './lib/button/button.component'; +export * from './lib/dialog-container/dialog-container.component'; export * from './lib/dropdown-menu/dropdown-menu-button-item/dropdown-menu-button-item.component'; export * from './lib/dropdown-menu/dropdown-menu-item/dropdown-menu-item.component'; export * from './lib/dropdown-menu/dropdown-menu-link-item/dropdown-menu-link-item.component'; diff --git a/alfa-client/libs/design-system/src/lib/dialog-container/dialog-container.component.spec.ts b/alfa-client/libs/design-system/src/lib/dialog-container/dialog-container.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d1f894406fa1f6c9468c1d7ba356a56947a05c25 --- /dev/null +++ b/alfa-client/libs/design-system/src/lib/dialog-container/dialog-container.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DialogContainerComponent } from './dialog-container.component'; + +describe('DialogContainerComponent', () => { + let component: DialogContainerComponent; + let fixture: ComponentFixture<DialogContainerComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DialogContainerComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DialogContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/alfa-client/libs/design-system/src/lib/dialog-container/dialog-container.component.ts b/alfa-client/libs/design-system/src/lib/dialog-container/dialog-container.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..0ae05ed9e15b295a9fd542223bb9b6b9458d7ce8 --- /dev/null +++ b/alfa-client/libs/design-system/src/lib/dialog-container/dialog-container.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ods-dialog-container', + standalone: true, + imports: [], + template: ` + <div class="max-h-full w-[860px] max-w-full rounded-lg bg-background-50 p-6 shadow-md"> + <ng-content /> + </div> + `, +}) +export class DialogContainerComponent {} diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-button-container/forwarding-button-container.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-button-container/forwarding-button-container.component.html index ad9a5561e64c8b1a8c4f31b72a6dfdff0d0c3905..bdf8537e74921852fa7d6d5c614dacc7179b1cf4 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-button-container/forwarding-button-container.component.html +++ b/alfa-client/libs/forwarding/src/lib/forwarding-button-container/forwarding-button-container.component.html @@ -1,4 +1,4 @@ -<!--@if (vorgangWithEingang | hasLink: vorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD) {--> +@if (vorgangWithEingang | hasLink: vorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD) { @if (showAsIconButton) { <ods-open-dialog-button [tooltip]="'Vorgang weiterleiten'" @@ -14,4 +14,4 @@ <ods-forward-vorgang-icon icon class="fill-primary" /> </ods-open-dialog-button> } -<!--}--> +} diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html index 4196535914833b542fdf6b2f9323ac8af647414e..dd8cb9767e87101c94ae31822fc4f29b21f74d10 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html @@ -3,7 +3,7 @@ text="Weiterleiten" [tooltip]="tooltip" tooltipPosition="above" - dataTestId="forwarding-button" + dataTestId="forwarding-dialog-button" > <ods-forward-vorgang-icon icon class="fill-whitetext" /> </ods-button-with-spinner> diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html index b61988d33c478ecfbcfd727f83440f8d236232af..48919266d401fb3597c370c65920230b7c8d9d51 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html @@ -1,19 +1,20 @@ -<div class="flex max-h-full w-[860px] max-w-full flex-col rounded-lg bg-background-50 p-6 shadow-md"> - <div class="mb-4 flex items-center justify-between"> - <h1 class="text-lg font-medium text-primary">Vorgang weiterleiten</h1> - <ods-cancel-dialog-button showAsIconButton="true" /> - </div> - - <div class="mb-6" style="height: calc(50vh + 4.5rem)"> - @if (!selectedSearchResult) { - <alfa-forwarding-search-organisations-einheit data-test-id="zufi-search" /> - } @else { - <alfa-search-selected [organisationsEinheitResource]="selectedSearchResult" data-test-id="forwarding-item" /> - } - </div> +<ods-dialog-container> + <div class="flex flex-col"> + <div class="mb-4 flex items-center justify-between"> + <h1 class="text-lg font-medium text-primary">Vorgang weiterleiten</h1> + <ods-cancel-dialog-button showAsIconButton="true" /> + </div> + <div class="mb-6" style="height: calc(50vh + 4.5rem)"> + @if (!selectedSearchResult) { + <alfa-forwarding-search-organisations-einheit cdkFocusInitial data-test-id="organisations-einheit-search" /> + } @else { + <alfa-search-item-selected [organisationsEinheitResource]="selectedSearchResult" data-test-id="search-item-selected" /> + } + </div> - <div class="flex gap-4"> - <alfa-forwarding-button [disabled]="!selectedSearchResult" /> - <ods-cancel-dialog-button /> + <div class="flex gap-4"> + <alfa-forwarding-button [disabled]="!selectedSearchResult" /> + <ods-cancel-dialog-button /> + </div> </div> -</div> +</ods-dialog-container> diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts index 6d4454c8e37a0bde91a410aeacf6df07087973f6..42aa015eeeab4f68a8eee06636128ecbc05a5674 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts @@ -1,31 +1,32 @@ import { existsAsHtmlElement, getMockComponent, notExistsAsHtmlElement } from '@alfa-client/test-utils'; -import { ZustaendigeStelleModule } from '@alfa-client/zustaendige-stelle'; import { OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CancelDialogButtonComponent } from '@ods/component'; -import { MockComponent, MockModule } from 'ng-mocks'; +import { MockComponent } from 'ng-mocks'; import { getDataTestIdOf } from '../../../../../tech-shared/test/data-test'; import { createOrganisationsEinheitResource } from '../../../../../zustaendige-stelle-shared/test/organisations-einheit'; import { ForwardingButtonComponent } from './forwarding-button/forwarding-button.component'; -import { ForwardingItemInDialogComponent } from './forwarding-item/forwarding-item.component'; import { ForwardingDialogComponent } from './forwarding-dialog.component'; +import { SearchItemSelectedComponent } from './search-item-selected/search-item-selected.component'; +import { ForwardingSearchOrganisationsEinheitComponent } from './search-organisations-einheit/search-organisations-einheit.component'; describe('ForwardingDialogComponent', () => { let component: ForwardingDialogComponent; let fixture: ComponentFixture<ForwardingDialogComponent>; - const zufiSearch: string = getDataTestIdOf('zufi-search'); - const forwardingItem: string = getDataTestIdOf('forwarding-item'); + const organisationsEinheitSearch: string = getDataTestIdOf('organisations-einheit-search'); + const searchItemSelected: string = getDataTestIdOf('search-item-selected'); const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource(); + beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ForwardingDialogComponent], declarations: [ MockComponent(CancelDialogButtonComponent), MockComponent(ForwardingButtonComponent), - MockComponent(ForwardingItemInDialogComponent), - MockModule(ZustaendigeStelleModule), + MockComponent(SearchItemSelectedComponent), + MockComponent(ForwardingSearchOrganisationsEinheitComponent), ], }).compileComponents(); @@ -45,7 +46,7 @@ describe('ForwardingDialogComponent', () => { fixture.detectChanges(); - existsAsHtmlElement(fixture, zufiSearch); + existsAsHtmlElement(fixture, organisationsEinheitSearch); }); it('should NOT render if selectedSearchResult is NOT null', () => { @@ -53,7 +54,7 @@ describe('ForwardingDialogComponent', () => { fixture.detectChanges(); - notExistsAsHtmlElement(fixture, zufiSearch); + notExistsAsHtmlElement(fixture, organisationsEinheitSearch); }); }); }); @@ -71,7 +72,7 @@ describe('ForwardingDialogComponent', () => { fixture.detectChanges(); - existsAsHtmlElement(fixture, forwardingItem); + existsAsHtmlElement(fixture, searchItemSelected); }); it('should NOT render if selectedSearchResult is null', () => { @@ -79,7 +80,7 @@ describe('ForwardingDialogComponent', () => { fixture.detectChanges(); - notExistsAsHtmlElement(fixture, forwardingItem); + notExistsAsHtmlElement(fixture, searchItemSelected); }); }); }); diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts index 343171d3d5c90b39a7b575d42663989cc037c75f..2350186c3531b19ee69e6f5ec8f341dc4758d9d8 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts @@ -4,9 +4,10 @@ import { A11yModule } from '@angular/cdk/a11y'; import { Component, Input } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { CancelDialogButtonComponent } from '@ods/component'; +import { DialogContainerComponent } from '@ods/system'; import { ForwardingButtonComponent } from './forwarding-button/forwarding-button.component'; +import { SearchItemSelectedComponent } from './search-item-selected/search-item-selected.component'; import { ForwardingSearchOrganisationsEinheitComponent } from './search-organisations-einheit/search-organisations-einheit.component'; -import { SearchSelectedComponent } from './search-selected/search-selected.component'; @Component({ selector: 'alfa-forwarding-dialog', @@ -18,7 +19,8 @@ import { SearchSelectedComponent } from './search-selected/search-selected.compo ZustaendigeStelleModule, ForwardingButtonComponent, ForwardingSearchOrganisationsEinheitComponent, - SearchSelectedComponent, + SearchItemSelectedComponent, + DialogContainerComponent, ], templateUrl: './forwarding-dialog.component.html', }) diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/change-button-container/change-button-container.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/change-button-container/change-button-container.component.html similarity index 100% rename from alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/change-button-container/change-button-container.component.html rename to alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/change-button-container/change-button-container.component.html diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/change-button-container/change-button-container.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/change-button-container/change-button-container.component.spec.ts similarity index 100% rename from alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/change-button-container/change-button-container.component.spec.ts rename to alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/change-button-container/change-button-container.component.spec.ts diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/change-button-container/change-button-container.component.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/change-button-container/change-button-container.component.ts similarity index 100% rename from alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/change-button-container/change-button-container.component.ts rename to alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/change-button-container/change-button-container.component.ts diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.html similarity index 100% rename from alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.html rename to alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.html diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.spec.ts similarity index 81% rename from alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.spec.ts rename to alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.spec.ts index c4c5b403d6d56de2de0bbab10e06fea920712e18..ff1f2e2a77ad69b5d17d7871cf0e7167af3a4132 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.spec.ts @@ -6,18 +6,18 @@ import { ForwardingItemComponent, ForwardingItemInfoComponent } from '@ods/syste import { MockComponent } from 'ng-mocks'; import { createOrganisationsEinheitResource } from '../../../../../../zustaendige-stelle-shared/test/organisations-einheit'; import { ChangeButtonContainerComponent } from './change-button-container/change-button-container.component'; -import { ForwardingItemInDialogComponent } from './forwarding-item.component'; +import { SearchItemSelectedComponent } from './search-item-selected.component'; -describe('ForwardingDialogForwardingItemComponent', () => { - let component: ForwardingItemInDialogComponent; - let fixture: ComponentFixture<ForwardingItemInDialogComponent>; +describe('ForwardingSearchOrganisationsEinheitComponent', () => { + let component: SearchItemSelectedComponent; + let fixture: ComponentFixture<SearchItemSelectedComponent>; const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource(); const anschrift: Anschrift = organisationsEinheitResource.anschrift; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [ForwardingItemInDialogComponent], + imports: [SearchItemSelectedComponent], declarations: [ MockComponent(ChangeButtonContainerComponent), MockComponent(ForwardingItemComponent), @@ -25,7 +25,7 @@ describe('ForwardingDialogForwardingItemComponent', () => { ], }).compileComponents(); - fixture = TestBed.createComponent(ForwardingItemInDialogComponent); + fixture = TestBed.createComponent(SearchItemSelectedComponent); component = fixture.componentInstance; component.organisationsEinheitResource = organisationsEinheitResource; fixture.detectChanges(); diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.ts similarity index 80% rename from alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.ts rename to alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.ts index eaf514653f6655f9305932a363cfa327af054ded..640f93dfb6e8cad5685492fd536e55c403190fce 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-selected/search-selected.component.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-item-selected/search-item-selected.component.ts @@ -4,11 +4,11 @@ import { ForwardingItemComponent, ForwardingItemInfoComponent } from '@ods/syste import { ChangeButtonContainerComponent } from './change-button-container/change-button-container.component'; @Component({ - selector: 'alfa-search-selected', + selector: 'alfa-search-item-selected', standalone: true, imports: [ChangeButtonContainerComponent, AnschriftToStringPipe, ForwardingItemComponent, ForwardingItemInfoComponent], - templateUrl: './search-selected.component.html', + templateUrl: './search-item-selected.component.html', }) -export class SearchSelectedComponent { +export class SearchItemSelectedComponent { @Input() organisationsEinheitResource: OrganisationsEinheitResource; } diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.html index 80f2ebb74899acc03959dfc5db1202e12b85e2e5..410a1ed8605cd28872a594b69559885e6e707d5d 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.html +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.html @@ -1,3 +1,3 @@ <ods-forwarding-item> - <alfa-search-zustaendige-stelle-form-container cdkFocusInitial focusOnSearchField="true"/> + <alfa-search-zustaendige-stelle-form-container focusOnSearchField="true"/> </ods-forwarding-item> \ No newline at end of file diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.spec.ts index bbaa57292a19ef5dae23f7ed4febcd449961bc67..84b088454368fd60b3f91e74363ce1aadae01ee0 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/search-organisations-einheit/search-organisations-einheit.component.spec.ts @@ -1,5 +1,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ZustaendigeStelleModule } from '@alfa-client/zustaendige-stelle'; +import { ForwardingItemComponent } from '@ods/system'; +import { MockComponent, MockModule } from 'ng-mocks'; import { ForwardingSearchOrganisationsEinheitComponent } from './search-organisations-einheit.component'; describe('ForwardingSearchOrganisationsEinheitComponent', () => { @@ -9,6 +12,7 @@ describe('ForwardingSearchOrganisationsEinheitComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ForwardingSearchOrganisationsEinheitComponent], + declarations: [MockComponent(ForwardingItemComponent), MockModule(ZustaendigeStelleModule)], }).compileComponents(); fixture = TestBed.createComponent(ForwardingSearchOrganisationsEinheitComponent); diff --git a/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.spec.ts b/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.spec.ts index c3358acb510534afa4df0bca712d8b2ff8161bb5..c2e342d93cc22a74bd18be0d1c135b5e51606c50 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.spec.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.spec.ts @@ -1054,6 +1054,12 @@ describe('Vorgang Reducer', () => { expect(vorgangStatistic.resource.byStatus.verworfen).toBeNull(); }); + it('should have null as weitergeleitet', () => { + const vorgangStatistic: StateResource<VorgangStatistic> = Reducer.initialState.vorgangStatistic; + + expect(vorgangStatistic.resource.byStatus.weitergeleitet).toBeNull(); + }); + it('should have null as zuLoeschen', () => { const vorgangStatistic: StateResource<VorgangStatistic> = Reducer.initialState.vorgangStatistic; diff --git a/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.ts b/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.ts index 0f200a551da43386ab80c67938d561a277bed11d..2601e8b7044b3d484d2556d1e418d1642dffa17f 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/+state/vorgang.reducer.ts @@ -126,6 +126,7 @@ function createEmptyVorgangStatistic(): VorgangStatistic { inBearbeitung: null, beschieden: null, verworfen: null, + weitergeleitet: null, zuLoeschen: null, }, wiedervorlagen: null, diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts index 76c2de5b4f697f184580a6ec74c0ebaaaf1705be..c522a0f4fcc3a6dfb8ee4d11c373ad4030d1717a 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts @@ -21,11 +21,11 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { UrlSegment } from '@angular/router'; -import { faker } from '@faker-js/faker'; import { ApiRootLinkRel } from '@alfa-client/api-root-shared'; import { RouteData } from '@alfa-client/navigation-shared'; import { EMPTY_STRING } from '@alfa-client/tech-shared'; +import { UrlSegment } from '@angular/router'; +import { faker } from '@faker-js/faker'; import { createRouteData } from 'libs/navigation-shared/test/navigation-test-factory'; import { initialState, VorgangState } from './+state/vorgang.reducer'; import { @@ -130,9 +130,7 @@ describe('Vorgang Navigation Util', () => { it('should return value on uebersichtsSeite', () => { jest.spyOn(VorgangNavigationUtil, 'isUebersichtsSeite').mockReturnValue(true); - const vorgangFilter: VorgangFilter = getVorgangFilter( - buildWithRouteParam(VorgangFilter.ALLE), - ); + const vorgangFilter: VorgangFilter = getVorgangFilter(buildWithRouteParam(VorgangFilter.ALLE)); expect(vorgangFilter).toBe(VorgangFilter.ALLE); }); @@ -152,10 +150,7 @@ describe('Vorgang Navigation Util', () => { const vorgangView: VorgangView = VorgangView.ANGENOMMEN; jest.spyOn(VorgangNavigationUtil, 'getVorgangView').mockReturnValue(vorgangView); - const isSelected: boolean = VorgangNavigationUtil.isViewSelected( - createRouteData(), - vorgangView, - ); + const isSelected: boolean = VorgangNavigationUtil.isViewSelected(createRouteData(), vorgangView); expect(isSelected).toBeTruthy(); }); @@ -164,10 +159,7 @@ describe('Vorgang Navigation Util', () => { const vorgangView: VorgangView = VorgangView.ANGENOMMEN; jest.spyOn(VorgangNavigationUtil, 'getVorgangView').mockReturnValue(VorgangView.NEU); - const isSelected: boolean = VorgangNavigationUtil.isViewSelected( - createRouteData(), - vorgangView, - ); + const isSelected: boolean = VorgangNavigationUtil.isViewSelected(createRouteData(), vorgangView); expect(isSelected).toBeFalsy(); }); @@ -198,7 +190,7 @@ describe('Vorgang Navigation Util', () => { const vorgangView: VorgangView = VorgangNavigationUtil.getVorgangView(routeData); - expect(vorgangView).toBe(6); + expect(vorgangView).toBe(VorgangView.VORGANG_LIST); }); it('should return VorgangView.NEU if routeData contains this view', () => { @@ -261,9 +253,7 @@ describe('Vorgang Navigation Util', () => { }); it('should build by given filter and view', () => { - jest - .spyOn(Storage, 'getViewFromLocalStorage') - .mockReturnValue(ROUTE_PARAM_BY_VORGANG_VIEW[VorgangView.ANGENOMMEN]); + jest.spyOn(Storage, 'getViewFromLocalStorage').mockReturnValue(ROUTE_PARAM_BY_VORGANG_VIEW[VorgangView.ANGENOMMEN]); jest .spyOn(Storage, 'getFilterFromLocalStorage') .mockReturnValue(ROUTE_PARAM_BY_VORGANG_FILTER[VorgangFilter.MEINE_VORGAENGE]); @@ -340,10 +330,7 @@ describe('Vorgang Navigation Util', () => { it('should build by meine vorgänge filter and view', () => { const state: VorgangState = { ...initialState, vorgangView: VorgangView.NEU }; - const routePath: string = buildVorgangListRouteWithVorgangFilter( - state, - VorgangFilter.MEINE_VORGAENGE, - ); + const routePath: string = buildVorgangListRouteWithVorgangFilter(state, VorgangFilter.MEINE_VORGAENGE); expect(routePath).toEqual('/meine/neu'); }); @@ -354,10 +341,7 @@ describe('Vorgang Navigation Util', () => { vorgangView: VorgangView.SEARCH, searchString: 'testSearchString', }; - const routePath: string = buildVorgangListRouteWithVorgangFilter( - state, - VorgangFilter.MEINE_VORGAENGE, - ); + const routePath: string = buildVorgangListRouteWithVorgangFilter(state, VorgangFilter.MEINE_VORGAENGE); expect(routePath).toEqual('/meine/search/testSearchString'); }); @@ -368,10 +352,7 @@ describe('Vorgang Navigation Util', () => { vorgangView: VorgangView.ANGENOMMEN, searchString: 'testSearchString', }; - const routePath: string = buildVorgangListRouteWithVorgangFilter( - state, - VorgangFilter.MEINE_VORGAENGE, - ); + const routePath: string = buildVorgangListRouteWithVorgangFilter(state, VorgangFilter.MEINE_VORGAENGE); expect(routePath).toEqual('/meine/angenommen'); }); @@ -406,19 +387,13 @@ describe('Vorgang Navigation Util', () => { }); it('return linkRel for Meine Vorgänge Filter', () => { - const linkRel: string = buildLinkRel( - VorgangFilter.MEINE_VORGAENGE, - VorgangView.VORGANG_LIST, - ); + const linkRel: string = buildLinkRel(VorgangFilter.MEINE_VORGAENGE, VorgangView.VORGANG_LIST); expect(linkRel).toBe('vorgaenge_my'); }); it('return linkRel for Nicht Zugewiesen Filter', () => { - const linkRel: string = buildLinkRel( - VorgangFilter.NICHT_ZUGEWIESEN, - VorgangView.VORGANG_LIST, - ); + const linkRel: string = buildLinkRel(VorgangFilter.NICHT_ZUGEWIESEN, VorgangView.VORGANG_LIST); expect(linkRel).toBe('vorgaenge_unassigned'); }); @@ -456,21 +431,13 @@ describe('Vorgang Navigation Util', () => { const vorgangView: VorgangView = VorgangView.NEU; it('should return routePath of view and filter', () => { - const routePath: string = buildVorgangFilterViewRoutePath( - vorgangFilter, - vorgangView, - EMPTY_STRING, - ); + const routePath: string = buildVorgangFilterViewRoutePath(vorgangFilter, vorgangView, EMPTY_STRING); expect(routePath).toBe('/alle/neu'); }); it('should return routePath of view and filter and searchString', () => { - const routePath: string = buildVorgangFilterViewRoutePath( - vorgangFilter, - vorgangView, - 'searchString', - ); + const routePath: string = buildVorgangFilterViewRoutePath(vorgangFilter, vorgangView, 'searchString'); expect(routePath).toBe('/alle/neu/searchString'); }); diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts index d525cd4e9a1614ee19f2db106387e0ed2937fe5b..053d9eb1c84a2b396d86b45fbf8908b4790f76a9 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts @@ -40,6 +40,7 @@ export const ANGENOMMEN_ROUTE_PARAM: string = 'angenommen'; export const IN_BEARBEITUNG_ROUTE_PARAM: string = 'in_bearbeitung'; export const BESCHIEDEN_ROUTE_PARAM: string = 'beschieden'; export const ABGESCHLOSSEN_ROUTE_PARAM: string = 'abgeschlossen'; +export const WEITERGELEITET_ROUTE_PARAM: string = 'weitergeleitet'; export const VERWORFEN_ROUTE_PARAM: string = 'verworfen'; export const WIEDERVORLAGEN_ROUTE_PARAM: string = 'wiedervorlagen'; export const UNGELESENE_NACHRICHTEN_ROUTE_PARAM: string = 'ungelesene_nachrichten'; @@ -54,6 +55,7 @@ export const ROUTE_PARAM_BY_VORGANG_VIEW: { [view: string]: string } = { [VorgangView.IN_BEARBEITUNG]: IN_BEARBEITUNG_ROUTE_PARAM, [VorgangView.BESCHIEDEN]: BESCHIEDEN_ROUTE_PARAM, [VorgangView.ABGESCHLOSSEN]: ABGESCHLOSSEN_ROUTE_PARAM, + [VorgangView.WEITERGELEITET]: WEITERGELEITET_ROUTE_PARAM, [VorgangView.VERWORFEN]: VERWORFEN_ROUTE_PARAM, [VorgangView.VORGANG_LIST]: EMPTY_STRING, [VorgangView.WIEDERVORLAGEN]: WIEDERVORLAGEN_ROUTE_PARAM, @@ -68,6 +70,7 @@ export const VORGANG_VIEW_BY_ROUTE_PARAM: { [routeParam: string]: VorgangView } [IN_BEARBEITUNG_ROUTE_PARAM]: VorgangView.IN_BEARBEITUNG, [BESCHIEDEN_ROUTE_PARAM]: VorgangView.BESCHIEDEN, [ABGESCHLOSSEN_ROUTE_PARAM]: VorgangView.ABGESCHLOSSEN, + [WEITERGELEITET_ROUTE_PARAM]: VorgangView.WEITERGELEITET, [VERWORFEN_ROUTE_PARAM]: VorgangView.VERWORFEN, [WIEDERVORLAGEN_ROUTE_PARAM]: VorgangView.WIEDERVORLAGEN, [UNGELESENE_NACHRICHTEN_ROUTE_PARAM]: VorgangView.UNGELESENE_NACHRICHTEN, @@ -115,9 +118,7 @@ export function isViewSelected(routeData: RouteData, vorgangView: VorgangView): export function getVorgangView(routeData: RouteData): VorgangView { const vorgangViewValue: string = VorgangNavigationUtil.getRouteUrlSegment(routeData, 1); if (VorgangNavigationUtil.isUebersichtsSeite(routeData)) { - return isNotUndefined(vorgangViewValue) ? - VORGANG_VIEW_BY_ROUTE_PARAM[vorgangViewValue] - : VorgangView.VORGANG_LIST; + return isNotUndefined(vorgangViewValue) ? VORGANG_VIEW_BY_ROUTE_PARAM[vorgangViewValue] : VorgangView.VORGANG_LIST; } return undefined; } @@ -133,9 +134,7 @@ export function isUebersichtsSeite(routeData: RouteData): boolean { } export function getRouteUrlSegment(routeData: RouteData, num: number): string { - return routeData.urlSegments.length > num ? - routeData.urlSegments[num].path.toString() - : undefined; + return routeData.urlSegments.length > num ? routeData.urlSegments[num].path.toString() : undefined; } export function buildBackButtonUrl(state: VorgangState): string { @@ -153,17 +152,11 @@ export function isStateEqualLocalStorage(state: VorgangState): boolean { ); } -export function buildVorgangListRoutePathWithFilter( - state: VorgangState, - filter: VorgangFilter, -): string { +export function buildVorgangListRoutePathWithFilter(state: VorgangState, filter: VorgangFilter): string { return VorgangNavigationUtil.buildVorgangListRouteWithVorgangFilter(state, filter); } -export function buildVorgangListRouteWithVorgangFilter( - state: VorgangState, - filter: VorgangFilter, -): string { +export function buildVorgangListRouteWithVorgangFilter(state: VorgangState, filter: VorgangFilter): string { let route = '/' + ROUTE_PARAM_BY_VORGANG_FILTER[filter]; if (state.vorgangView !== VorgangView.VORGANG_LIST) { @@ -198,9 +191,7 @@ export function buildLinkRelFromPathSegments(pathSegments: string[]): string { } const vorgangView: VorgangView = - isEmpty(pathSegments[1]) ? - VorgangView.VORGANG_LIST - : VORGANG_VIEW_BY_ROUTE_PARAM[pathSegments[1]]; + isEmpty(pathSegments[1]) ? VorgangView.VORGANG_LIST : VORGANG_VIEW_BY_ROUTE_PARAM[pathSegments[1]]; return buildLinkRel(vorgangFilter, vorgangView); } @@ -210,11 +201,7 @@ export function buildVorgangFilterViewRoutePath( vorgangView: VorgangView, searchString: string, ): string { - let baseRoutePath: string = - '/' + - ROUTE_PARAM_BY_VORGANG_FILTER[vorgangFilter] + - '/' + - ROUTE_PARAM_BY_VORGANG_VIEW[vorgangView]; + let baseRoutePath: string = '/' + ROUTE_PARAM_BY_VORGANG_FILTER[vorgangFilter] + '/' + ROUTE_PARAM_BY_VORGANG_VIEW[vorgangView]; if (isNotEmpty(searchString)) { return baseRoutePath + '/' + searchString; } diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts index 8417137108330ec18fd817f11a55d134e9e47f24..956adad470e23174c4cd6360ab7853420a9e5cc9 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts @@ -118,6 +118,7 @@ export interface ByStatus { beschieden: number; abgeschlossen: number; verworfen: number; + weitergeleitet: number; zuLoeschen: number; } @@ -160,6 +161,7 @@ export enum VorgangView { ABGESCHLOSSEN, VERWORFEN, VORGANG_LIST, + WEITERGELEITET, WIEDERVORLAGEN, SEARCH, ZU_LOESCHEN, diff --git a/alfa-client/libs/vorgang-shared/test/vorgang.ts b/alfa-client/libs/vorgang-shared/test/vorgang.ts index 9eadf4c36b6fbb1e06bab1d81880a2d386db0246..0a98811ad59a31a8c735fa90e1efe5a296f6aceb 100644 --- a/alfa-client/libs/vorgang-shared/test/vorgang.ts +++ b/alfa-client/libs/vorgang-shared/test/vorgang.ts @@ -160,6 +160,7 @@ function createByStatus(): ByStatus { beschieden: faker.number.int(), abgeschlossen: faker.number.int(), verworfen: faker.number.int(), + weitergeleitet: faker.number.int(), zuLoeschen: faker.number.int(), }; } diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss b/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss index 01889d5e0d21fe759a533c2415fe3ccfac84c804..b29f62b51b0da42f61a47a11583e6e11445e272e 100644 --- a/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss +++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss @@ -90,22 +90,15 @@ alfa-vorgang-view-item { border-color: #155ab4; } - &.angenommen { - background-color: #f6ebce; - border-color: #f1c14e; - } - + &.angenommen, &.in_bearbeitung { background-color: #f6ebce; border-color: #f1c14e; } - &.beschieden { - background-color: #d9eec5; - border-color: #7ccb2b; - } - - &.abgeschlossen { + &.beschieden, + &.abgeschlossen, + &.weitergeleitet { background-color: #d9eec5; border-color: #7ccb2b; } diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html b/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html index 21f2c7272fe3695da90ec1ffd5685265b2a0e4be..fde89f0449a26cb2ab766ff0c4eef29de14fd154 100644 --- a/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html +++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html @@ -28,10 +28,7 @@ <alfa-vorgang-view-item-container *ngIf=" apiRootResource - | hasAnyLink - : apiRootLinkRel.ALLE_VORGAENGE_NEU - : apiRootLinkRel.MEINE_VORGAENGE_NEU - : apiRootLinkRel.UNASSIGNED_NEU + | hasAnyLink: apiRootLinkRel.ALLE_VORGAENGE_NEU : apiRootLinkRel.MEINE_VORGAENGE_NEU : apiRootLinkRel.UNASSIGNED_NEU " data-test-id="vorgang-neu-view" label="Neu" @@ -100,6 +97,22 @@ > <div class="dot abgeschlossen"></div> </alfa-vorgang-view-item-container> + @if ( + apiRootResource + | hasAnyLink + : apiRootLinkRel.ALLE_VORGAENGE_WEITERGELEITET + : apiRootLinkRel.MEINE_VORGAENGE_WEITERGELEITET + : apiRootLinkRel.UNASSIGNED_WEITERGELEITET + ) { + <alfa-vorgang-view-item-container + data-test-id="vorgang-weitergeleitet-view" + label="Weitergeleitet" + [view]="vorgangView.WEITERGELEITET" + [count]="statistic.byStatus.weitergeleitet" + > + <div class="dot weitergeleitet"></div> + </alfa-vorgang-view-item-container> + } <alfa-vorgang-view-item-container *ngIf=" apiRootResource @@ -159,17 +172,11 @@ [view]="vorgangView.WIEDERVORLAGEN" [count]="statistic.wiedervorlagen" > - <alfa-wiedervorlage-icon - [isOverdue]="statistic.existsWiedervorlageOverdue" - ></alfa-wiedervorlage-icon> + <alfa-wiedervorlage-icon [isOverdue]="statistic.existsWiedervorlageOverdue"></alfa-wiedervorlage-icon> </alfa-vorgang-view-item-container> <alfa-vorgang-view-item-container *ngIf=" - apiRootResource - | hasAnyLink - : apiRootLinkRel.ALLE_VORGAENGE - : apiRootLinkRel.MEINE_VORGAENGE - : apiRootLinkRel.UNASSIGNED + apiRootResource | hasAnyLink: apiRootLinkRel.ALLE_VORGAENGE : apiRootLinkRel.MEINE_VORGAENGE : apiRootLinkRel.UNASSIGNED " data-test-id="vorgang-vorgang-list-view" label="Vorgangsliste" @@ -180,11 +187,7 @@ </alfa-vorgang-view-item-container> <alfa-vorgang-search-view-item-container *ngIf=" - apiRootResource - | hasAnyLink - : apiRootLinkRel.SEARCH_ALLE - : apiRootLinkRel.SEARCH_MEINE - : apiRootLinkRel.SEARCH_UNASSIGNED + apiRootResource | hasAnyLink: apiRootLinkRel.SEARCH_ALLE : apiRootLinkRel.SEARCH_MEINE : apiRootLinkRel.SEARCH_UNASSIGNED " data-test-id="vorgang-search-view" class="top-border" diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts b/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts index 002788d2e9ecf9fc8c9f0e23f9797b125c7edc8d..d7cd88c0faf1e5ca2ec114a6908733f27df88fe8 100644 --- a/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts +++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.spec.ts @@ -24,11 +24,7 @@ import { ApiRootLinkRel } from '@alfa-client/api-root-shared'; import { HasLinkPipe, createStateResource } from '@alfa-client/tech-shared'; import { existsAsHtmlElement, notExistsAsHtmlElement } from '@alfa-client/test-utils'; -import { - OzgcloudIconComponent, - OzgcloudSvgIconComponent, - PostfachIconComponent, -} from '@alfa-client/ui'; +import { OzgcloudIconComponent, OzgcloudSvgIconComponent, PostfachIconComponent } from '@alfa-client/ui'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; import { HasAnyLinkPipe } from 'libs/tech-shared/src/lib/pipe/has-any-link.pipe'; @@ -50,6 +46,7 @@ describe('VorgangViewsMenuComponent', () => { const inBearbeitungView: string = getDataTestIdOf('vorgang-in-bearbeitung-view'); const beschiedenView: string = getDataTestIdOf('vorgang-beschieden-view'); const abgeschlossenView: string = getDataTestIdOf('vorgang-abgeschlossen-view'); + const weitergeleitetView: string = getDataTestIdOf('vorgang-weitergeleitet-view'); const verworfenView: string = getDataTestIdOf('vorgang-verworfen-view'); const wiedervorlagenView: string = getDataTestIdOf('vorgang-wiedervorlagen-view'); const ungeleseneNachrichtenView: string = getDataTestIdOf('vorgang-ungelesene-nachrichten-view'); @@ -83,16 +80,15 @@ describe('VorgangViewsMenuComponent', () => { }); describe('neu view', () => { - it.each([ - ApiRootLinkRel.ALLE_VORGAENGE_NEU, - ApiRootLinkRel.MEINE_VORGAENGE_NEU, - ApiRootLinkRel.UNASSIGNED_NEU, - ])('should show if %s link exists', (linkRel: string) => { - component.apiRootResource = createApiRootResource([linkRel]); - fixture.detectChanges(); + it.each([ApiRootLinkRel.ALLE_VORGAENGE_NEU, ApiRootLinkRel.MEINE_VORGAENGE_NEU, ApiRootLinkRel.UNASSIGNED_NEU])( + 'should show if %s link exists', + (linkRel: string) => { + component.apiRootResource = createApiRootResource([linkRel]); + fixture.detectChanges(); - existsAsHtmlElement(fixture, neuView); - }); + existsAsHtmlElement(fixture, neuView); + }, + ); it('should hide if both links not exists', () => { component.apiRootResource = createApiRootResource(); @@ -182,6 +178,26 @@ describe('VorgangViewsMenuComponent', () => { }); }); + describe('weitergeleitet view', () => { + it.each([ + ApiRootLinkRel.ALLE_VORGAENGE_WEITERGELEITET, + ApiRootLinkRel.MEINE_VORGAENGE_WEITERGELEITET, + ApiRootLinkRel.UNASSIGNED_WEITERGELEITET, + ])('should show if %s link exists', (linkRel: string) => { + component.apiRootResource = createApiRootResource([linkRel]); + fixture.detectChanges(); + + existsAsHtmlElement(fixture, weitergeleitetView); + }); + + it('should hide if both links not exists', () => { + component.apiRootResource = createApiRootResource(); + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, beschiedenView); + }); + }); + describe('verworfen view', () => { it.each([ ApiRootLinkRel.ALLE_VORGAENGE_VERWORFEN, @@ -203,16 +219,15 @@ describe('VorgangViewsMenuComponent', () => { }); describe('wiedervorlagen view', () => { - it.each([ - ApiRootLinkRel.ALL_WIEDERVORLAGEN, - ApiRootLinkRel.MY_WIEDERVORLAGEN, - ApiRootLinkRel.UNASSIGNED_WIEDERVORLAGEN, - ])('should show if %s link exists', (linkRel: string) => { - component.apiRootResource = createApiRootResource([linkRel]); - fixture.detectChanges(); + it.each([ApiRootLinkRel.ALL_WIEDERVORLAGEN, ApiRootLinkRel.MY_WIEDERVORLAGEN, ApiRootLinkRel.UNASSIGNED_WIEDERVORLAGEN])( + 'should show if %s link exists', + (linkRel: string) => { + component.apiRootResource = createApiRootResource([linkRel]); + fixture.detectChanges(); - existsAsHtmlElement(fixture, wiedervorlagenView); - }); + existsAsHtmlElement(fixture, wiedervorlagenView); + }, + ); it('should hide if link not exists', () => { component.apiRootResource = createApiRootResource(); @@ -243,16 +258,15 @@ describe('VorgangViewsMenuComponent', () => { }); describe('vorgangList view', () => { - it.each([ - ApiRootLinkRel.ALLE_VORGAENGE, - ApiRootLinkRel.MEINE_VORGAENGE, - ApiRootLinkRel.UNASSIGNED, - ])('should show if %s link exists', (linkRel: string) => { - component.apiRootResource = createApiRootResource([linkRel]); - fixture.detectChanges(); + it.each([ApiRootLinkRel.ALLE_VORGAENGE, ApiRootLinkRel.MEINE_VORGAENGE, ApiRootLinkRel.UNASSIGNED])( + 'should show if %s link exists', + (linkRel: string) => { + component.apiRootResource = createApiRootResource([linkRel]); + fixture.detectChanges(); - existsAsHtmlElement(fixture, vorgangListView); - }); + existsAsHtmlElement(fixture, vorgangListView); + }, + ); it('should hide if link not exists', () => { component.apiRootResource = createApiRootResource(); @@ -263,16 +277,15 @@ describe('VorgangViewsMenuComponent', () => { }); describe('search view', () => { - it.each([ - ApiRootLinkRel.SEARCH_ALLE, - ApiRootLinkRel.SEARCH_MEINE, - ApiRootLinkRel.SEARCH_UNASSIGNED, - ])('should show if %s link exists', (linkRel: string) => { - component.apiRootResource = createApiRootResource([linkRel]); - fixture.detectChanges(); - - existsAsHtmlElement(fixture, searchView); - }); + it.each([ApiRootLinkRel.SEARCH_ALLE, ApiRootLinkRel.SEARCH_MEINE, ApiRootLinkRel.SEARCH_UNASSIGNED])( + 'should show if %s link exists', + (linkRel: string) => { + component.apiRootResource = createApiRootResource([linkRel]); + fixture.detectChanges(); + + existsAsHtmlElement(fixture, searchView); + }, + ); it('should hide if no link not exists', () => { component.apiRootResource = createApiRootResource();