diff --git a/alfa-client/apps/alfa/src/app/app.component.spec.ts b/alfa-client/apps/alfa/src/app/app.component.spec.ts index f50f222a3cb24322f264207532148c40226ab1bf..0ca6382a2e0987cdbc277b9d388a891049849563 100644 --- a/alfa-client/apps/alfa/src/app/app.component.spec.ts +++ b/alfa-client/apps/alfa/src/app/app.component.spec.ts @@ -430,9 +430,7 @@ describe('AppComponent', () => { it('should return path segments from localStorage', () => { const pathSegments: string[] = ['alle', 'angenommen']; - jest - .spyOn(VorgangNavigationUtil, 'buildPathSegmentsFromLocalStorage') - .mockReturnValue(pathSegments); + jest.spyOn(VorgangNavigationUtil, 'buildPathSegmentsFromLocalStorage').mockReturnValue(pathSegments); const redirectUri: string = component.buildInitialPath(); @@ -452,7 +450,7 @@ describe('AppComponent', () => { it('should return query params', () => { const expected: Params = { uri: 'some-uri' }; - const queryParams = component.buildInitialQueryParams(); + const queryParams: Params = component.buildInitialQueryParams(); expect(queryParams).toStrictEqual(expected); }); @@ -466,7 +464,7 @@ describe('AppComponent', () => { }); it('should return undefined', () => { - const queryParams = component.buildInitialQueryParams(); + const queryParams: Params = component.buildInitialQueryParams(); expect(queryParams).toBeUndefined(); }); diff --git a/alfa-client/apps/alfa/src/app/app.component.ts b/alfa-client/apps/alfa/src/app/app.component.ts index c5c0cd4dff204193b082d4e1185f4767fd7dd9e3..b8a23b6510cbd1aabcb5d28e3f77697b2d4d22c5 100644 --- a/alfa-client/apps/alfa/src/app/app.component.ts +++ b/alfa-client/apps/alfa/src/app/app.component.ts @@ -88,7 +88,7 @@ export class AppComponent implements OnInit { } buildInitialPath(): string { - const currentPath = window.location.pathname; + const currentPath: string = window.location.pathname; if (currentPath === '/') { return currentPath + buildPathSegmentsFromLocalStorage().join('/'); } @@ -97,26 +97,23 @@ export class AppComponent implements OnInit { } buildInitialQueryParams(): Params | undefined { - const queryParams = new URLSearchParams(window.location.search); + const queryParams: URLSearchParams = new URLSearchParams(window.location.search); if (!queryParams.toString()) { return undefined; } - const result: Params = {}; - queryParams.forEach((value, key) => { - result[key] = value; + const params: Params = {}; + queryParams.forEach((value: string, key: string) => { + params[key] = value; }); - return result; + return params; } listenToOAuthEvents(): void { this.oAuthEventSubscription = this.oAuthService.events .pipe( - filter( - (event: OAuthEvent) => - this.consideredAsLoginEvent(event.type) || this.consideredAsPageReloadEvent(event.type), - ), + filter((event: OAuthEvent) => this.consideredAsLoginEvent(event.type) || this.consideredAsPageReloadEvent(event.type)), ) .subscribe(() => (this.apiRoot$ = this.loadApiRootAndNavigate())); } 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 e4d1553f981c6a4947b1151afcbd7af95636ba47..fed6b6cc56cb6ded4a3d5b9f19a68578ec28edcb 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 @@ -60,4 +60,5 @@ export enum ApiRootLinkRel { UNASSIGNED_ZU_LOESCHEN = 'vorgaenge_zu_loeschen_unassigned', DOCUMENTATIONS = 'documentations', HINTS = 'hints', + RESOURCE = 'resource', } diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-linkrel.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-linkrel.ts new file mode 100644 index 0000000000000000000000000000000000000000..b29d9cb7e4fae12057f20b46928254748967ed88 --- /dev/null +++ b/alfa-client/libs/resource-redirect-shared/src/lib/resource-linkrel.ts @@ -0,0 +1,3 @@ +export enum ResourceLinkRel { + VORGANG = 'vorgang', +} diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-linkrel.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-linkrel.ts deleted file mode 100644 index 95a048e03bcb1fa1a2241e4a1d878834e357942f..0000000000000000000000000000000000000000 --- a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect-linkrel.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum ResourceRedirectLinkRel { - RESOURCE = 'resource', - VORGANG = 'vorgang', -} diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts index 740370e063214d4686ef37747234ec11c18dafb1..bca45d89e161b81187803dbcc54d51489ffd6adf 100644 --- a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts +++ b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.spec.ts @@ -1,4 +1,4 @@ -import { ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared'; +import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { ResourceRedirectService } from '@alfa-client/resource-redirect-shared'; import { @@ -14,7 +14,7 @@ import { Resource, ResourceUri } from '@ngxp/rest'; import { of, throwError } from 'rxjs'; import { createApiRootResource } from '../../../api-root-shared/test/api-root'; import { createDummyResource } from '../../../tech-shared/test/resource'; -import { ResourceRedirectLinkRel } from './resource-redirect-linkrel'; +import { ResourceLinkRel } from './resource-linkrel'; describe('ResourceRedirectService', () => { let service: ResourceRedirectService; @@ -40,37 +40,39 @@ describe('ResourceRedirectService', () => { }); describe('redirectToResource', () => { - it('should navigate to vorgang on success', () => { - const resource: Resource = createDummyResource([ResourceRedirectLinkRel.VORGANG]); - const apiRoot: StateResource<ApiRootResource> = createStateResource( - createApiRootResource([ResourceRedirectLinkRel.RESOURCE]), - ); + it('should navigate to resource on success', () => { + const resource: Resource = createDummyResource([ResourceLinkRel.VORGANG]); + const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE])); apiRootService.getApiRoot.mockReturnValue(of(apiRoot)); repository.getResource.mockReturnValue(of(resource)); + const spy = jest.spyOn(service, 'navigateToResource'); + service.redirectToResource(resourceUri); - expect(navigationService.navigateToVorgang).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); }); - it('should handle api root error', () => { + it('should handle empty api root resource', () => { apiRootService.getApiRoot.mockReturnValue(of(createEmptyStateResource())); + const spy = jest.spyOn(service, 'handleResolveError'); + service.redirectToResource(resourceUri); - expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND); - expect(navigationService.navigateToVorgangList).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); }); - it('should handle repository error', () => { - const apiRoot = createStateResource(createApiRootResource([ResourceRedirectLinkRel.RESOURCE])); + it('should handle resource repository error', () => { + const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE])); apiRootService.getApiRoot.mockReturnValue(of(apiRoot)); repository.getResource.mockReturnValue(throwError(() => new Error('some error'))); + const spy = jest.spyOn(service, 'handleResolveError'); + service.redirectToResource(resourceUri); - expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND); - expect(navigationService.navigateToVorgangList).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); }); }); @@ -84,18 +86,16 @@ describe('ResourceRedirectService', () => { }); }); - it('should return not emitted observable on empty resource', () => { + it('should return null observable on empty resource', () => { apiRootService.getApiRoot.mockReturnValue(of(createEmptyStateResource())); - service.getResolvedResource(resourceUri).subscribe((res) => { - expect(res).toBeNull(); + service.getResolvedResource(resourceUri).subscribe((resolvedResource: Resource) => { + expect(resolvedResource).toBeNull(); }); }); it('should call resource repository', () => { - const apiRoot: StateResource<ApiRootResource> = createStateResource( - createApiRootResource([ResourceRedirectLinkRel.RESOURCE]), - ); + const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE])); apiRootService.getApiRoot.mockReturnValue(of(apiRoot)); service.getResolvedResource(resourceUri).subscribe(() => { @@ -104,22 +104,20 @@ describe('ResourceRedirectService', () => { }); it('should return resolved resource', () => { - const resource: Resource = createDummyResource([ResourceRedirectLinkRel.VORGANG]); - const apiRoot: StateResource<ApiRootResource> = createStateResource( - createApiRootResource([ResourceRedirectLinkRel.RESOURCE]), - ); + const resource: Resource = createDummyResource([ResourceLinkRel.VORGANG]); + const apiRoot: StateResource<ApiRootResource> = createStateResource(createApiRootResource([ApiRootLinkRel.RESOURCE])); apiRootService.getApiRoot.mockReturnValue(of(apiRoot)); repository.getResource.mockReturnValue(of(resource)); - service.getResolvedResource(resourceUri).subscribe((res) => { - expect(res).toEqual(resource); + service.getResolvedResource(resourceUri).subscribe((resolvedResource: Resource) => { + expect(resolvedResource).toEqual(resource); }); }); }); describe('buildResolveUri', () => { it('should build resolve uri', () => { - const apiRootResource: ApiRootResource = createApiRootResource([ResourceRedirectLinkRel.RESOURCE]); + const apiRootResource: ApiRootResource = createApiRootResource([ApiRootLinkRel.RESOURCE]); const resolveUri: ResourceUri = service.buildResolveUri(apiRootResource, resourceUri); expect(resolveUri).toBeDefined(); @@ -133,31 +131,27 @@ describe('ResourceRedirectService', () => { }); describe('handleResolveError', () => { - it('should show snackbar and navigate to vorgang list', () => { + it('should show snackbar', () => { service.handleResolveError(); expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND); + }); + + it('should navigate to vorgang list', () => { + service.handleResolveError(); + expect(navigationService.navigateToVorgangList).toHaveBeenCalled(); }); }); describe('navigateToResource', () => { it('should navigate to vorgang', () => { - const resource: Resource = createDummyResource([ResourceRedirectLinkRel.VORGANG]); - const resourceUri: ResourceUri = toResourceUri(resource, ResourceRedirectLinkRel.VORGANG); + const resource: Resource = createDummyResource([ResourceLinkRel.VORGANG]); + const resourceUri: ResourceUri = toResourceUri(resource, ResourceLinkRel.VORGANG); service.navigateToResource(resource); expect(navigationService.navigateToVorgang).toHaveBeenCalledWith(resourceUri); }); - - it('should handle resolve error on missing link rel', () => { - const resource: Resource = createDummyResource(); - - service.navigateToResource(resource); - - expect(snackbarService.showInfo).toHaveBeenCalledWith(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND); - expect(navigationService.navigateToVorgangList).toHaveBeenCalled(); - }); }); }); diff --git a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts index 487cb4b016d03ddb5ed0e2926121bfa7d33b2212..a07508e0d0d73bd38329590059db15448e80b755 100644 --- a/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts +++ b/alfa-client/libs/resource-redirect-shared/src/lib/resource-redirect.service.ts @@ -1,4 +1,4 @@ -import { ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared'; +import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { ResourceRepository, StateResource, isLoaded, toResourceUri } from '@alfa-client/tech-shared'; import { Messages, SnackBarService } from '@alfa-client/ui'; @@ -6,7 +6,7 @@ import { Injectable } from '@angular/core'; import { Resource, ResourceUri, getUrl, hasLink } from '@ngxp/rest'; import { Observable, first, switchMap } from 'rxjs'; import { filter } from 'rxjs/operators'; -import { ResourceRedirectLinkRel } from './resource-redirect-linkrel'; +import { ResourceLinkRel } from './resource-linkrel'; @Injectable({ providedIn: 'root' }) export class ResourceRedirectService { @@ -19,7 +19,7 @@ export class ResourceRedirectService { private navigationService: NavigationService, ) {} - public redirectToResource(resourceUri: ResourceUri) { + public redirectToResource(resourceUri: ResourceUri): void { this.getResolvedResource(resourceUri) .pipe(first()) .subscribe({ @@ -38,25 +38,18 @@ export class ResourceRedirectService { } buildResolveUri(apiRootResource: ApiRootResource, resourceUri: ResourceUri): ResourceUri { - return getUrl(apiRootResource, ResourceRedirectLinkRel.RESOURCE).replace( - this.PARAM_URI_PLACEHOLDER, - encodeURIComponent(resourceUri), - ); - } - - handleResolveError(): void { - this.snackbarService.showInfo(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND); - this.navigationService.navigateToVorgangList(); + return getUrl(apiRootResource, ApiRootLinkRel.RESOURCE).replace(this.PARAM_URI_PLACEHOLDER, encodeURIComponent(resourceUri)); } navigateToResource(resource: Resource): void { - if (hasLink(resource, ResourceRedirectLinkRel.VORGANG)) { - const vorgangUri: ResourceUri = toResourceUri(resource, ResourceRedirectLinkRel.VORGANG); + if (hasLink(resource, ResourceLinkRel.VORGANG)) { + const vorgangUri: ResourceUri = toResourceUri(resource, ResourceLinkRel.VORGANG); this.navigationService.navigateToVorgang(vorgangUri); - - return; } + } - this.handleResolveError(); + handleResolveError(): void { + this.snackbarService.showInfo(Messages.HTTP_STATUS_RESOURCE_NOT_FOUND); + this.navigationService.navigateToVorgangList(); } } diff --git a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts index 9aa945dd75c6324ac32e7000ce8ee56b36a913c9..58344a08914a8381f6e2270cf9f0829889286c64 100644 --- a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts +++ b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.spec.ts @@ -8,14 +8,13 @@ import { Observable, of } from 'rxjs'; describe('ResourceRedirectComponent', () => { let component: ResourceRedirectComponent; let fixture: ComponentFixture<ResourceRedirectComponent>; - - const resourceRedirectService: Mock<ResourceRedirectService> = mock(ResourceRedirectService); + let resourceRedirectService: Mock<ResourceRedirectService>; const initActivatedRoute = (queryParamKey?: string): { queryParamMap: Observable<Map<string, string>> } => ({ queryParamMap: of(new Map(queryParamKey ? [[queryParamKey, 'some-uri']] : [])), }); - const createComponentWithQueryParam = (queryParamKey?: string) => { + const createComponentWithQueryParam = (queryParamKey?: string): void => { TestBed.configureTestingModule({ imports: [ResourceRedirectComponent], providers: [ @@ -30,7 +29,8 @@ describe('ResourceRedirectComponent', () => { beforeEach(() => { TestBed.resetTestingModule(); - jest.clearAllMocks(); + + resourceRedirectService = mock(ResourceRedirectService); }); it('should create', () => { diff --git a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts index 77037dcc57df3bbabbf5bea568fa4fb8d3b34309..37274fc2dd8dd16574e7de19234ba5fdf55e06ed 100644 --- a/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts +++ b/alfa-client/libs/resource-redirect/src/lib/resource-redirect/resource-redirect.component.ts @@ -1,6 +1,6 @@ import { ResourceRedirectService } from '@alfa-client/resource-redirect-shared'; import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, ParamMap } from '@angular/router'; import { ResourceUri } from '@ngxp/rest'; @Component({ @@ -16,7 +16,7 @@ export class ResourceRedirectComponent implements OnInit { ) {} ngOnInit(): void { - this.route.queryParamMap.subscribe((queryParams) => { + this.route.queryParamMap.subscribe((queryParams: ParamMap) => { const resourceUri: ResourceUri = queryParams.get(this.PARAM_URI); if (resourceUri) { this.resourceRedirectService.redirectToResource(resourceUri);