179 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
								  AsyncTestCompleter,
							 | 
						||
| 
								 | 
							
								  describe,
							 | 
						||
| 
								 | 
							
								  proxy,
							 | 
						||
| 
								 | 
							
								  it,
							 | 
						||
| 
								 | 
							
								  iit,
							 | 
						||
| 
								 | 
							
								  ddescribe,
							 | 
						||
| 
								 | 
							
								  expect,
							 | 
						||
| 
								 | 
							
								  inject,
							 | 
						||
| 
								 | 
							
								  beforeEach,
							 | 
						||
| 
								 | 
							
								  beforeEachProviders,
							 | 
						||
| 
								 | 
							
								  SpyObject
							 | 
						||
| 
								 | 
							
								} from 'angular2/testing_internal';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {Injector, provide} from 'angular2/core';
							 | 
						||
| 
								 | 
							
								import {CONST_EXPR} from 'angular2/src/facade/lang';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {PlatformLocation} from 'angular2/src/router/platform_location';
							 | 
						||
| 
								 | 
							
								import {LocationStrategy, APP_BASE_HREF} from 'angular2/src/router/location_strategy';
							 | 
						||
| 
								 | 
							
								import {PathLocationStrategy} from 'angular2/src/router/path_location_strategy';
							 | 
						||
| 
								 | 
							
								import {SpyPlatformLocation} from './spies';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function main() {
							 | 
						||
| 
								 | 
							
								  describe('PathLocationStrategy', () => {
							 | 
						||
| 
								 | 
							
								    var platformLocation, locationStrategy;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    beforeEachProviders(() => [
							 | 
						||
| 
								 | 
							
								      PathLocationStrategy,
							 | 
						||
| 
								 | 
							
								      provide(PlatformLocation, {useFactory: makeSpyPlatformLocation})
							 | 
						||
| 
								 | 
							
								    ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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;
							 | 
						||
| 
								 | 
							
								}
							 |