| 
									
										
										
										
											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-08-30 18:07:40 -07:00
										 |  |  | import {ResourceLoader} from '@angular/compiler'; | 
					
						
							| 
									
										
										
										
											2016-09-19 17:15:57 -07:00
										 |  |  | import {ListWrapper} from './facade/collection'; | 
					
						
							| 
									
										
										
										
											2016-10-21 15:14:44 -07:00
										 |  |  | import {isBlank} from './facade/lang'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2016-08-17 09:24:44 -07:00
										 |  |  |  * A mock implementation of {@link ResourceLoader} 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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-08-17 09:24:44 -07:00
										 |  |  | export class MockResourceLoader extends ResourceLoader { | 
					
						
							| 
									
										
										
										
											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> { | 
					
						
							| 
									
										
										
										
											2016-10-21 15:14:44 -07:00
										 |  |  |     const 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) { | 
					
						
							| 
									
										
										
										
											2016-10-21 15:14:44 -07:00
										 |  |  |     const 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) { | 
					
						
							| 
									
										
										
										
											2016-08-25 00:50:16 -07:00
										 |  |  |       throw new Error('No pending requests to flush'); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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-10-07 17:36:08 -07:00
										 |  |  |     var urls: string[] = []; | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 00:50:16 -07:00
										 |  |  |     throw new Error(`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); | 
					
						
							| 
									
										
										
										
											2016-10-21 15:14:44 -07:00
										 |  |  |       request.complete(response == null ? null : response); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 00:50:16 -07:00
										 |  |  |     throw new Error(`Unexpected request ${url}`); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _PendingRequest { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |   resolve: (result: string) => void; | 
					
						
							|  |  |  |   reject: (error: any) => void; | 
					
						
							|  |  |  |   promise: Promise<string>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor(public url: string) { | 
					
						
							|  |  |  |     this.promise = new Promise((res, rej) => { | 
					
						
							|  |  |  |       this.resolve = res; | 
					
						
							|  |  |  |       this.reject = rej; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   complete(response: string) { | 
					
						
							|  |  |  |     if (isBlank(response)) { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       this.reject(`Failed to load ${this.url}`); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       this.resolve(response); | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |   getPromise(): Promise<string> { return this.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; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |