177 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {
 | |
|   describe,
 | |
|   it,
 | |
|   iit,
 | |
|   ddescribe,
 | |
|   expect,
 | |
|   inject,
 | |
|   beforeEach,
 | |
|   beforeEachProviders,
 | |
| } from '@angular/core/testing/testing_internal';
 | |
| 
 | |
| import {Injector, provide} from '@angular/core';
 | |
| import {
 | |
|   PlatformLocation,
 | |
|   LocationStrategy,
 | |
|   PathLocationStrategy,
 | |
|   APP_BASE_HREF
 | |
| } from '@angular/common';
 | |
| 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;
 | |
| }
 |