From 10bea2311ebbab0884e1f700f56514b4a8609463 Mon Sep 17 00:00:00 2001 From: "fabio.formosa" Date: Tue, 27 Oct 2020 00:30:39 +0100 Subject: [PATCH 1/7] #26 added unit test for api.service.ts --- .../src/app/services/api.service.spec.ts | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 quartz-manager-frontend/src/app/services/api.service.spec.ts diff --git a/quartz-manager-frontend/src/app/services/api.service.spec.ts b/quartz-manager-frontend/src/app/services/api.service.spec.ts new file mode 100644 index 0000000..b3ce83f --- /dev/null +++ b/quartz-manager-frontend/src/app/services/api.service.spec.ts @@ -0,0 +1,75 @@ +import { TestBed } from "@angular/core/testing"; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { ApiService } from './api.service'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; + +class Data{ + name: string +} + +class HttpResponseMock { + constructor( + public body: unknown, + public opts?: { + headers?: + | HttpHeaders + | { + [name: string]: string | string[]; + }; + status?: number; + statusText?: string; + } + ) {} + } + +describe('ApiServiceTest', () => { + + let apiService: ApiService; + let httpClient: HttpClient; + let httpTestingController: HttpTestingController; + + const SAMPLE_URL = '/sample-url'; + const URL_401 = '/url-response-401'; + const testData: Data = {name: 'Test Data'}; + + beforeEach(() => { + + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ApiService] + }); + apiService = TestBed.inject(ApiService); + + httpClient = TestBed.inject(HttpClient); + httpTestingController = TestBed.inject(HttpTestingController); + }); + + it('should be created', (): void => { + expect(apiService).toBeTruthy(); + }); + + it('can test HttpClient.get', (): void => { + + apiService.get(SAMPLE_URL).subscribe((res: Data) => { + expect(res).toEqual(testData); + }); + + const req = httpTestingController.expectOne(SAMPLE_URL) + expect(req.request.method).toEqual('GET'); + req.flush(new HttpResponseMock(testData)); + httpTestingController.verify(); + }); + + it('doesn\'t do anything if 401 is received', (): void => { + + apiService.get(URL_401).subscribe((res: Data) => { + expect(false); + }, (error) => {expect(error.status).toBe(401)}); + + const req = httpTestingController.expectOne(URL_401) + expect(req.request.method).toEqual('GET'); + req.flush(null, {status: 401, statusText: 'unauthenticated'}); + httpTestingController.verify(); + }); + +}); \ No newline at end of file From d950ff29b243de6d2b4867e26b67cdd971e33e07 Mon Sep 17 00:00:00 2001 From: "fabio.formosa" Date: Wed, 4 Nov 2020 00:34:23 +0100 Subject: [PATCH 2/7] #26 added redirect to login in case of 401 --- .../src/app/services/api.service.spec.ts | 12 ++++++++++-- .../src/app/services/api.service.ts | 5 +++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/quartz-manager-frontend/src/app/services/api.service.spec.ts b/quartz-manager-frontend/src/app/services/api.service.spec.ts index b3ce83f..a67abde 100644 --- a/quartz-manager-frontend/src/app/services/api.service.spec.ts +++ b/quartz-manager-frontend/src/app/services/api.service.spec.ts @@ -2,6 +2,8 @@ import { TestBed } from "@angular/core/testing"; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { ApiService } from './api.service'; import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router} from '@angular/router'; +import {jest} from '@jest/globals' class Data{ name: string @@ -22,6 +24,8 @@ class HttpResponseMock { ) {} } +const routerSpy = jest.spyOn(Router.prototype, 'navigateByUrl'); + describe('ApiServiceTest', () => { let apiService: ApiService; @@ -36,7 +40,7 @@ describe('ApiServiceTest', () => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], - providers: [ApiService] + providers: [ApiService, {provide: Router, useValue: routerSpy}] }); apiService = TestBed.inject(ApiService); @@ -64,7 +68,11 @@ describe('ApiServiceTest', () => { apiService.get(URL_401).subscribe((res: Data) => { expect(false); - }, (error) => {expect(error.status).toBe(401)}); + }, (error) => + { + expect(error.status).toBe(401); + expect(routerSpy).toHaveBeenCalledTimes(1); + }); const req = httpTestingController.expectOne(URL_401) expect(req.request.method).toEqual('GET'); diff --git a/quartz-manager-frontend/src/app/services/api.service.ts b/quartz-manager-frontend/src/app/services/api.service.ts index d4feb83..d89a780 100644 --- a/quartz-manager-frontend/src/app/services/api.service.ts +++ b/quartz-manager-frontend/src/app/services/api.service.ts @@ -1,4 +1,5 @@ import { HttpClient, HttpHeaders, HttpResponse, HttpRequest, HttpEventType, HttpParams } from '@angular/common/http'; +import { Router} from '@angular/router'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { catchError, map, filter, tap } from 'rxjs/operators' @@ -35,7 +36,7 @@ export class ApiService { private jwtToken: string; - constructor( private http: HttpClient) { } + constructor( private http: HttpClient, private router: Router) { } setToken(token: string) { this.jwtToken = token; @@ -98,7 +99,7 @@ export class ApiService { // Display error if logged in, otherwise redirect to IDP private checkError(error: any): any { if (error && error.status === 401) { - // this.redirectIfUnauth(error); + this.router.navigate(['/login']); } else { // this.displayError(error); } From b0868de37b2b8da49cf16a573c0e754631ba1d9f Mon Sep 17 00:00:00 2001 From: "fabio.formosa" Date: Wed, 18 Nov 2020 00:44:43 +0100 Subject: [PATCH 3/7] #25 admin guard can activate if API is not under auth --- .../components/header/header.component.html | 2 +- .../app/components/header/header.component.ts | 6 +- .../src/app/guards/admin.guard.spec.ts | 82 ++++++++++++++++++- .../src/app/guards/admin.guard.ts | 2 + .../src/app/services/auth.service.ts | 3 +- .../src/app/services/user.service.ts | 3 + 6 files changed, 90 insertions(+), 8 deletions(-) diff --git a/quartz-manager-frontend/src/app/components/header/header.component.html b/quartz-manager-frontend/src/app/components/header/header.component.html index f9ecfd3..7d8b4b4 100644 --- a/quartz-manager-frontend/src/app/components/header/header.component.html +++ b/quartz-manager-frontend/src/app/components/header/header.component.html @@ -11,7 +11,7 @@