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;
 | 
						|
}
 |