From 0b22740c79ba635a343919d45533006eaebd4e4c Mon Sep 17 00:00:00 2001 From: Michel Palourdio Date: Fri, 29 Mar 2024 20:46:20 +0100 Subject: [PATCH] chore: Enforce eslint and fix warnings --- .eslintrc.json | 19 +++++++++++++----- .../components/ng-http-loader.component.ts | 4 ++-- .../pending-requests-interceptor.service.ts | 8 ++++---- .../ng-http-loader.component.on-push.spec.ts | 4 +--- .../ng-http-loader.component.outlet.spec.ts | 20 +------------------ .../ng-http-loader.component.spec.ts | 10 +++++----- .../sk-chasing-dots.component.spec.ts | 2 +- .../sk-cube-grid.component.spec.ts | 2 +- .../sk-wandering-cubes.component.spec.ts | 2 +- src/test/ng-http-loader.module.spec.ts | 2 +- ...nding-requests-interceptor.service.spec.ts | 11 ++++++---- 11 files changed, 38 insertions(+), 46 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 16b176a2..14b65993 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -16,25 +16,33 @@ "createDefaultProgram": true }, "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", "plugin:@angular-eslint/recommended", "plugin:@angular-eslint/template/process-inline-templates", "plugin:rxjs/recommended" ], "rules": { + "@typescript-eslint/explicit-function-return-type": [ + "error" + ], + "no-extra-boolean-cast": [ + "off" + ], "@angular-eslint/component-selector": [ "error", { + "type": "element", "prefix": "", - "style": "kebab-case", - "type": "element" + "style": "kebab-case" } ], "@angular-eslint/directive-selector": [ "error", { + "type": "attribute", "prefix": "", - "style": "camelCase", - "type": "attribute" + "style": "camelCase" } ], "comma-dangle": [ @@ -75,7 +83,8 @@ "*.html" ], "extends": [ - "plugin:@angular-eslint/template/recommended" + "plugin:@angular-eslint/template/recommended", + "plugin:@angular-eslint/template/accessibility" ], "rules": {} } diff --git a/src/lib/components/ng-http-loader.component.ts b/src/lib/components/ng-http-loader.component.ts index 25d194c9..f1c53402 100644 --- a/src/lib/components/ng-http-loader.component.ts +++ b/src/lib/components/ng-http-loader.component.ts @@ -7,7 +7,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, Type } from '@angular/core'; import { merge, Observable, partition, timer } from 'rxjs'; import { debounce, distinctUntilChanged, switchMap, tap } from 'rxjs/operators'; import { PendingRequestsInterceptor } from '../services/pending-requests-interceptor.service'; @@ -28,7 +28,7 @@ export class NgHttpLoaderComponent implements OnInit { @Input() backdrop = true; @Input() backgroundColor!: string; @Input() debounceDelay = 0; - @Input() entryComponent: any = null; + @Input() entryComponent!: Type | null; @Input() extraDuration = 0; @Input() filteredHeaders: string[] = []; @Input() filteredMethods: string[] = []; diff --git a/src/lib/services/pending-requests-interceptor.service.ts b/src/lib/services/pending-requests-interceptor.service.ts index a42a55fe..9dabc8c9 100644 --- a/src/lib/services/pending-requests-interceptor.service.ts +++ b/src/lib/services/pending-requests-interceptor.service.ts @@ -54,26 +54,26 @@ export class PendingRequestsInterceptor implements HttpInterceptor { }); } - private shouldBypassMethod(req: HttpRequest): boolean { + private shouldBypassMethod(req: HttpRequest): boolean { return this._filteredMethods.some(e => { return e.toUpperCase() === req.method.toUpperCase(); }); } - private shouldBypassHeader(req: HttpRequest): boolean { + private shouldBypassHeader(req: HttpRequest): boolean { return this._filteredHeaders.some(e => { return req.headers.has(e); }); } - private shouldBypass(req: HttpRequest): boolean { + private shouldBypass(req: HttpRequest): boolean { return this._forceByPass || this.shouldBypassUrl(req.urlWithParams) || this.shouldBypassMethod(req) || this.shouldBypassHeader(req); } - intercept(req: HttpRequest, next: HttpHandler): Observable> { + intercept(req: HttpRequest, next: HttpHandler): Observable> { const shouldBypass = this.shouldBypass(req); if (!shouldBypass) { diff --git a/src/test/components/ng-http-loader.component.on-push.spec.ts b/src/test/components/ng-http-loader.component.on-push.spec.ts index f35a1a02..b1735412 100644 --- a/src/test/components/ng-http-loader.component.on-push.spec.ts +++ b/src/test/components/ng-http-loader.component.on-push.spec.ts @@ -10,7 +10,7 @@ import { HttpClient } from '@angular/common/http'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NgHttpLoaderModule } from '../../lib/ng-http-loader.module'; @@ -22,7 +22,6 @@ export class HostComponent { } describe('NgHttpLoaderComponent OnPush', () => { - let component: HostComponent; let fixture: ComponentFixture; let http: HttpClient; let httpMock: HttpTestingController; @@ -37,7 +36,6 @@ describe('NgHttpLoaderComponent OnPush', () => { beforeEach(() => { fixture = TestBed.createComponent(HostComponent); - component = fixture.componentInstance; http = TestBed.inject(HttpClient); httpMock = TestBed.inject(HttpTestingController); fixture.detectChanges(); diff --git a/src/test/components/ng-http-loader.component.outlet.spec.ts b/src/test/components/ng-http-loader.component.outlet.spec.ts index 6ff4983c..71fe351b 100644 --- a/src/test/components/ng-http-loader.component.outlet.spec.ts +++ b/src/test/components/ng-http-loader.component.outlet.spec.ts @@ -7,7 +7,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { of } from 'rxjs'; import { NgHttpLoaderComponent } from '../../lib/components/ng-http-loader.component'; @@ -52,15 +52,6 @@ describe('NgHttpLoaderComponentOutlet', () => { expect(component.spinner).toBeNull(); }); - it('should correctly check [entryComponent] with empty string', () => { - const spinnerName = 'spinner-name'; - component.spinner = spinnerName; - component.entryComponent = ''; - component.ngOnInit(); - - expect(component.spinner).toBe(spinnerName); - }); - it('should correctly check [entryComponent] with null', () => { const spinnerName = 'spinner-name'; component.spinner = spinnerName; @@ -69,13 +60,4 @@ describe('NgHttpLoaderComponentOutlet', () => { expect(component.spinner).toBe(spinnerName); }); - - it('should correctly check [entryComponent] with undefined', () => { - const spinnerName = 'spinner-name'; - component.spinner = spinnerName; - component.entryComponent = undefined; - component.ngOnInit(); - - expect(component.spinner).toBe(spinnerName); - }); }); diff --git a/src/test/components/ng-http-loader.component.spec.ts b/src/test/components/ng-http-loader.component.spec.ts index 1467f0ec..8ce5295e 100644 --- a/src/test/components/ng-http-loader.component.spec.ts +++ b/src/test/components/ng-http-loader.component.spec.ts @@ -114,7 +114,7 @@ describe('NgHttpLoaderComponent', () => { }); it('should show and hide the spinner according to the pending HTTP requests', fakeAsync(() => { - const runQuery$ = (url: string): Observable => http.get(url); + const runQuery$ = (url: string): Observable => http.get(url); forkJoin([runQuery$('/fake'), runQuery$('/fake2')]).subscribe(); const firstRequest = httpMock.expectOne('/fake'); const secondRequest = httpMock.expectOne('/fake2'); @@ -367,7 +367,7 @@ describe('NgHttpLoaderComponent', () => { it('should correctly handle the debounce delay for multiple HTTP requests', fakeAsync(() => { component.debounceDelay = 2000; - const runQuery$ = (url: string): Observable => http.get(url); + const runQuery$ = (url: string): Observable => http.get(url); forkJoin([runQuery$('/fake'), runQuery$('/fake2')]).subscribe(); const firstRequest = httpMock.expectOne('/fake'); const secondRequest = httpMock.expectOne('/fake2'); @@ -510,7 +510,7 @@ describe('NgHttpLoaderComponent', () => { it('should correctly handle the minimum spinner duration for multiple HTTP requests', fakeAsync(() => { component.minDuration = 5000; - const runQuery$ = (url: string): Observable => http.get(url); + const runQuery$ = (url: string): Observable => http.get(url); forkJoin([runQuery$('/fake'), runQuery$('/fake2')]).subscribe(); const firstRequest = httpMock.expectOne('/fake'); const secondRequest = httpMock.expectOne('/fake2'); @@ -548,7 +548,7 @@ describe('NgHttpLoaderComponent', () => { it('should correctly handle the extra spinner duration for multiple HTTP requests', fakeAsync(() => { component.extraDuration = 5000; - const runQuery$ = (url: string): Observable => http.get(url); + const runQuery$ = (url: string): Observable => http.get(url); forkJoin([runQuery$('/fake'), runQuery$('/fake2')]).subscribe(); const firstRequest = httpMock.expectOne('/fake'); const secondRequest = httpMock.expectOne('/fake2'); @@ -622,7 +622,7 @@ describe('NgHttpLoaderComponent', () => { it('should handle the extra spinner duration for multiple HTTP requests ran one after the others', fakeAsync(() => { component.extraDuration = 10; - const runQuery$ = (url: string): Observable => http.get(url); + const runQuery$ = (url: string): Observable => http.get(url); runQuery$('/fake').subscribe(); const firstRequest = httpMock.expectOne('/fake'); diff --git a/src/test/components/sk-chasing-dots/sk-chasing-dots.component.spec.ts b/src/test/components/sk-chasing-dots/sk-chasing-dots.component.spec.ts index f0d7ce69..5bbbbb95 100644 --- a/src/test/components/sk-chasing-dots/sk-chasing-dots.component.spec.ts +++ b/src/test/components/sk-chasing-dots/sk-chasing-dots.component.spec.ts @@ -7,7 +7,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { SkChasingDotsComponent } from '../../../lib/components/sk-chasing-dots/sk-chasing-dots.component'; diff --git a/src/test/components/sk-cube-grid/sk-cube-grid.component.spec.ts b/src/test/components/sk-cube-grid/sk-cube-grid.component.spec.ts index 2b95d415..2d2b1349 100644 --- a/src/test/components/sk-cube-grid/sk-cube-grid.component.spec.ts +++ b/src/test/components/sk-cube-grid/sk-cube-grid.component.spec.ts @@ -7,7 +7,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { SkCubeGridComponent } from '../../../lib/components/sk-cube-grid/sk-cube-grid.component'; diff --git a/src/test/components/sk-wandering-cubes/sk-wandering-cubes.component.spec.ts b/src/test/components/sk-wandering-cubes/sk-wandering-cubes.component.spec.ts index 4c04ea52..ff31cd3b 100644 --- a/src/test/components/sk-wandering-cubes/sk-wandering-cubes.component.spec.ts +++ b/src/test/components/sk-wandering-cubes/sk-wandering-cubes.component.spec.ts @@ -7,7 +7,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { SkWanderingCubesComponent } from '../../../lib/components/sk-wandering-cubes/sk-wandering-cubes.component'; diff --git a/src/test/ng-http-loader.module.spec.ts b/src/test/ng-http-loader.module.spec.ts index f42670f0..edd550da 100644 --- a/src/test/ng-http-loader.module.spec.ts +++ b/src/test/ng-http-loader.module.spec.ts @@ -23,7 +23,7 @@ describe('NgHttpLoaderModule', () => { it('should create an instance with providers via forRoot()', () => { const ngHttpLoaderModuleWithProviders = NgHttpLoaderModule.forRoot(); - // @ts-ignore + // @ts-expect-error This is error free expect(ngHttpLoaderModuleWithProviders.providers[0][0].useExisting.name).toEqual(PendingRequestsInterceptor.name); }); }); diff --git a/src/test/services/pending-requests-interceptor.service.spec.ts b/src/test/services/pending-requests-interceptor.service.spec.ts index 197cefb8..78c5b1fb 100644 --- a/src/test/services/pending-requests-interceptor.service.spec.ts +++ b/src/test/services/pending-requests-interceptor.service.spec.ts @@ -7,7 +7,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { HttpClient, HttpResponse } from '@angular/common/http'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { TestBed, waitForAsync } from '@angular/core/testing'; import { forkJoin, Observable } from 'rxjs'; @@ -37,7 +37,7 @@ describe('PendingRequestsInterceptor', () => { }); it('should be aware of the pending HTTP requests', () => { - const runQuery$ = (url: string): Observable => http.get(url); + const runQuery$ = (url: string): Observable => http.get(url); forkJoin([runQuery$('/fake'), runQuery$('/fake2')]).subscribe(); @@ -81,10 +81,13 @@ describe('PendingRequestsInterceptor', () => { it('should fail correctly', () => { const statusTextNotFound = 'NOT FOUND'; - http.get('/fake').subscribe({ next: () => expect(true).toBe(false), - error: (error: any) => expect(error.statusText).toBe(statusTextNotFound) + error: (error: unknown) => { + if (error instanceof HttpResponse) { + expect(error.statusText).toBe(statusTextNotFound); + } + } }); const testRequest = httpMock.expectOne('/fake');