Skip to content
Snippets Groups Projects
Verified Commit e229480b authored by Sebastian Bergandy's avatar Sebastian Bergandy :keyboard:
Browse files

Merge branch 'main' into OZG-7507-admin-organisationsEinheit-loeschen

parents 311e0879 bd977c31
No related branches found
No related tags found
1 merge request!82OZG-7507 use new open dialog button
Showing
with 256 additions and 41 deletions
...@@ -79,7 +79,7 @@ services: ...@@ -79,7 +79,7 @@ services:
depends_on: depends_on:
- user-manager - user-manager
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" - 'host.docker.internal:host-gateway'
alfa-cors-proxy: alfa-cors-proxy:
image: alfa-cors-proxy image: alfa-cors-proxy
...@@ -91,7 +91,6 @@ services: ...@@ -91,7 +91,6 @@ services:
alfa: alfa:
condition: service_started condition: service_started
user-manager: user-manager:
image: docker.ozg-sh.de/user-manager:${USER_MANAGER_DOCKER_IMAGE:-snapshot-latest} image: docker.ozg-sh.de/user-manager:${USER_MANAGER_DOCKER_IMAGE:-snapshot-latest}
platform: linux/amd64 platform: linux/amd64
...@@ -132,6 +131,7 @@ services: ...@@ -132,6 +131,7 @@ services:
- SPRING_DATA_MONGODB_URI=mongodb://mongodb:27017/config-db - SPRING_DATA_MONGODB_URI=mongodb://mongodb:27017/config-db
- OZGCLOUD_OAUTH2_REALM=${KEYCLOAK_REALM:-by-e2e-tests-local-dev} - OZGCLOUD_OAUTH2_REALM=${KEYCLOAK_REALM:-by-e2e-tests-local-dev}
- ozgcloud_organisationeinheit_zufisearchuri=http://localhost:8082/api/organisationseinheits - ozgcloud_organisationeinheit_zufisearchuri=http://localhost:8082/api/organisationseinheits
- OZGCLOUD_USER-ASSISTANCE_DOCUMENTATION_URL=http://dummy-leitfaden.url
- BPL_DEBUG_ENABLED=true - BPL_DEBUG_ENABLED=true
- BPL_DEBUG_PORT=5100 - BPL_DEBUG_PORT=5100
ports: ports:
...@@ -145,4 +145,4 @@ services: ...@@ -145,4 +145,4 @@ services:
user-manager: user-manager:
condition: service_started condition: service_started
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" - 'host.docker.internal:host-gateway'
...@@ -26,6 +26,7 @@ import { UserProfileE2EComponent } from './user-profile.component.e2e'; ...@@ -26,6 +26,7 @@ import { UserProfileE2EComponent } from './user-profile.component.e2e';
export class CurrentUserProfileE2EComponent { export class CurrentUserProfileE2EComponent {
private readonly locatorUserIconButton: string = 'popup-button-content'; private readonly locatorUserIconButton: string = 'popup-button-content';
private readonly locatorLogoutButton: string = 'popup-logout-button'; private readonly locatorLogoutButton: string = 'popup-logout-button';
private readonly locatorDocumentation: string = 'admin-documentation';
private readonly locatorRoot: string = 'current-user'; private readonly locatorRoot: string = 'current-user';
...@@ -46,7 +47,11 @@ export class CurrentUserProfileE2EComponent { ...@@ -46,7 +47,11 @@ export class CurrentUserProfileE2EComponent {
return cy.getTestElement(this.locatorUserIconButton); return cy.getTestElement(this.locatorUserIconButton);
} }
private getLogoutButton() { public getLogoutButton() {
return cy.getTestElement(this.locatorLogoutButton); return cy.getTestElement(this.locatorLogoutButton);
} }
public getDocumentation() {
return cy.getTestElement(this.locatorDocumentation);
}
} }
/* /*
* Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein * Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei * Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
...@@ -21,27 +21,36 @@ ...@@ -21,27 +21,36 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HeaderE2EComponent } from '../../../page-objects/header.po';
import { MainPage } from '../../../page-objects/main.po';
import { exist, shouldHaveAttribute } from '../../../support/cypress.util';
import { loginAsAriane } from '../../../support/user-util';
import { OpenDocumentationButtonComponent } from './open-documentation-button.component'; describe('User Profile Menu', () => {
import { MockComponent } from 'ng-mocks'; const mainPage: MainPage = new MainPage();
import { OpenUrlButtonComponent } from '@alfa-client/ui'; const header: HeaderE2EComponent = mainPage.getHeader();
describe('OpenDocumentationButtonComponent', () => { const documentationLink: string = 'http://dummy-leitfaden.url';
let component: OpenDocumentationButtonComponent;
let fixture: ComponentFixture<OpenDocumentationButtonComponent>;
beforeEach(async () => { before(() => {
await TestBed.configureTestingModule({ loginAsAriane();
declarations: [OpenDocumentationButtonComponent, MockComponent(OpenUrlButtonComponent)], });
}).compileComponents();
describe('open user profile menu', () => {
before(() => {
header.getCurrentUserProfile().getUserIconButton().click();
});
fixture = TestBed.createComponent(OpenDocumentationButtonComponent); it('should show logout button', () => {
component = fixture.componentInstance; exist(header.getCurrentUserProfile().getLogoutButton());
fixture.detectChanges();
}); });
it('should create', () => { it('should show documentation', () => {
expect(component).toBeTruthy(); exist(header.getCurrentUserProfile().getDocumentation());
});
it('should find documentation link', () => {
shouldHaveAttribute(header.getCurrentUserProfile().getDocumentation().find('a'), 'href', documentationLink);
});
}); });
}); });
{ {
"name": "admin", "name": "admin",
"version": "null" "version": "1.6.0-SNAPSHOT"
} }
...@@ -36,7 +36,10 @@ ...@@ -36,7 +36,10 @@
> >
<ods-admin-logo-icon /> <ods-admin-logo-icon />
</a> </a>
<user-profile-button-container data-test-id="user-profile-button"></user-profile-button-container> <user-profile-button-container
[apiRootStateResource]="apiRootStateResource$ | async"
data-test-id="user-profile-button"
></user-profile-button-container>
</header> </header>
<div class="flex h-screen w-full justify-center overflow-y-auto"> <div class="flex h-screen w-full justify-center overflow-y-auto">
<ods-navbar data-test-id="navigation"> <ods-navbar data-test-id="navigation">
......
...@@ -27,31 +27,18 @@ import { KeycloakTokenService } from '@admin/keycloak-shared'; ...@@ -27,31 +27,18 @@ import { KeycloakTokenService } from '@admin/keycloak-shared';
import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared'; import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
import { BuildInfoComponent } from '@alfa-client/common'; import { BuildInfoComponent } from '@alfa-client/common';
import { createEmptyStateResource, createStateResource, HasLinkPipe } from '@alfa-client/tech-shared'; import { createEmptyStateResource, createStateResource, HasLinkPipe } from '@alfa-client/tech-shared';
import { import { existsAsHtmlElement, getElementComponentFromFixtureByCss, Mock, mock, notExistsAsHtmlElement, } from '@alfa-client/test-utils';
existsAsHtmlElement,
getElementComponentFromFixtureByCss,
Mock,
mock,
notExistsAsHtmlElement,
} from '@alfa-client/test-utils';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ActivatedRoute, Router, RouterOutlet } from '@angular/router'; import { ActivatedRoute, Router, RouterOutlet } from '@angular/router';
import { AuthenticationService } from '@authentication'; import { AuthenticationService } from '@authentication';
import { import { AdminLogoIconComponent, MailboxIconComponent, NavbarComponent, NavItemComponent, OrgaUnitIconComponent, UsersIconComponent, } from '@ods/system';
AdminLogoIconComponent,
MailboxIconComponent,
NavbarComponent,
NavItemComponent,
OrgaUnitIconComponent,
UsersIconComponent,
} from '@ods/system';
import { createConfigurationResource } from 'libs/admin/configuration-shared/test/configuration'; import { createConfigurationResource } from 'libs/admin/configuration-shared/test/configuration';
import { MenuContainerComponent } from 'libs/admin/configuration/src/lib/menu-container/menu-container.component'; import { MenuContainerComponent } from 'libs/admin/configuration/src/lib/menu-container/menu-container.component';
import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
import { MockComponent, MockDirective } from 'ng-mocks'; import { MockComponent, MockDirective } from 'ng-mocks';
import { of, Subscription } from 'rxjs'; import { of, Subscription } from 'rxjs';
import { UserProfileButtonContainerComponent } from '../common/user-profile-button-container/user-profile.button-container.component'; import { UserProfileButtonContainerComponent } from '../../../../libs/admin/user-profile/src/lib/user-menu/user-profile.button-container.component';
import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/unavailable-page.component'; import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/unavailable-page.component';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
......
...@@ -41,7 +41,7 @@ import { ...@@ -41,7 +41,7 @@ import {
UsersIconComponent, UsersIconComponent,
} from '@ods/system'; } from '@ods/system';
import { filter, Observable, Subscription } from 'rxjs'; import { filter, Observable, Subscription } from 'rxjs';
import { UserProfileButtonContainerComponent } from '../common/user-profile-button-container/user-profile.button-container.component'; import { UserProfileButtonContainerComponent } from '../../../../libs/admin/user-profile/src/lib/user-menu/user-profile.button-container.component';
import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/unavailable-page.component'; import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/unavailable-page.component';
@Component({ @Component({
......
import { shouldHaveAttribute } from "../../support/cypress.util"; import { shouldHaveAttribute } from '../../support/cypress.util';
/* /*
* Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
...@@ -27,7 +27,7 @@ export class HelpMenuE2EComponent { ...@@ -27,7 +27,7 @@ export class HelpMenuE2EComponent {
private readonly root: string = 'help-menu'; private readonly root: string = 'help-menu';
private readonly button: string = 'help-menu-button'; private readonly button: string = 'help-menu-button';
private readonly dropdownButton: string = 'dropdown-button'; private readonly dropdownButton: string = 'dropdown-button';
private readonly openDocumentationButton: string = 'open-documentation-button'; private readonly documentation: string = 'documentation';
private readonly openImpressumButton: string = 'impressum'; private readonly openImpressumButton: string = 'impressum';
public getRoot() { public getRoot() {
...@@ -42,15 +42,15 @@ export class HelpMenuE2EComponent { ...@@ -42,15 +42,15 @@ export class HelpMenuE2EComponent {
return this.getRoot().getTestElement(this.dropdownButton); return this.getRoot().getTestElement(this.dropdownButton);
} }
public getOpenDocumentationButton() { public getDocumentation() {
return this.getRoot().getTestElementWithOid(this.openDocumentationButton); return this.getRoot().getTestElementWithOid(this.documentation);
} }
public getImpressumButton(): Cypress.Chainable<Element> { public getImpressumButton(): Cypress.Chainable<Element> {
return cy.getTestElement(this.openImpressumButton) return cy.getTestElement(this.openImpressumButton);
} }
public impressumLinkIs(link: string): void { public impressumLinkIs(link: string): void {
shouldHaveAttribute(this.getImpressumButton().find('a'),'href', link) shouldHaveAttribute(this.getImpressumButton().find('a'), 'href', link);
} }
} }
...@@ -25,7 +25,7 @@ import { HelpMenuE2EComponent } from 'apps/alfa-e2e/src/components/user-assistan ...@@ -25,7 +25,7 @@ import { HelpMenuE2EComponent } from 'apps/alfa-e2e/src/components/user-assistan
import { HeaderE2EComponent } from 'apps/alfa-e2e/src/page-objects/header.po'; import { HeaderE2EComponent } from 'apps/alfa-e2e/src/page-objects/header.po';
import { MainPage, waitForSpinnerToDisappear } from 'apps/alfa-e2e/src/page-objects/main.po'; import { MainPage, waitForSpinnerToDisappear } from 'apps/alfa-e2e/src/page-objects/main.po';
import { dropCollections } from 'apps/alfa-e2e/src/support/cypress-helper'; import { dropCollections } from 'apps/alfa-e2e/src/support/cypress-helper';
import { contains, exist, shouldHaveAttribute } from 'apps/alfa-e2e/src/support/cypress.util'; import { exist } from 'apps/alfa-e2e/src/support/cypress.util';
import { loginAsSabine } from 'apps/alfa-e2e/src/support/user-util'; import { loginAsSabine } from 'apps/alfa-e2e/src/support/user-util';
describe('Help Menu', () => { describe('Help Menu', () => {
...@@ -33,7 +33,7 @@ describe('Help Menu', () => { ...@@ -33,7 +33,7 @@ describe('Help Menu', () => {
const header: HeaderE2EComponent = mainPage.getHeader(); const header: HeaderE2EComponent = mainPage.getHeader();
const helpMenu: HelpMenuE2EComponent = header.getHelpMenu(); const helpMenu: HelpMenuE2EComponent = header.getHelpMenu();
const impressumLink: string = 'https://static.dev.sh.ozg-cloud.de/impressum' const impressumLink: string = 'https://static.dev.sh.ozg-cloud.de/impressum';
before(() => { before(() => {
loginAsSabine(); loginAsSabine();
...@@ -50,7 +50,7 @@ describe('Help Menu', () => { ...@@ -50,7 +50,7 @@ describe('Help Menu', () => {
it('should show "open documentation"', () => { it('should show "open documentation"', () => {
helpMenu.getRoot().click(); helpMenu.getRoot().click();
exist(helpMenu.getOpenDocumentationButton()); exist(helpMenu.getDocumentation());
}); });
it('should show Impressum button and find link', () => { it('should show Impressum button and find link', () => {
...@@ -59,13 +59,7 @@ describe('Help Menu', () => { ...@@ -59,13 +59,7 @@ describe('Help Menu', () => {
}); });
it('should open documentation', () => { it('should open documentation', () => {
helpMenu helpMenu.getDocumentation().find('a').invoke('removeAttr', 'target').click().url().should('include', 'benutzerleitfaden');
.getOpenDocumentationButton()
.find('a')
.invoke('removeAttr', 'target')
.click()
.url()
.should('include', 'benutzerleitfaden');
}); });
}); });
}); });
{
"extends": ["../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts"],
"extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
"rules": {
"@angular-eslint/directive-selector": [
"error",
{
"type": "attribute",
"prefix": "lib",
"style": "camelCase"
}
],
"@angular-eslint/component-selector": [
"error",
{
"type": "element",
"prefix": "lib",
"style": "kebab-case"
}
]
}
},
{
"files": ["*.html"],
"extends": ["plugin:@nx/angular-template"],
"rules": {}
}
]
}
# admin-user-profile
This library was generated with [Nx](https://nx.dev).
## Running unit tests
Run `nx test admin-user-profile` to execute the unit tests.
export default {
displayName: 'admin-user-profile',
preset: '../../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
coverageDirectory: '../../../coverage/libs/admin/user-profile',
transform: {
'^.+\\.(ts|mjs|js|html)$': [
'jest-preset-angular',
{
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
},
],
},
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
snapshotSerializers: [
'jest-preset-angular/build/serializers/no-ng-attributes',
'jest-preset-angular/build/serializers/ng-snapshot',
'jest-preset-angular/build/serializers/html-comment',
],
};
{
"name": "admin-user-profile",
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/admin/user-profile/src",
"prefix": "lib",
"projectType": "library",
"tags": [],
"targets": {
"test": {
"executor": "@nx/jest:jest",
"outputs": [
"{workspaceRoot}/coverage/{projectRoot}"
],
"options": {
"jestConfig": "libs/admin/user-profile/jest.config.ts"
}
},
"lint": {
"executor": "@nx/eslint:lint"
}
}
}
<ods-dropdown-menu-link-item caption="Leitfaden für die Administration" text="PDF öffnen" [url]="url">
<ods-file-icon icon fileType="pdf" size="medium" />
</ods-dropdown-menu-link-item>
:host {
white-space: nowrap;
}
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DropdownMenuLinkItemComponent, FileIconComponent } from '@ods/system';
import { MockComponent } from 'ng-mocks';
import { DocumentationComponent } from './documentation.component';
describe('DocumentationComponent', () => {
let component: DocumentationComponent;
let fixture: ComponentFixture<DocumentationComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [DocumentationComponent, MockComponent(DropdownMenuLinkItemComponent), MockComponent(FileIconComponent)],
}).compileComponents();
fixture = TestBed.createComponent(DocumentationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, Input } from '@angular/core';
import { DropdownMenuLinkItemComponent, FileIconComponent } from '@ods/system';
@Component({
selector: 'admin-documentation',
templateUrl: './documentation.component.html',
styleUrls: ['./documentation.component.scss'],
standalone: true,
imports: [DropdownMenuLinkItemComponent, FileIconComponent],
})
export class DocumentationComponent {
@Input() url: string;
}
<ods-dropdown-menu-button-item caption="Abmelden" (clickEmitter)="logout.emit()" data-test-id="popup-logout-button">
<ods-logout-icon icon class="fill-primary" />
</ods-dropdown-menu-button-item>
import { dispatchEventFromFixture, MockEvent } from '@alfa-client/test-utils';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { expect } from '@jest/globals';
import { getDataTestIdOf } from '../../../../../tech-shared/test/data-test';
import { AdminUserLogoutButtonComponent } from './admin-user-logout-button.component';
describe('AdminUserLogoutButtonComponent', () => {
let component: AdminUserLogoutButtonComponent;
let fixture: ComponentFixture<AdminUserLogoutButtonComponent>;
const logoutButtonTestId: string = getDataTestIdOf('popup-logout-button');
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [AdminUserLogoutButtonComponent],
}).compileComponents();
fixture = TestBed.createComponent(AdminUserLogoutButtonComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('template', () => {
describe('menu button item', () => {
describe('output', () => {
describe('clickEmitter', () => {
it('should emit', () => {
component.logout.emit = jest.fn();
dispatchEventFromFixture(fixture, logoutButtonTestId, MockEvent.CLICK);
expect(component.logout.emit).toHaveBeenCalled();
});
});
});
});
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment