HttpClient is an evolution of the existing Angular HTTP API, which exists alongside of it in a separate package, @angular/common/http. This structure ensures that existing codebases can slowly migrate to the new API. The new API improves significantly on the ergonomics and features of the legacy API. A partial list of new features includes: * Typed, synchronous response body access, including support for JSON body types * JSON is an assumed default and no longer needs to be explicitly parsed * Interceptors allow middleware logic to be inserted into the pipeline * Immutable request/response objects * Progress events for both request upload and response download * Post-request verification & flush based testing framework
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google Inc. All Rights Reserved.
 | |
|  *
 | |
|  * 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 {HttpHeaders} from '../src/headers';
 | |
| import {XhrFactory} from '../src/xhr';
 | |
| 
 | |
| export class MockXhrFactory implements XhrFactory {
 | |
|   mock: MockXMLHttpRequest;
 | |
| 
 | |
|   build(): XMLHttpRequest { return (this.mock = new MockXMLHttpRequest()) as any; }
 | |
| }
 | |
| 
 | |
| export class MockXMLHttpRequestUpload {
 | |
|   constructor(private mock: MockXMLHttpRequest) {}
 | |
| 
 | |
|   addEventListener(event: 'progress', handler: Function) {
 | |
|     this.mock.addEventListener('uploadProgress', handler);
 | |
|   }
 | |
| 
 | |
|   removeEventListener(event: 'progress', handler: Function) {
 | |
|     this.mock.removeEventListener('uploadProgress');
 | |
|   }
 | |
| }
 | |
| 
 | |
| export class MockXMLHttpRequest {
 | |
|   // Set by method calls.
 | |
|   body: any;
 | |
|   method: string;
 | |
|   url: string;
 | |
|   mockHeaders: {[key: string]: string} = {};
 | |
|   mockAborted: boolean = false;
 | |
| 
 | |
|   // Directly settable interface.
 | |
|   withCredentials: boolean = false;
 | |
|   responseType: string = 'text';
 | |
| 
 | |
|   // Mocked response interface.
 | |
|   response: any|undefined = undefined;
 | |
|   responseText: string|undefined = undefined;
 | |
|   responseURL: string|null = null;
 | |
|   status: number = 0;
 | |
|   statusText: string = '';
 | |
|   mockResponseHeaders: string = '';
 | |
| 
 | |
|   listeners: {
 | |
|     error?: (event: ErrorEvent) => void,
 | |
|     load?: () => void,
 | |
|     progress?: (event: ProgressEvent) => void,
 | |
|     uploadProgress?: (event: ProgressEvent) => void,
 | |
|   } = {};
 | |
| 
 | |
|   upload = new MockXMLHttpRequestUpload(this);
 | |
| 
 | |
|   open(method: string, url: string): void {
 | |
|     this.method = method;
 | |
|     this.url = url;
 | |
|   }
 | |
| 
 | |
|   send(body: any): void { this.body = body; }
 | |
| 
 | |
|   addEventListener(event: 'error'|'load'|'progress'|'uploadProgress', handler: Function): void {
 | |
|     this.listeners[event] = handler as any;
 | |
|   }
 | |
| 
 | |
|   removeEventListener(event: 'error'|'load'|'progress'|'uploadProgress'): void {
 | |
|     delete this.listeners[event];
 | |
|   }
 | |
| 
 | |
|   setRequestHeader(name: string, value: string): void { this.mockHeaders[name] = value; }
 | |
| 
 | |
|   getAllResponseHeaders(): string { return this.mockResponseHeaders; }
 | |
| 
 | |
|   getResponseHeader(header: string): string|null {
 | |
|     return new HttpHeaders(this.mockResponseHeaders).get(header);
 | |
|   }
 | |
| 
 | |
|   mockFlush(status: number, statusText: string, body: any|null) {
 | |
|     if (this.responseType === 'text') {
 | |
|       this.responseText = body;
 | |
|     } else {
 | |
|       this.response = body;
 | |
|     }
 | |
|     this.status = status;
 | |
|     this.statusText = statusText;
 | |
|     this.mockLoadEvent();
 | |
|   }
 | |
| 
 | |
|   mockDownloadProgressEvent(loaded: number, total?: number): void {
 | |
|     if (this.listeners.progress) {
 | |
|       this.listeners.progress({ lengthComputable: total !== undefined, loaded, total } as any);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   mockUploadProgressEvent(loaded: number, total?: number) {
 | |
|     if (this.listeners.uploadProgress) {
 | |
|       this.listeners.uploadProgress(
 | |
|           { lengthComputable: total !== undefined, loaded, total, } as any);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   mockLoadEvent(): void {
 | |
|     if (this.listeners.load) {
 | |
|       this.listeners.load();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   mockErrorEvent(error: any): void {
 | |
|     if (this.listeners.error) {
 | |
|       this.listeners.error(error);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   abort() { this.mockAborted = true; }
 | |
| } |