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 d61611749a8fec3d11920afb391edf1d032561d2..a5aa186046f49824c53ab94ddebd5394e1f3163d 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 a968fc42f14871089d306cef6c14873a61912c6a..cd56ec154500fae2205c6f788d94ca80d10a61e3 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 7704278c6c8b4fecb72980cbd7d44adde5ef39f9..dbb837e14aa00710fd0748ec73a081cc93e18377 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 ea63b312ff3e29627d8ab6b9ee416bba604e4a4f..ae2e35e63b88d02a615aa989ce0e87008e938d0f 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 f160b4c776c056b355c2152ba7c4032afa5f2f16..e2a971e9e48ef33e172c99705bf1bdb3bda5f0cd 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 07b24609106dcaaa9a8dde72aa6986ed8a97de7d..e1cee55fd0a7129df263141a070686ae6a289575 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 dd2fd298ba53d76afaf3ec324e747c6523ce36e3..59b3f373767df50cedf519f502badc186375eea5 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 6136182f220a3a7bd7385cee676268c094262bab..aab928488dba9135aac9eba7f7ce589552887f55 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 {