From cc04514d49eb5422d560749f631cc5e7a61fb67a Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Fri, 17 Mar 2023 14:46:22 +0100 Subject: [PATCH] OZG-3574 add test in vorgang / navigation lib --- .../src/lib/navigation.service.spec.ts | 29 +++++++- .../src/lib/navigation.service.ts | 2 - .../src/lib/vorgang-list-page.guard.spec.ts | 66 ++++++++++++++++++- .../src/lib/vorgang-list-page.guard.ts | 7 +- .../vorgang-filter-menu.component.html | 2 +- .../vorgang-filter-menu.component.spec.ts | 64 ++++++++++-------- .../vorgang-filter-menu.component.ts | 5 +- .../vorgang-filter-menu.formservice.ts | 6 +- 8 files changed, 139 insertions(+), 42 deletions(-) diff --git a/goofy-client/libs/navigation-shared/src/lib/navigation.service.spec.ts b/goofy-client/libs/navigation-shared/src/lib/navigation.service.spec.ts index d61611749a..a5aa186046 100644 --- a/goofy-client/libs/navigation-shared/src/lib/navigation.service.spec.ts +++ b/goofy-client/libs/navigation-shared/src/lib/navigation.service.spec.ts @@ -155,7 +155,7 @@ describe('NavigationService', () => { }) }) - describe('isVorgnagListPage', () => { + describe('isVorgangListPage', () => { it('should return true if params are empty', () => { const isPage: boolean = NavigationService.isVorgangListPage({ }); @@ -302,4 +302,31 @@ describe('NavigationService', () => { expect(router.navigate).toHaveBeenCalledWith([EMPTY_STRING, 'meine', 'neu']); }) }) + + describe('getRootPath', () => { + + it('should call isMeineVorgaengeFilter', () => { + service.isMeineVorgaengeFilter = jest.fn(); + + service.getRootPath(); + + expect(service.isMeineVorgaengeFilter).toHaveBeenCalled(); + }) + + it('should return NavigationService.MEINE_VORGAENGE_PATH', () => { + service.isMeineVorgaengeFilter = jest.fn().mockReturnValue(true); + + const path: string = service.getRootPath(); + + expect(path).toBe(NavigationService.MEINE_VORGAENGE_PATH); + }) + + it('should return NavigationService.ALLE_VORGAENGE_PATH', () => { + service.isMeineVorgaengeFilter = jest.fn().mockReturnValue(false); + + const path: string = service.getRootPath(); + + expect(path).toBe(NavigationService.ALLE_VORGAENGE_PATH); + }) + }) }) \ No newline at end of file diff --git a/goofy-client/libs/navigation-shared/src/lib/navigation.service.ts b/goofy-client/libs/navigation-shared/src/lib/navigation.service.ts index a968fc42f1..cd56ec1545 100644 --- a/goofy-client/libs/navigation-shared/src/lib/navigation.service.ts +++ b/goofy-client/libs/navigation-shared/src/lib/navigation.service.ts @@ -174,7 +174,6 @@ export class NavigationService { this.router.navigate([this.getRootPath()]); } - //TODO Test getRootPath(): string { return this.isMeineVorgaengeFilter() ? NavigationService.MEINE_VORGAENGE_PATH @@ -211,7 +210,6 @@ export class NavigationService { return this.facade.getCurrentRouteData(); } - //TODO Test public navigateByLocalStorage(): void { this.router.navigate(buildPathSegmentsFromLocalStorage()); } diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.spec.ts index 7704278c6c..dbb837e14a 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.spec.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.spec.ts @@ -22,11 +22,13 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { TestBed } from '@angular/core/testing'; -import { Router } from '@angular/router'; +import { Router, UrlTree } from '@angular/router'; import { mock } from '@goofy-client/test-utils'; import { OAuthService } from 'angular-oauth2-oidc'; import { VorgangListPageGuard } from './vorgang-list-page.guard'; +import * as VorgangNavigationUtil from 'libs/vorgang-shared/src/lib/vorgang-navigation.util'; + describe('VorgangListPageGuard', () => { let guard: VorgangListPageGuard; @@ -66,17 +68,75 @@ describe('VorgangListPageGuard', () => { }) describe('buildDefaultUrlTreeFromLocalStorage', () => { + const buildPathSegmentsFromLocalStorage = jest.spyOn(VorgangNavigationUtil, 'buildPathSegmentsFromLocalStorage'); + + it('should call guard.accessTokenIsInvalid', () => { + guard.accessTokenIsInvalid = jest.fn(); - it('should call authService.getAccessToken', () => { guard.buildDefaultUrlTreeFromLocalStorage(); - expect(authService.getAccessToken).toHaveBeenCalled(); + expect(guard.accessTokenIsInvalid).toHaveBeenCalled(); }) it('should call router.createUrlTree', () => { + guard.accessTokenIsInvalid = jest.fn().mockReturnValue(false); + guard.buildDefaultUrlTreeFromLocalStorage(); expect(router.createUrlTree).toHaveBeenCalled(); }) + + it('should call VorgangNavigationUtil.buildPathSegmentsFromLocalStorage', () => { + guard.accessTokenIsInvalid = jest.fn().mockReturnValue(false); + + guard.buildDefaultUrlTreeFromLocalStorage(); + + expect(buildPathSegmentsFromLocalStorage).toHaveBeenCalled(); + }) + + it('should return URLTree if access token is valid', () => { + guard.accessTokenIsInvalid = jest.fn().mockReturnValue(false); + const pathSegments: string[] = ['meine', 'neu']; + buildPathSegmentsFromLocalStorage.mockReturnValue(pathSegments); + + guard.buildDefaultUrlTreeFromLocalStorage(); + + expect(router.createUrlTree).toHaveBeenCalledWith(pathSegments); + }) + + it('should return true if it has no valid access token', () => { + guard.accessTokenIsInvalid = jest.fn().mockReturnValue(true); + + const result: boolean | UrlTree = guard.buildDefaultUrlTreeFromLocalStorage(); + + expect(result).toBeTruthy(); + }) + }) + + describe('accessTokenIsInvalid', () => { + it('should call authService.hasValidAccessToken', () => { + authService.hasValidAccessToken = jest.fn(); + + guard.accessTokenIsInvalid(); + + expect(authService.hasValidAccessToken).toHaveBeenCalled(); + }) + + + it('should return true', () => { + authService.hasValidAccessToken = jest.fn().mockReturnValue(false); + + const result: boolean = guard.accessTokenIsInvalid(); + + expect(result).toBeTruthy(); + }) + + it('should return false', () => { + authService.hasValidAccessToken = jest.fn().mockReturnValue(true); + + const result: boolean = guard.accessTokenIsInvalid(); + + expect(result).toBeFalsy(); + }) }) }); diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.ts index ea63b312ff..ae2e35e63b 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page.guard.ts @@ -25,7 +25,6 @@ import { Injectable } from '@angular/core'; import { CanActivate, Router, UrlTree } from '@angular/router'; import { OAuthService } from 'angular-oauth2-oidc'; import { buildPathSegmentsFromLocalStorage } from 'libs/vorgang-shared/src/lib/vorgang-navigation.util'; -import { isNull } from 'lodash-es'; @Injectable() export class VorgangListPageGuard implements CanActivate { @@ -36,9 +35,8 @@ export class VorgangListPageGuard implements CanActivate { return this.buildDefaultUrlTreeFromLocalStorage(); } - //TODO Tests buildDefaultUrlTreeFromLocalStorage(): boolean | UrlTree { - if (isNull(this.authService.getAccessToken())) { + if (this.accessTokenIsInvalid()) { return true; } @@ -47,4 +45,7 @@ export class VorgangListPageGuard implements CanActivate { return this.router.createUrlTree(pathSegments); } + accessTokenIsInvalid(): boolean { + return ! this.authService.hasValidAccessToken(); + } } diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html index f160b4c776..e2a971e9e4 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.html @@ -24,7 +24,7 @@ --> <form [formGroup]="formService.form" *ngIf="multipleFilterAvailable" data-test-id="vorgang-filter-form"> - <mat-button-toggle-group [formControlName]="formService.FILTER" multiple="false"> + <mat-button-toggle-group [formControlName]="filterName" multiple="false"> <mat-button-toggle *ngIf="apiRootStateResource.resource | hasLink: apiRootLinkRel.MEINE_VORGAENGE" data-test-id="meine-vorgaenge-filter-toggle-button" [value]="formService.FILTER_MEINE_VALUE"> <goofy-client-vorgang-meine-filter-item-container></goofy-client-vorgang-meine-filter-item-container> </mat-button-toggle> diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.spec.ts index 07b2460910..e1cee55fd0 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.spec.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.spec.ts @@ -27,8 +27,8 @@ import { MatButtonToggle, MatButtonToggleGroup } from '@angular/material/button- import { MatRipple } from '@angular/material/core'; import { ApiRootLinkRel } from '@goofy-client/api-root-shared'; import { NavigationService } from '@goofy-client/navigation-shared'; -import { createStateResource, HasLinkPipe } from '@goofy-client/tech-shared'; -import { getElementFromFixture, mock } from '@goofy-client/test-utils'; +import { createEmptyStateResource, createStateResource, HasLinkPipe } from '@goofy-client/tech-shared'; +import { existsAsHtmlElement, mock, notExistsAsHtmlElement } from '@goofy-client/test-utils'; import { VorgangListService } from '@goofy-client/vorgang-shared'; import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -40,30 +40,18 @@ import { VorgangFilterMenuComponent } from './vorgang-filter-menu.component'; import { VorgangFilterFormService } from './vorgang-filter-menu.formservice'; import { VorgangMeineFilterItemContainerComponent } from './vorgang-meine-filter-item-container/vorgang-meine-filter-item-container.component'; -describe.skip('FIXME: VorgangFilterMenuComponent', () => { +describe('VorgangFilterMenuComponent', () => { let component: VorgangFilterMenuComponent; let fixture: ComponentFixture<VorgangFilterMenuComponent>; const alleFilterToggleButton: string = getDataTestIdOf('alle-filter-toggle-button'); const meineVorgaengeFilterToggleButton: string = getDataTestIdOf('meine-vorgaenge-filter-toggle-button'); - // const form: FormGroup = <any>{ - // controls: { - // test: new FormControl(null) - // } - // }; - // const vorgangFilterFormService = { ...mock(VorgangFilterFormService) , form }; - const form: FormGroup = new FormBuilder().group({ filter: new FormControl() }); - // const form: FormGroup = <any>{ - // controls: { - // test: new FormControl(null) - // } - // }; + const vorgangFilterFormService = { ...mock(VorgangFilterFormService) , form }; - // const vorgangFilterFormService = mock(VorgangFilterFormService); const navigationService = mock(NavigationService); const vorgangListService = mock(VorgangListService); @@ -115,43 +103,65 @@ describe.skip('FIXME: VorgangFilterMenuComponent', () => { describe('alle filter item', () => { - it('should show on existing link', () => { - component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.ALLE_VORGAENGE])); + it('should show on two existing links', () => { + component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.ALLE_VORGAENGE, ApiRootLinkRel.MEINE_VORGAENGE])); fixture.detectChanges(); - const element = getElementFromFixture(fixture, alleFilterToggleButton); - expect(element).toBeInstanceOf(HTMLElement); + existsAsHtmlElement(fixture, alleFilterToggleButton); }) it('should hide on missing link', () => { component.apiRootStateResource = createStateResource(createApiRootResource()); fixture.detectChanges(); - const element = getElementFromFixture(fixture, alleFilterToggleButton); - expect(element).not.toBeInstanceOf(HTMLElement); + notExistsAsHtmlElement(fixture, alleFilterToggleButton); }) }) describe('meine vorgaenge filter item', () => { it('should show on existing link', () => { - component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.MEINE_VORGAENGE])); + component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.ALLE_VORGAENGE, ApiRootLinkRel.MEINE_VORGAENGE])); fixture.detectChanges(); - const element = getElementFromFixture(fixture, meineVorgaengeFilterToggleButton); - expect(element).toBeInstanceOf(HTMLElement); + existsAsHtmlElement(fixture, meineVorgaengeFilterToggleButton); }) it('should hide on missing link', () => { component.apiRootStateResource = createStateResource(createApiRootResource()); fixture.detectChanges(); - const element = getElementFromFixture(fixture, meineVorgaengeFilterToggleButton); - expect(element).not.toBeInstanceOf(HTMLElement); + notExistsAsHtmlElement(fixture, meineVorgaengeFilterToggleButton); + }) + }) + + describe('areMultipleFilterAvailable', () => { + it('should return true if more than one link', () => { + component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.ALLE_VORGAENGE, ApiRootLinkRel.MEINE_VORGAENGE])); + + const result: boolean = component.areMultipleFilterAvailable(); + + expect(result).toBeTruthy(); + }) + + it('should return false if only one link', () => { + component.apiRootStateResource = createStateResource(createApiRootResource([ApiRootLinkRel.ALLE_VORGAENGE])); + + const result: boolean = component.areMultipleFilterAvailable(); + + expect(result).toBeFalsy(); + }) + + it('should return false if no link', () => { + component.apiRootStateResource = createEmptyStateResource(); + + const result: boolean = component.areMultipleFilterAvailable(); + + expect(result).toBeFalsy(); }) }) }); diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.ts index dd2fd298ba..59b3f37376 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.component.ts @@ -47,9 +47,10 @@ export class VorgangFilterMenuComponent { readonly apiRootLinkRel = ApiRootLinkRel; - constructor(public formService: VorgangFilterFormService){ } + filterName: string = VorgangFilterFormService.FILTER; + + constructor(public formService: VorgangFilterFormService) {} - //TODO Test areMultipleFilterAvailable(): boolean { return hasLink(this.apiRootStateResource.resource, ApiRootLinkRel.ALLE_VORGAENGE) && hasLink(this.apiRootStateResource.resource, ApiRootLinkRel.MEINE_VORGAENGE); } diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.formservice.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.formservice.ts index 6136182f22..aab928488d 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.formservice.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/vorgang-filter-menu.formservice.ts @@ -10,7 +10,7 @@ export class VorgangFilterFormService implements OnDestroy { public form: FormGroup; - public readonly FILTER: string = 'filter'; + static readonly FILTER: string = 'filter'; public readonly FILTER_ALLE_VALUE: string = 'alle'; public readonly FILTER_MEINE_VALUE: string = 'meine'; @@ -34,7 +34,7 @@ export class VorgangFilterFormService implements OnDestroy { private initForm(): void { this.form = this.formBuilder.group({ - [this.FILTER]: new FormControl() + [VorgangFilterFormService.FILTER]: new FormControl() }) } @@ -51,7 +51,7 @@ export class VorgangFilterFormService implements OnDestroy { } private getFilterControl(): FormControl { - return <FormControl>this.form.controls[this.FILTER]; + return <FormControl>this.form.controls[VorgangFilterFormService.FILTER]; } private handleFilterChange(value: string): void { -- GitLab