2016-04-12 12:40:37 -04:00
|
|
|
import {
|
|
|
|
AsyncTestCompleter,
|
|
|
|
describe,
|
|
|
|
it,
|
|
|
|
iit,
|
|
|
|
ddescribe,
|
|
|
|
expect,
|
|
|
|
inject,
|
|
|
|
beforeEach,
|
|
|
|
beforeEachProviders,
|
|
|
|
SpyObject
|
|
|
|
} from 'angular2/testing_internal';
|
2015-11-23 13:47:06 -05:00
|
|
|
|
|
|
|
import {Injector, provide} from 'angular2/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 03:31:20 -04:00
|
|
|
import {PlatformLocation, APP_BASE_HREF, HashLocationStrategy} from 'angular2/platform/common';
|
2016-02-09 14:12:41 -05:00
|
|
|
import {SpyPlatformLocation} from '../spies';
|
2015-11-23 13:47:06 -05:00
|
|
|
|
|
|
|
export function main() {
|
|
|
|
describe('HashLocationStrategy', () => {
|
2016-02-25 19:18:55 -05:00
|
|
|
var platformLocation: SpyPlatformLocation;
|
|
|
|
var locationStrategy: HashLocationStrategy;
|
2015-11-23 13:47:06 -05:00
|
|
|
|
|
|
|
beforeEachProviders(
|
|
|
|
() => [HashLocationStrategy, provide(PlatformLocation, {useClass: SpyPlatformLocation})]);
|
|
|
|
|
|
|
|
describe('without APP_BASE_HREF', () => {
|
|
|
|
beforeEach(inject([PlatformLocation, HashLocationStrategy], (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('#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', () => {
|
|
|
|
beforeEachProviders(() => [provide(APP_BASE_HREF, {useValue: 'app'})]);
|
|
|
|
|
|
|
|
beforeEach(inject([PlatformLocation, HashLocationStrategy], (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, HashLocationStrategy], (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, HashLocationStrategy], (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/');
|
|
|
|
});
|
|
|
|
});
|
2016-02-25 19:18:55 -05:00
|
|
|
|
|
|
|
describe('hashLocationStrategy bugs', () => {
|
|
|
|
beforeEach(inject([PlatformLocation, HashLocationStrategy], (pl, ls) => {
|
|
|
|
platformLocation = pl;
|
|
|
|
locationStrategy = ls;
|
|
|
|
platformLocation.spy('pushState');
|
|
|
|
platformLocation.pathname = '';
|
|
|
|
}));
|
|
|
|
|
|
|
|
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 13:47:06 -05:00
|
|
|
});
|
|
|
|
}
|