Fixes all TypeScript failures caused by enabling the `--strict` flag for test source files. We also want to enable the strict options for tests as the strictness enforcement improves the overall codehealth, unveiled common issues and additionally it allows us to enable `strict` in the `tsconfig.json` that is picked up by IDE's. PR Close #30993
		
			
				
	
	
		
			106 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google Inc. All Rights Reserved.JsonpCallbackContext
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| import {HttpHandler} from '@angular/common/http/src/backend';
 | |
| import {HttpClient} from '@angular/common/http/src/client';
 | |
| import {HTTP_INTERCEPTORS, HttpInterceptor} from '@angular/common/http/src/interceptor';
 | |
| import {HttpRequest} from '@angular/common/http/src/request';
 | |
| import {HttpEvent, HttpResponse} from '@angular/common/http/src/response';
 | |
| import {HttpTestingController} from '@angular/common/http/testing/src/api';
 | |
| import {HttpClientTestingModule} from '@angular/common/http/testing/src/module';
 | |
| import {TestRequest} from '@angular/common/http/testing/src/request';
 | |
| import {Injectable, Injector} from '@angular/core';
 | |
| import {TestBed} from '@angular/core/testing';
 | |
| import {Observable} from 'rxjs';
 | |
| import {map} from 'rxjs/operators';
 | |
| 
 | |
| class TestInterceptor implements HttpInterceptor {
 | |
|   constructor(private value: string) {}
 | |
| 
 | |
|   intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {
 | |
|     const existing = req.headers.get('Intercepted');
 | |
|     const next = !!existing ? existing + ',' + this.value : this.value;
 | |
|     req = req.clone({setHeaders: {'Intercepted': next}});
 | |
|     return delegate.handle(req).pipe(map(event => {
 | |
|       if (event instanceof HttpResponse) {
 | |
|         const existing = event.headers.get('Intercepted');
 | |
|         const next = !!existing ? existing + ',' + this.value : this.value;
 | |
|         return event.clone({headers: event.headers.set('Intercepted', next)});
 | |
|       }
 | |
|       return event;
 | |
|     }));
 | |
|   }
 | |
| }
 | |
| 
 | |
| class InterceptorA extends TestInterceptor {
 | |
|   constructor() { super('A'); }
 | |
| }
 | |
| 
 | |
| class InterceptorB extends TestInterceptor {
 | |
|   constructor() { super('B'); }
 | |
| }
 | |
| 
 | |
| @Injectable()
 | |
| class ReentrantInterceptor implements HttpInterceptor {
 | |
|   constructor(private client: HttpClient) {}
 | |
| 
 | |
|   intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
 | |
|     return next.handle(req);
 | |
|   }
 | |
| }
 | |
| 
 | |
| {
 | |
|   describe('HttpClientModule', () => {
 | |
|     let injector: Injector;
 | |
|     beforeEach(() => {
 | |
|       injector = TestBed.configureTestingModule({
 | |
|         imports: [HttpClientTestingModule],
 | |
|         providers: [
 | |
|           {provide: HTTP_INTERCEPTORS, useClass: InterceptorA, multi: true},
 | |
|           {provide: HTTP_INTERCEPTORS, useClass: InterceptorB, multi: true},
 | |
|         ],
 | |
|       });
 | |
|     });
 | |
|     it('initializes HttpClient properly', done => {
 | |
|       injector.get(HttpClient).get('/test', {responseType: 'text'}).subscribe((value: string) => {
 | |
|         expect(value).toBe('ok!');
 | |
|         done();
 | |
|       });
 | |
|       injector.get(HttpTestingController).expectOne('/test').flush('ok!');
 | |
|     });
 | |
|     it('intercepts outbound responses in the order in which interceptors were bound', done => {
 | |
|       injector.get(HttpClient)
 | |
|           .get('/test', {observe: 'response', responseType: 'text'})
 | |
|           .subscribe(() => done());
 | |
|       const req = injector.get(HttpTestingController).expectOne('/test') as TestRequest;
 | |
|       expect(req.request.headers.get('Intercepted')).toEqual('A,B');
 | |
|       req.flush('ok!');
 | |
|     });
 | |
|     it('intercepts inbound responses in the right (reverse binding) order', done => {
 | |
|       injector.get(HttpClient)
 | |
|           .get('/test', {observe: 'response', responseType: 'text'})
 | |
|           .subscribe((value: HttpResponse<string>) => {
 | |
|             expect(value.headers.get('Intercepted')).toEqual('B,A');
 | |
|             done();
 | |
|           });
 | |
|       injector.get(HttpTestingController).expectOne('/test').flush('ok!');
 | |
|     });
 | |
|     it('allows interceptors to inject HttpClient', done => {
 | |
|       TestBed.resetTestingModule();
 | |
|       injector = TestBed.configureTestingModule({
 | |
|         imports: [HttpClientTestingModule],
 | |
|         providers: [
 | |
|           {provide: HTTP_INTERCEPTORS, useClass: ReentrantInterceptor, multi: true},
 | |
|         ],
 | |
|       });
 | |
|       injector.get(HttpClient).get('/test').subscribe(() => { done(); });
 | |
|       injector.get(HttpTestingController).expectOne('/test').flush('ok!');
 | |
|     });
 | |
|   });
 | |
| }
 |