| 
									
										
										
										
											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 {describe, it, iit, ddescribe, expect, inject, beforeEach, beforeEachProviders,} from '@angular/core/testing/testing_internal'; | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {Injector, provide} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {PlatformLocation, LocationStrategy, PathLocationStrategy, APP_BASE_HREF} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2016-02-09 11:12:41 -08:00
										 |  |  | import {SpyPlatformLocation} from '../spies'; | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							|  |  |  |   describe('PathLocationStrategy', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |     var platformLocation: any /** TODO #9100 */, locationStrategy: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     beforeEachProviders(() => [PathLocationStrategy, { | 
					
						
							|  |  |  |                           provide: PlatformLocation, | 
					
						
							|  |  |  |                           useFactory: makeSpyPlatformLocation | 
					
						
							|  |  |  |                         }]); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should throw without a base element or APP_BASE_HREF', () => { | 
					
						
							|  |  |  |       platformLocation = new SpyPlatformLocation(); | 
					
						
							|  |  |  |       platformLocation.pathname = ''; | 
					
						
							|  |  |  |       platformLocation.spy('getBaseHrefFromDOM').andReturn(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(() => new PathLocationStrategy(platformLocation)) | 
					
						
							|  |  |  |           .toThrowError( | 
					
						
							|  |  |  |               'No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('without APP_BASE_HREF', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       beforeEach(inject( | 
					
						
							|  |  |  |           [PlatformLocation, PathLocationStrategy], | 
					
						
							|  |  |  |           (pl: any /** TODO #9100 */, ls: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |             platformLocation = pl; | 
					
						
							|  |  |  |             locationStrategy = ls; | 
					
						
							|  |  |  |           })); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for non-empty URLs', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo')).toEqual('foo'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', 'foo'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for URLs with query params', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo?bar')).toEqual('foo?bar'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', 'bar=baz'); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')) | 
					
						
							|  |  |  |             .toHaveBeenCalledWith(null, 'Title', 'foo?bar=baz'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not prepend a hash to external urls for an empty internal URL', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('')).toEqual(''); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', '', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', ''); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('with APP_BASE_HREF with neither leading nor trailing slash', () => { | 
					
						
							| 
									
										
										
										
											2016-06-02 17:30:40 -07:00
										 |  |  |       beforeEachProviders(() => [{provide: APP_BASE_HREF, useValue: 'app'}]); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       beforeEach(inject( | 
					
						
							|  |  |  |           [PlatformLocation, PathLocationStrategy], | 
					
						
							|  |  |  |           (pl: any /** TODO #9100 */, ls: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |             platformLocation = pl; | 
					
						
							|  |  |  |             locationStrategy = ls; | 
					
						
							|  |  |  |             platformLocation.spy('pushState'); | 
					
						
							|  |  |  |             platformLocation.pathname = ''; | 
					
						
							|  |  |  |           })); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for non-empty URLs', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo')).toEqual('app/foo'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', 'app/foo'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for URLs with query params', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo?bar')).toEqual('app/foo?bar'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', 'bar=baz'); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')) | 
					
						
							|  |  |  |             .toHaveBeenCalledWith(null, 'Title', 'app/foo?bar=baz'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not prepend a hash to external urls for an empty internal URL', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('')).toEqual('app'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', '', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', 'app'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('with APP_BASE_HREF with leading slash', () => { | 
					
						
							| 
									
										
										
										
											2016-06-02 17:30:40 -07:00
										 |  |  |       beforeEachProviders(() => [{provide: APP_BASE_HREF, useValue: '/app'}]); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       beforeEach(inject( | 
					
						
							|  |  |  |           [PlatformLocation, PathLocationStrategy], | 
					
						
							|  |  |  |           (pl: any /** TODO #9100 */, ls: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |             platformLocation = pl; | 
					
						
							|  |  |  |             locationStrategy = ls; | 
					
						
							|  |  |  |             platformLocation.spy('pushState'); | 
					
						
							|  |  |  |             platformLocation.pathname = ''; | 
					
						
							|  |  |  |           })); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for non-empty URLs', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo')).toEqual('/app/foo'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', '/app/foo'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for URLs with query params', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo?bar')).toEqual('/app/foo?bar'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', 'bar=baz'); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')) | 
					
						
							|  |  |  |             .toHaveBeenCalledWith(null, 'Title', '/app/foo?bar=baz'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not prepend a hash to external urls for an empty internal URL', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('')).toEqual('/app'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', '', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', '/app'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('with APP_BASE_HREF with both leading and trailing slash', () => { | 
					
						
							| 
									
										
										
										
											2016-06-02 17:30:40 -07:00
										 |  |  |       beforeEachProviders(() => [{provide: APP_BASE_HREF, useValue: '/app/'}]); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       beforeEach(inject( | 
					
						
							|  |  |  |           [PlatformLocation, PathLocationStrategy], | 
					
						
							|  |  |  |           (pl: any /** TODO #9100 */, ls: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |             platformLocation = pl; | 
					
						
							|  |  |  |             locationStrategy = ls; | 
					
						
							|  |  |  |             platformLocation.spy('pushState'); | 
					
						
							|  |  |  |             platformLocation.pathname = ''; | 
					
						
							|  |  |  |           })); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for non-empty URLs', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo')).toEqual('/app/foo'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', '/app/foo'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should prepend urls with a hash for URLs with query params', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('foo?bar')).toEqual('/app/foo?bar'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', 'foo', 'bar=baz'); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')) | 
					
						
							|  |  |  |             .toHaveBeenCalledWith(null, 'Title', '/app/foo?bar=baz'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not prepend a hash to external urls for an empty internal URL', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('')).toEqual('/app/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', '', ''); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', '/app/'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function makeSpyPlatformLocation() { | 
					
						
							|  |  |  |   var platformLocation = new SpyPlatformLocation(); | 
					
						
							|  |  |  |   platformLocation.spy('getBaseHrefFromDOM').andReturn(''); | 
					
						
							|  |  |  |   platformLocation.spy('pushState'); | 
					
						
							|  |  |  |   platformLocation.pathname = ''; | 
					
						
							|  |  |  |   return platformLocation; | 
					
						
							|  |  |  | } |