89 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			3.2 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 'rxjs/add/operator/map'; | ||
|  | 
 | ||
|  | import {Injector} from '@angular/core'; | ||
|  | import {TestBed} from '@angular/core/testing'; | ||
|  | import {Observable} from 'rxjs/Observable'; | ||
|  | 
 | ||
|  | import {HttpHandler} from '../src/backend'; | ||
|  | import {HttpClient} from '../src/client'; | ||
|  | import {HTTP_INTERCEPTORS, HttpInterceptor} from '../src/interceptor'; | ||
|  | import {HttpRequest} from '../src/request'; | ||
|  | import {HttpEvent, HttpResponse} from '../src/response'; | ||
|  | import {HttpTestingController} from '../testing/src/api'; | ||
|  | import {HttpClientTestingModule} from '../testing/src/module'; | ||
|  | import {TestRequest} from '../testing/src/request'; | ||
|  | 
 | ||
|  | 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).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'); } | ||
|  | } | ||
|  | 
 | ||
|  | export function main() { | ||
|  |   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: DoneFn) => { | ||
|  |       injector.get(HttpClient).get('/test', {responseType: 'text'}).subscribe(value => { | ||
|  |         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: DoneFn) => { | ||
|  |          injector.get(HttpClient) | ||
|  |              .get('/test', {observe: 'response', responseType: 'text'}) | ||
|  |              .subscribe(value => 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: DoneFn) => { | ||
|  |       injector.get(HttpClient) | ||
|  |           .get('/test', {observe: 'response', responseType: 'text'}) | ||
|  |           .subscribe(value => { | ||
|  |             expect(value.headers.get('Intercepted')).toEqual('B,A'); | ||
|  |             done(); | ||
|  |           }); | ||
|  |       injector.get(HttpTestingController).expectOne('/test').flush('ok!'); | ||
|  |     }); | ||
|  |   }); | ||
|  | } |