Skip to content
Snippets Groups Projects
Commit 0e4b5a49 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-2626 OZG-2886 show email settings if link exists

parent 3a34dfe9
No related branches found
No related tags found
No related merge requests found
Showing
with 104 additions and 22 deletions
...@@ -9,7 +9,6 @@ import { Observable } from 'rxjs'; ...@@ -9,7 +9,6 @@ import { Observable } from 'rxjs';
styleUrls: ['./header-container.component.scss'] styleUrls: ['./header-container.component.scss']
}) })
export class HeaderContainerComponent { export class HeaderContainerComponent {
navigationCollapse$: Observable<boolean>; navigationCollapse$: Observable<boolean>;
constructor( constructor(
......
...@@ -26,3 +26,7 @@ export function dispatchEventFromFixture(fixture: ComponentFixture<any>, element ...@@ -26,3 +26,7 @@ export function dispatchEventFromFixture(fixture: ComponentFixture<any>, element
export function getDebugElementFromFixtureByCss(fixture: ComponentFixture<any>, query: string): DebugElement { export function getDebugElementFromFixtureByCss(fixture: ComponentFixture<any>, query: string): DebugElement {
return fixture.debugElement.query(By.css(query)); return fixture.debugElement.query(By.css(query));
} }
export function getElementFromDomRoot(fixture: ComponentFixture<any>, htmlElement: string): any {
return fixture.nativeElement.parentNode.querySelector(htmlElement);
}
<goofy-client-icon-button-with-spinner icon="settings" toolTip="Einstellungen" <goofy-client-icon-button-with-spinner icon="settings" toolTip="Einstellungen" data-test-id="user-settings-button"
[matMenuTriggerFor]="settingsMenu"> [matMenuTriggerFor]="settingsMenu">
</goofy-client-icon-button-with-spinner> </goofy-client-icon-button-with-spinner>
<mat-menu #settingsMenu="matMenu"> <mat-menu #settingsMenu="matMenu" data-test-id="user-settings-menu">
<div class="menu-container" (click)="$event.stopPropagation()"> <div class="menu-container" (click)="$event.stopPropagation()">
<goofy-client-user-settings-email-benachrichtigung <ng-container *ngIf="apiRoot$ | async as apiRoot">
[userSettings$]="userSettings$" <goofy-client-user-settings-email-benachrichtigung data-test-id="user-settings-email-benachrichtigung"
*ngIf="apiRoot.resource | hasLink: apiRootLinkRel.CURRENT_USER"
[userSettings]="userSettings$ | async"
(valueChanged)="changeNotificationsSendFor($event)" (valueChanged)="changeNotificationsSendFor($event)"
></goofy-client-user-settings-email-benachrichtigung> ></goofy-client-user-settings-email-benachrichtigung>
<goofy-client-user-settings-darkmode </ng-container>
<goofy-client-user-settings-darkmode data-test-id="user-settings-dark-mode"
[darkMode$]="darkMode$" [darkMode$]="darkMode$"
(darkModeEmitter)="changeColorMode($event)" (darkModeEmitter)="changeColorMode($event)"
></goofy-client-user-settings-darkmode> ></goofy-client-user-settings-darkmode>
......
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatButtonModule } from '@angular/material/button';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ApiRootFacade, ApiRootLinkRel } from '@goofy-client/api-root-shared';
import { AppService } from '@goofy-client/app-shared'; import { AppService } from '@goofy-client/app-shared';
import { mock } from '@goofy-client/test-utils'; import { createStateResource, HasLinkPipe } from '@goofy-client/tech-shared';
import { getElementFromDomRoot, mock } from '@goofy-client/test-utils';
import { IconButtonWithSpinnerComponent } from '@goofy-client/ui'; import { IconButtonWithSpinnerComponent } from '@goofy-client/ui';
import { UserSettingsService } from '@goofy-client/user-settings-shared'; import { UserSettingsService } from '@goofy-client/user-settings-shared';
import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
import { NotificationsSendFor } from 'libs/user-settings-shared/src/lib/user-settings.model'; import { NotificationsSendFor } from 'libs/user-settings-shared/src/lib/user-settings.model';
import { MockComponent } from 'ng-mocks'; import { MockComponent } from 'ng-mocks';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject, of } from 'rxjs';
import { UserSettingsContainerComponent } from './user-settings-container.component'; import { UserSettingsContainerComponent } from './user-settings-container.component';
import { UserSettingsDarkmodeComponent } from './user-settings-darkmode/user-settings-darkmode.component'; import { UserSettingsDarkmodeComponent } from './user-settings-darkmode/user-settings-darkmode.component';
import { UserSettingsEmailBenachrichtigungComponent } from './user-settings-email-benachrichtigung/user-settings-email-benachrichtigung.component'; import { UserSettingsEmailBenachrichtigungComponent } from './user-settings-email-benachrichtigung/user-settings-email-benachrichtigung.component';
...@@ -14,15 +20,27 @@ import { UserSettingsEmailBenachrichtigungComponent } from './user-settings-emai ...@@ -14,15 +20,27 @@ import { UserSettingsEmailBenachrichtigungComponent } from './user-settings-emai
describe('UserSettingsContainerComponent', () => { describe('UserSettingsContainerComponent', () => {
let component: UserSettingsContainerComponent; let component: UserSettingsContainerComponent;
let fixture: ComponentFixture<UserSettingsContainerComponent>; let fixture: ComponentFixture<UserSettingsContainerComponent>;
let menuButtonElement;
const darkModeSubj: BehaviorSubject<boolean> = new BehaviorSubject(false); const darkModeSubj: BehaviorSubject<boolean> = new BehaviorSubject(false);
const appService = { ...mock(AppService), getDarkMode: () => darkModeSubj }; const appService = { ...mock(AppService), getDarkMode: () => darkModeSubj };
const userSettingsService = { ...mock(UserSettingsService), setUserSettings: jest.fn() }; const userSettingsService = { ...mock(UserSettingsService), setUserSettings: jest.fn() };
const apiRootFacade = { ...mock(ApiRootFacade), getApiRoot: jest.fn() };
// const menu: string = getDataTestIdOf('user-settings-menu');
const menuButton = getDataTestIdOf('user-settings-button');
const emailBenachrichtigung: string = getDataTestIdOf('user-settings-email-benachrichtigung');
const darkMode: string = getDataTestIdOf('user-settings-dark-mode');
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [MatMenuModule], imports: [
NoopAnimationsModule,
MatButtonModule,
MatMenuModule
],
declarations: [ declarations: [
HasLinkPipe,
UserSettingsContainerComponent, UserSettingsContainerComponent,
MockComponent(UserSettingsDarkmodeComponent), MockComponent(UserSettingsDarkmodeComponent),
MockComponent(UserSettingsEmailBenachrichtigungComponent), MockComponent(UserSettingsEmailBenachrichtigungComponent),
...@@ -36,6 +54,10 @@ describe('UserSettingsContainerComponent', () => { ...@@ -36,6 +54,10 @@ describe('UserSettingsContainerComponent', () => {
{ {
provide: UserSettingsService, provide: UserSettingsService,
useValue: userSettingsService useValue: userSettingsService
},
{
provide: ApiRootFacade,
useValue: apiRootFacade
} }
], ],
}); });
...@@ -44,13 +66,27 @@ describe('UserSettingsContainerComponent', () => { ...@@ -44,13 +66,27 @@ describe('UserSettingsContainerComponent', () => {
beforeEach(() => { beforeEach(() => {
fixture = TestBed.createComponent(UserSettingsContainerComponent); fixture = TestBed.createComponent(UserSettingsContainerComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
fixture.detectChanges(); fixture.autoDetectChanges(true);
menuButtonElement = fixture.nativeElement.querySelector(menuButton);
}); });
it('should create', () => { it('should create', () => {
expect(component).toBeTruthy(); expect(component).toBeTruthy();
}); });
describe('settings menu', () => {
it('should not have the menu open', async () => {
const menu = getElementFromDomRoot(fixture, '.mat-menu-panel');
expect(menu).toBeFalsy();
});
it('open the menu when clicking on the account button', async () => {
menuButtonElement.click();
const menu = getElementFromDomRoot(fixture, '.mat-menu-panel');
expect(menu).toBeTruthy();
});
})
describe('change color mode', () => { describe('change color mode', () => {
it('should call app service', () => { it('should call app service', () => {
...@@ -60,6 +96,32 @@ describe('UserSettingsContainerComponent', () => { ...@@ -60,6 +96,32 @@ describe('UserSettingsContainerComponent', () => {
}) })
}) })
describe('Toggle for "notifications send for"', () => {
it('should call apiRootFacade to get apiRoot', () => {
component.ngOnInit();
expect(apiRootFacade.getApiRoot).toHaveBeenCalled();
})
it('should show if link exists', () => {
component.apiRoot$ = of(createStateResource(createApiRootResource([ApiRootLinkRel.CURRENT_USER])));
menuButtonElement.click();
const element = getElementFromDomRoot(fixture, emailBenachrichtigung);
expect(element).toBeInTheDocument();
})
it('should hide if link not exists', () => {
component.apiRoot$ = of(createStateResource(createApiRootResource()));
menuButtonElement.click();
const element = getElementFromDomRoot(fixture, emailBenachrichtigung);
expect(element).not.toBeInTheDocument();
})
})
describe('change notifications send for', () => { describe('change notifications send for', () => {
it('should call service with ALL', () => { it('should call service with ALL', () => {
...@@ -74,4 +136,13 @@ describe('UserSettingsContainerComponent', () => { ...@@ -74,4 +136,13 @@ describe('UserSettingsContainerComponent', () => {
expect(userSettingsService.setUserSettings).toHaveBeenCalledWith({ notificationsSendFor: NotificationsSendFor.NONE }); expect(userSettingsService.setUserSettings).toHaveBeenCalledWith({ notificationsSendFor: NotificationsSendFor.NONE });
}) })
}) })
describe('Toggle for "Dark mode"', () => {
it('should be visible', () => {
menuButtonElement.click();
const element = getElementFromDomRoot(fixture, darkMode);
expect(element).toBeInstanceOf(HTMLElement);
})
})
}); });
import { DOCUMENT } from '@angular/common'; import { DOCUMENT } from '@angular/common';
import { Component, Inject, OnInit, Renderer2 } from '@angular/core'; import { Component, Inject, OnInit, Renderer2 } from '@angular/core';
import { ApiRootFacade, ApiRootLinkRel, ApiRootResource } from '@goofy-client/api-root-shared';
import { AppService, localStorageDark } from '@goofy-client/app-shared'; import { AppService, localStorageDark } from '@goofy-client/app-shared';
import { StateResource } from '@goofy-client/tech-shared'; import { createEmptyStateResource, StateResource } from '@goofy-client/tech-shared';
import { UserSettingsService } from '@goofy-client/user-settings-shared'; import { UserSettingsService } from '@goofy-client/user-settings-shared';
import { NotificationsSendFor, UserSettings, UserSettingsResource } from 'libs/user-settings-shared/src/lib/user-settings.model'; import { NotificationsSendFor, UserSettings, UserSettingsResource } from 'libs/user-settings-shared/src/lib/user-settings.model';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
...@@ -14,11 +15,15 @@ import { Observable, of } from 'rxjs'; ...@@ -14,11 +15,15 @@ import { Observable, of } from 'rxjs';
export class UserSettingsContainerComponent implements OnInit { export class UserSettingsContainerComponent implements OnInit {
darkMode$: Observable<boolean> = of(true); darkMode$: Observable<boolean> = of(true);
userSettings$: Observable<StateResource<UserSettingsResource>>; userSettings$: Observable<StateResource<UserSettingsResource>>;
apiRoot$: Observable<StateResource<ApiRootResource>> = of(createEmptyStateResource<ApiRootResource>());
readonly apiRootLinkRel = ApiRootLinkRel;
constructor( constructor(
private renderer: Renderer2, private renderer: Renderer2,
private appService: AppService, private appService: AppService,
private userSettingsService: UserSettingsService, private userSettingsService: UserSettingsService,
private apiRootFacade: ApiRootFacade,
@Inject(DOCUMENT) private document: Document @Inject(DOCUMENT) private document: Document
) { ) {
this.darkMode$ = this.appService.getDarkMode(); this.darkMode$ = this.appService.getDarkMode();
...@@ -28,6 +33,7 @@ export class UserSettingsContainerComponent implements OnInit { ...@@ -28,6 +33,7 @@ export class UserSettingsContainerComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
this.userSettings$ = this.userSettingsService.getUserSettings(); this.userSettings$ = this.userSettingsService.getUserSettings();
this.apiRoot$ = this.apiRootFacade.getApiRoot();
} }
private subscribeToDarkMode(): void { private subscribeToDarkMode(): void {
......
<ng-container *ngIf="(userSettings$ | async)?.resource as userSettings"> <ng-container *ngIf="userSettings.resource">
<mat-slide-toggle data-test-id="toggle-notifications-send-for" <mat-slide-toggle data-test-id="toggle-notifications-send-for"
color="primary" color="primary"
matTooltip="Benachrichtigung per E-Mail bei Eingang eines Antrags" matTooltip="Benachrichtigung per E-Mail bei Eingang eines Antrags"
[checked]="getToggleStatus(userSettings)" [checked]="getToggleStatus(userSettings.resource)"
(change)="valueChanged.emit($event.checked)">Benachrichtigung per E-Mail (change)="valueChanged.emit($event.checked)">Benachrichtigung per E-Mail
</mat-slide-toggle> </mat-slide-toggle>
</ng-container> </ng-container>
\ No newline at end of file
...@@ -8,7 +8,6 @@ import { dispatchEventFromFixture, mock } from '@goofy-client/test-utils'; ...@@ -8,7 +8,6 @@ import { dispatchEventFromFixture, mock } from '@goofy-client/test-utils';
import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
import { NotificationsSendFor } from 'libs/user-settings-shared/src/lib/user-settings.model'; import { NotificationsSendFor } from 'libs/user-settings-shared/src/lib/user-settings.model';
import { createUserSettings, createUserSettingsResource } from 'libs/user-settings-shared/test/user-settings'; import { createUserSettings, createUserSettingsResource } from 'libs/user-settings-shared/test/user-settings';
import { of } from 'rxjs';
import { EventEmitter } from 'stream'; import { EventEmitter } from 'stream';
import { UserSettingsEmailBenachrichtigungComponent } from './user-settings-email-benachrichtigung.component'; import { UserSettingsEmailBenachrichtigungComponent } from './user-settings-email-benachrichtigung.component';
...@@ -29,7 +28,7 @@ describe('UserSettingsEmailBenachrichtigungComponent', () => { ...@@ -29,7 +28,7 @@ describe('UserSettingsEmailBenachrichtigungComponent', () => {
UserSettingsEmailBenachrichtigungComponent UserSettingsEmailBenachrichtigungComponent
); );
component = fixture.componentInstance; component = fixture.componentInstance;
component.userSettings$ = of(createStateResource(createUserSettingsResource())); component.userSettings = createStateResource(createUserSettingsResource());
component.valueChanged = { ...<any>mock(EventEmitter), emit: jest.fn() }; component.valueChanged = { ...<any>mock(EventEmitter), emit: jest.fn() };
fixture.detectChanges(); fixture.detectChanges();
}); });
......
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Component, EventEmitter, Input, Output } from '@angular/core';
import { StateResource } from '@goofy-client/tech-shared'; import { createEmptyStateResource, StateResource } from '@goofy-client/tech-shared';
import { NotificationsSendFor, UserSettings, UserSettingsResource } from '@goofy-client/user-settings-shared'; import { NotificationsSendFor, UserSettings, UserSettingsResource } from '@goofy-client/user-settings-shared';
import { Observable } from 'rxjs';
@Component({ @Component({
selector: 'goofy-client-user-settings-email-benachrichtigung', selector: 'goofy-client-user-settings-email-benachrichtigung',
...@@ -9,7 +8,7 @@ import { Observable } from 'rxjs'; ...@@ -9,7 +8,7 @@ import { Observable } from 'rxjs';
styleUrls: ['./user-settings-email-benachrichtigung.component.scss'], styleUrls: ['./user-settings-email-benachrichtigung.component.scss'],
}) })
export class UserSettingsEmailBenachrichtigungComponent { export class UserSettingsEmailBenachrichtigungComponent {
@Input() userSettings$: Observable<StateResource<UserSettingsResource>>; @Input() userSettings: StateResource<UserSettingsResource> = createEmptyStateResource<UserSettingsResource>();
@Output() valueChanged: EventEmitter<boolean> = new EventEmitter(); @Output() valueChanged: EventEmitter<boolean> = new EventEmitter();
public getToggleStatus(userSettings: UserSettings): boolean { public getToggleStatus(userSettings: UserSettings): boolean {
......
import '@testing-library/jest-dom';
import 'jest-preset-angular/setup-jest'; import 'jest-preset-angular/setup-jest';
import { getTestBed } from '@angular/core/testing'; import { getTestBed } from '@angular/core/testing';
import { import {
BrowserDynamicTestingModule, BrowserDynamicTestingModule,
platformBrowserDynamicTesting, platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing'; } from '@angular/platform-browser-dynamic/testing';
getTestBed().resetTestEnvironment(); getTestBed().resetTestEnvironment();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment