| 
									
										
										
										
											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-02 15:53:34 -07:00
										 |  |  | import {APP_BASE_HREF, HashLocationStrategy, PlatformLocation} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {Injector, provide} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {beforeEach, beforeEachProviders, ddescribe, describe, expect, iit, inject, it} from '@angular/core/testing/testing_internal'; | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 11:12:41 -08:00
										 |  |  | import {SpyPlatformLocation} from '../spies'; | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							|  |  |  |   describe('HashLocationStrategy', () => { | 
					
						
							| 
									
										
										
										
											2016-02-25 16:18:55 -08:00
										 |  |  |     var platformLocation: SpyPlatformLocation; | 
					
						
							|  |  |  |     var locationStrategy: HashLocationStrategy; | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     beforeEachProviders( | 
					
						
							| 
									
										
										
										
											2016-06-02 17:30:40 -07:00
										 |  |  |         () => [HashLocationStrategy, {provide: PlatformLocation, useClass: SpyPlatformLocation}]); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('without APP_BASE_HREF', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       beforeEach(inject( | 
					
						
							|  |  |  |           [PlatformLocation, HashLocationStrategy], | 
					
						
							|  |  |  |           (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('#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 prepend urls with a hash for URLs with just query params', () => { | 
					
						
							|  |  |  |         expect(locationStrategy.prepareExternalUrl('?bar')).toEqual('#?bar'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         locationStrategy.pushState(null, 'Title', '', 'bar=baz'); | 
					
						
							|  |  |  |         expect(platformLocation.spy('pushState')).toHaveBeenCalledWith(null, 'Title', '#?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, HashLocationStrategy], | 
					
						
							|  |  |  |           (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, HashLocationStrategy], | 
					
						
							|  |  |  |           (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, HashLocationStrategy], | 
					
						
							|  |  |  |           (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/'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-02-25 16:18:55 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('hashLocationStrategy bugs', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       beforeEach(inject( | 
					
						
							|  |  |  |           [PlatformLocation, HashLocationStrategy], | 
					
						
							|  |  |  |           (pl: any /** TODO #9100 */, ls: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |             platformLocation = pl; | 
					
						
							|  |  |  |             locationStrategy = ls; | 
					
						
							|  |  |  |             platformLocation.spy('pushState'); | 
					
						
							|  |  |  |             platformLocation.pathname = ''; | 
					
						
							|  |  |  |           })); | 
					
						
							| 
									
										
										
										
											2016-02-25 16:18:55 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should not include platform search', () => { | 
					
						
							|  |  |  |         platformLocation.search = '?donotinclude'; | 
					
						
							|  |  |  |         expect(locationStrategy.path()).toEqual(''); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not include platform search even with hash', () => { | 
					
						
							|  |  |  |         platformLocation.hash = '#hashPath'; | 
					
						
							|  |  |  |         platformLocation.search = '?donotinclude'; | 
					
						
							|  |  |  |         expect(locationStrategy.path()).toEqual('hashPath'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-11-23 10:47:06 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | } |