| 
									
										
										
										
											2016-06-23 09:47:54 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {BaseException} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {XHR} from '../index'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {PromiseCompleter, PromiseWrapper} from '../src/facade/async'; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {ListWrapper, Map} from '../src/facade/collection'; | 
					
						
							|  |  |  | import {isBlank, normalizeBlank} from '../src/facade/lang'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2015-12-16 15:47:48 +08:00
										 |  |  |  * A mock implementation of {@link XHR} that allows outgoing requests to be mocked | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  |  * and responded to within a single test, without going to the network. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-03-31 16:55:46 +02:00
										 |  |  | export class MockXHR extends XHR { | 
					
						
							| 
									
										
										
										
											2015-10-06 17:11:10 -07:00
										 |  |  |   private _expectations: _Expectation[] = []; | 
					
						
							| 
									
										
										
										
											2015-09-29 11:11:06 -07:00
										 |  |  |   private _definitions = new Map<string, string>(); | 
					
						
							| 
									
										
										
										
											2015-10-06 17:11:10 -07:00
										 |  |  |   private _requests: _PendingRequest[] = []; | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   get(url: string): Promise<string> { | 
					
						
							|  |  |  |     var request = new _PendingRequest(url); | 
					
						
							| 
									
										
										
										
											2015-06-17 11:17:21 -07:00
										 |  |  |     this._requests.push(request); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     return request.getPromise(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Add an expectation for the given URL. Incoming requests will be checked against | 
					
						
							|  |  |  |    * the next expectation (in FIFO order). The `verifyNoOutstandingExpectations` method | 
					
						
							|  |  |  |    * can be used to check if any expectations have not yet been met. | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * The response given will be returned if the expectation matches. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |   expect(url: string, response: string) { | 
					
						
							|  |  |  |     var expectation = new _Expectation(url, response); | 
					
						
							| 
									
										
										
										
											2015-06-17 11:17:21 -07:00
										 |  |  |     this._expectations.push(expectation); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Add a definition for the given URL to return the given response. Unlike expectations, | 
					
						
							|  |  |  |    * definitions have no order and will satisfy any matching request at any time. Also | 
					
						
							|  |  |  |    * unlike expectations, unused definitions do not cause `verifyNoOutstandingExpectations` | 
					
						
							|  |  |  |    * to return an error. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2015-06-17 16:21:40 -07:00
										 |  |  |   when(url: string, response: string) { this._definitions.set(url, response); } | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Process pending requests and verify there are no outstanding expectations. Also fails | 
					
						
							|  |  |  |    * if no requests are pending. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |   flush() { | 
					
						
							|  |  |  |     if (this._requests.length === 0) { | 
					
						
							|  |  |  |       throw new BaseException('No pending requests to flush'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							| 
									
										
										
										
											2015-10-07 09:09:43 -07:00
										 |  |  |       this._processRequest(this._requests.shift()); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     } while (this._requests.length > 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-24 09:57:24 -08:00
										 |  |  |     this.verifyNoOutstandingExpectations(); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Throw an exception if any expectations have not been satisfied. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2015-11-24 09:57:24 -08:00
										 |  |  |   verifyNoOutstandingExpectations() { | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     if (this._expectations.length === 0) return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |     var urls: any[] /** TODO #9100 */ = []; | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     for (var i = 0; i < this._expectations.length; i++) { | 
					
						
							|  |  |  |       var expectation = this._expectations[i]; | 
					
						
							| 
									
										
										
										
											2015-06-17 11:17:21 -07:00
										 |  |  |       urls.push(expectation.url); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 17:11:10 -07:00
										 |  |  |     throw new BaseException(`Unsatisfied requests: ${urls.join(', ')}`); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-20 17:19:46 -07:00
										 |  |  |   private _processRequest(request: _PendingRequest) { | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     var url = request.url; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (this._expectations.length > 0) { | 
					
						
							|  |  |  |       var expectation = this._expectations[0]; | 
					
						
							| 
									
										
										
										
											2015-02-24 16:05:45 +01:00
										 |  |  |       if (expectation.url == url) { | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |         ListWrapper.remove(this._expectations, expectation); | 
					
						
							|  |  |  |         request.complete(expectation.response); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-17 21:42:56 -07:00
										 |  |  |     if (this._definitions.has(url)) { | 
					
						
							| 
									
										
										
										
											2015-06-17 16:21:40 -07:00
										 |  |  |       var response = this._definitions.get(url); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |       request.complete(normalizeBlank(response)); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     throw new BaseException(`Unexpected request ${url}`); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _PendingRequest { | 
					
						
							| 
									
										
										
										
											2015-07-24 17:24:28 -07:00
										 |  |  |   completer: PromiseCompleter<string>; | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   constructor(public url: string) { this.completer = PromiseWrapper.completer(); } | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   complete(response: string) { | 
					
						
							|  |  |  |     if (isBlank(response)) { | 
					
						
							| 
									
										
										
										
											2015-05-19 12:48:00 -07:00
										 |  |  |       this.completer.reject(`Failed to load ${this.url}`, null); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2015-02-25 12:46:50 +01:00
										 |  |  |       this.completer.resolve(response); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-20 17:19:46 -07:00
										 |  |  |   getPromise(): Promise<string> { return this.completer.promise; } | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _Expectation { | 
					
						
							|  |  |  |   url: string; | 
					
						
							|  |  |  |   response: string; | 
					
						
							|  |  |  |   constructor(url: string, response: string) { | 
					
						
							|  |  |  |     this.url = url; | 
					
						
							|  |  |  |     this.response = response; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |