| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   inject, | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   beforeEachProviders, | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | } 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'; | 
					
						
							| 
									
										
										
											
												refactor(Location): out of router and into platform/common
closes https://github.com/angular/angular/issues/4943
BREAKING CHANGE:
`Location` and other related providers have been moved out of `router` and into `platform/common`. `BrowserPlatformLocation` is not meant to be used directly however advanced configurations may use it via the following import change.
Before:
```
import {
  PlatformLocation,
  Location,
  LocationStrategy,
  HashLocationStrategy,
  PathLocationStrategy,
  APP_BASE_HREF}
from 'angular2/router';
import {BrowserPlatformLocation} from 'angular2/src/router/location/browser_platform_location';
```
After:
```
import {
  PlatformLocation,
  Location,
  LocationStrategy,
  HashLocationStrategy,
  PathLocationStrategy,
  APP_BASE_HREF}
from 'angular2/platform/common';
import {BrowserPlatformLocation} from 'angular2/src/platform/browser/location/browser_platform_location';
```
Closes #7962
											
										 
											2016-04-08 00:31:20 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   PlatformLocation, | 
					
						
							|  |  |  |   LocationStrategy, | 
					
						
							|  |  |  |   PathLocationStrategy, | 
					
						
							|  |  |  |   APP_BASE_HREF | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | } 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', () => { | 
					
						
							|  |  |  |     var platformLocation, locationStrategy; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -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', () => { | 
					
						
							|  |  |  |       beforeEach(inject([PlatformLocation, PathLocationStrategy], (pl, ls) => { | 
					
						
							|  |  |  |         platformLocation = pl; | 
					
						
							|  |  |  |         locationStrategy = ls; | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       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', () => { | 
					
						
							|  |  |  |       beforeEachProviders(() => [provide(APP_BASE_HREF, {useValue: 'app'})]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(inject([PlatformLocation, PathLocationStrategy], (pl, ls) => { | 
					
						
							|  |  |  |         platformLocation = pl; | 
					
						
							|  |  |  |         locationStrategy = ls; | 
					
						
							|  |  |  |         platformLocation.spy('pushState'); | 
					
						
							|  |  |  |         platformLocation.pathname = ''; | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       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', () => { | 
					
						
							|  |  |  |       beforeEachProviders(() => [provide(APP_BASE_HREF, {useValue: '/app'})]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(inject([PlatformLocation, PathLocationStrategy], (pl, ls) => { | 
					
						
							|  |  |  |         platformLocation = pl; | 
					
						
							|  |  |  |         locationStrategy = ls; | 
					
						
							|  |  |  |         platformLocation.spy('pushState'); | 
					
						
							|  |  |  |         platformLocation.pathname = ''; | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       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', () => { | 
					
						
							|  |  |  |       beforeEachProviders(() => [provide(APP_BASE_HREF, {useValue: '/app/'})]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(inject([PlatformLocation, PathLocationStrategy], (pl, ls) => { | 
					
						
							|  |  |  |         platformLocation = pl; | 
					
						
							|  |  |  |         locationStrategy = ls; | 
					
						
							|  |  |  |         platformLocation.spy('pushState'); | 
					
						
							|  |  |  |         platformLocation.pathname = ''; | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       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; | 
					
						
							|  |  |  | } |