aboutsummaryrefslogtreecommitdiffstats
path: root/test/service/locationSpec.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/service/locationSpec.js')
-rw-r--r--test/service/locationSpec.js504
1 files changed, 292 insertions, 212 deletions
diff --git a/test/service/locationSpec.js b/test/service/locationSpec.js
index 9a7aa943..38df2619 100644
--- a/test/service/locationSpec.js
+++ b/test/service/locationSpec.js
@@ -307,164 +307,187 @@ describe('$location', function() {
});
- var $browser, $location, scope;
-
- function init(url, html5Mode, basePath, hashPrefix, supportHistory) {
- scope = angular.scope(null, {
- $locationConfig: {html5Mode: html5Mode, hashPrefix: hashPrefix},
- $sniffer: {history: supportHistory}});
-
- $browser = scope.$service('$browser');
- $browser.url(url);
- $browser.$$baseHref = basePath;
- $location = scope.$service('$location');
+ function initService(html5Mode, hashPrefix, supportHistory) {
+ return function(service){
+ service('$locationConfig', function(){
+ return {html5Mode: html5Mode, hashPrefix: hashPrefix};
+ });
+ service('$sniffer', function(){
+ return {history: supportHistory};
+ });
+ };
}
-
- function dealocRootElement() {
- dealoc(scope.$service('$document'));
+ function initBrowser(url, basePath) {
+ return function($browser){
+ $browser.url(url);
+ $browser.$$baseHref = basePath;
+ };
}
-
describe('wiring', function() {
- beforeEach(function() {
- init('http://new.com/a/b#!', false, '/a/b', '!', true);
- });
+ beforeEach(inject(initService(false, '!', true), initBrowser('http://new.com/a/b#!', '/a/b')));
- it('should update $location when browser url changes', function() {
+ it('should update $location when browser url changes', inject(function($browser, $location) {
spyOn($location, '$$parse').andCallThrough();
$browser.url('http://new.com/a/b#!/aaa');
$browser.poll();
expect($location.absUrl()).toBe('http://new.com/a/b#!/aaa');
expect($location.path()).toBe('/aaa');
expect($location.$$parse).toHaveBeenCalledOnce();
- });
+ }));
- it('should update browser when $location changes', function() {
+ it('should update browser when $location changes', inject(function($rootScope, $browser, $location) {
var $browserUrl = spyOnlyCallsWithArgs($browser, 'url').andCallThrough();
$location.path('/new/path');
expect($browserUrl).not.toHaveBeenCalled();
- scope.$apply();
+ $rootScope.$apply();
expect($browserUrl).toHaveBeenCalledOnce();
expect($browser.url()).toBe('http://new.com/a/b#!/new/path');
- });
+ }));
- it('should update browser only once per $apply cycle', function() {
+ it('should update browser only once per $apply cycle', inject(function($rootScope, $browser, $location) {
var $browserUrl = spyOnlyCallsWithArgs($browser, 'url').andCallThrough();
$location.path('/new/path');
- scope.$watch(function() {
+ $rootScope.$watch(function() {
$location.search('a=b');
});
- scope.$apply();
+ $rootScope.$apply();
expect($browserUrl).toHaveBeenCalledOnce();
expect($browser.url()).toBe('http://new.com/a/b#!/new/path?a=b');
- });
+ }));
- it('should replace browser url when url was replaced at least once', function() {
+ it('should replace browser url when url was replaced at least once',
+ inject(function($rootScope, $location, $browser) {
var $browserUrl = spyOnlyCallsWithArgs($browser, 'url').andCallThrough();
$location.path('/n/url').replace();
- scope.$apply();
+ $rootScope.$apply();
expect($browserUrl).toHaveBeenCalledOnce();
expect($browserUrl.mostRecentCall.args).toEqual(['http://new.com/a/b#!/n/url', true]);
- });
+ }));
- it('should update the browser if changed from within a watcher', function() {
- scope.$watch(function() { return true; }, function() {
+ it('should update the browser if changed from within a watcher', inject(function($rootScope, $location, $browser) {
+ $rootScope.$watch(function() { return true; }, function() {
$location.path('/changed');
});
- scope.$digest();
+ $rootScope.$digest();
expect($browser.url()).toBe('http://new.com/a/b#!/changed');
- });
+ }));
});
// html5 history is disabled
describe('disabled history', function() {
- it('should use hashbang url with hash prefix', function() {
- init('http://domain.com/base/index.html#!/a/b', false, '/base/index.html', '!');
- expect($browser.url()).toBe('http://domain.com/base/index.html#!/a/b');
- $location.path('/new');
- $location.search({a: true});
- scope.$apply();
- expect($browser.url()).toBe('http://domain.com/base/index.html#!/new?a');
- });
-
-
- it('should use hashbang url without hash prefix', function() {
- init('http://domain.com/base/index.html#/a/b', false, '/base/index.html', '');
- expect($browser.url()).toBe('http://domain.com/base/index.html#/a/b');
- $location.path('/new');
- $location.search({a: true});
- scope.$apply();
- expect($browser.url()).toBe('http://domain.com/base/index.html#/new?a');
- });
+ it('should use hashbang url with hash prefix', inject(
+ initService(false, '!'),
+ initBrowser('http://domain.com/base/index.html#!/a/b', '/base/index.html'),
+ function($rootScope, $location, $browser) {
+ expect($browser.url()).toBe('http://domain.com/base/index.html#!/a/b');
+ $location.path('/new');
+ $location.search({a: true});
+ $rootScope.$apply();
+ expect($browser.url()).toBe('http://domain.com/base/index.html#!/new?a');
+ })
+ );
+
+
+ it('should use hashbang url without hash prefix', inject(
+ initService(false, ''),
+ initBrowser('http://domain.com/base/index.html#/a/b', '/base/index.html'),
+ function($rootScope, $location, $browser) {
+ expect($browser.url()).toBe('http://domain.com/base/index.html#/a/b');
+ $location.path('/new');
+ $location.search({a: true});
+ $rootScope.$apply();
+ expect($browser.url()).toBe('http://domain.com/base/index.html#/new?a');
+ })
+ );
});
// html5 history enabled, but not supported by browser
describe('history on old browser', function() {
- afterEach(dealocRootElement);
-
- it('should use hashbang url with hash prefix', function() {
- init('http://domain.com/base/index.html#!!/a/b', true, '/base/index.html', '!!', false);
- expect($browser.url()).toBe('http://domain.com/base/index.html#!!/a/b');
- $location.path('/new');
- $location.search({a: true});
- scope.$apply();
- expect($browser.url()).toBe('http://domain.com/base/index.html#!!/new?a');
- });
-
-
- it('should redirect to hashbang url when new url given', function() {
- init('http://domain.com/base/new-path/index.html', true, '/base/index.html', '!');
- expect($browser.url()).toBe('http://domain.com/base/index.html#!/new-path/index.html');
- });
+ afterEach(inject(function($document){
+ dealoc($document);
+ }));
+
+ it('should use hashbang url with hash prefix', inject(
+ initService(true, '!!', false),
+ initBrowser('http://domain.com/base/index.html#!!/a/b', '/base/index.html'),
+ function($rootScope, $location, $browser) {
+ expect($browser.url()).toBe('http://domain.com/base/index.html#!!/a/b');
+ $location.path('/new');
+ $location.search({a: true});
+ $rootScope.$apply();
+ expect($browser.url()).toBe('http://domain.com/base/index.html#!!/new?a');
+ })
+ );
+
+
+ it('should redirect to hashbang url when new url given', inject(
+ initService(true, '!'),
+ initBrowser('http://domain.com/base/new-path/index.html', '/base/index.html'),
+ function($browser, $location) {
+ expect($browser.url()).toBe('http://domain.com/base/index.html#!/new-path/index.html');
+ })
+ );
});
// html5 history enabled and supported by browser
describe('history on new browser', function() {
- afterEach(dealocRootElement);
-
- it('should use new url', function() {
- init('http://domain.com/base/old/index.html#a', true, '/base/index.html', '', true);
- expect($browser.url()).toBe('http://domain.com/base/old/index.html#a');
- $location.path('/new');
- $location.search({a: true});
- scope.$apply();
- expect($browser.url()).toBe('http://domain.com/base/new?a#a');
- });
-
-
- it('should rewrite when hashbang url given', function() {
- init('http://domain.com/base/index.html#!/a/b', true, '/base/index.html', '!', true);
- expect($browser.url()).toBe('http://domain.com/base/a/b');
- $location.path('/new');
- $location.hash('abc');
- scope.$apply();
- expect($browser.url()).toBe('http://domain.com/base/new#abc');
- expect($location.path()).toBe('/new');
- });
-
-
- it('should rewrite when hashbang url given (without hash prefix)', function() {
- init('http://domain.com/base/index.html#/a/b', true, '/base/index.html', '', true);
- expect($browser.url()).toBe('http://domain.com/base/a/b');
- expect($location.path()).toBe('/a/b');
- });
+ afterEach(inject(function($document){
+ dealoc($document);
+ }));
+
+ it('should use new url', inject(
+ initService(true, '', true),
+ initBrowser('http://domain.com/base/old/index.html#a', '/base/index.html'),
+ function($rootScope, $location, $browser) {
+ expect($browser.url()).toBe('http://domain.com/base/old/index.html#a');
+ $location.path('/new');
+ $location.search({a: true});
+ $rootScope.$apply();
+ expect($browser.url()).toBe('http://domain.com/base/new?a#a');
+ })
+ );
+
+
+ it('should rewrite when hashbang url given', inject(
+ initService(true, '!', true),
+ initBrowser('http://domain.com/base/index.html#!/a/b', '/base/index.html'),
+ function($rootScope, $location, $browser) {
+ expect($browser.url()).toBe('http://domain.com/base/a/b');
+ $location.path('/new');
+ $location.hash('abc');
+ $rootScope.$apply();
+ expect($browser.url()).toBe('http://domain.com/base/new#abc');
+ expect($location.path()).toBe('/new');
+ })
+ );
+
+
+ it('should rewrite when hashbang url given (without hash prefix)', inject(
+ initService(true, '', true),
+ initBrowser('http://domain.com/base/index.html#/a/b', '/base/index.html'),
+ function($rootScope, $location, $browser) {
+ expect($browser.url()).toBe('http://domain.com/base/a/b');
+ expect($location.path()).toBe('/a/b');
+ })
+ );
});
@@ -554,43 +577,48 @@ describe('$location', function() {
describe('link rewriting', function() {
- var root, link, extLink, $browser, originalBrowser, lastEventPreventDefault;
+ var root, link, originalBrowser, lastEventPreventDefault;
- function init(linkHref, html5Mode, supportHist, attrs, content) {
- var jqRoot = jqLite('<div></div>');
- attrs = attrs ? ' ' + attrs + ' ' : '';
- content = content || 'link';
- link = jqLite('<a href="' + linkHref + '"' + attrs + '>' + content + '</a>')[0];
- root = jqRoot.append(link)[0];
+ function configureService(linkHref, html5Mode, supportHist, attrs, content) {
+ return function(service){
+ var jqRoot = jqLite('<div></div>');
+ attrs = attrs ? ' ' + attrs + ' ' : '';
+ link = jqLite('<a href="' + linkHref + '"' + attrs + '>' + content + '</a>')[0];
+ root = jqRoot.append(link)[0];
- jqLite(document.body).append(jqRoot);
+ jqLite(document.body).append(jqRoot);
- var scope = angular.scope(null, {
- $document: jqRoot,
- $sniffer: {history: supportHist},
- $locationConfig: {html5Mode: html5Mode, hashPrefix: '!'}
- });
+ service('$document', function(){ return jqRoot; });
+ service('$sniffer', function(){ return {history: supportHist}; });
+ service('$locationConfig', function(){ return {html5Mode: html5Mode, hashPrefix: '!'}; });
+ };
+ }
- $browser = scope.$service('$browser');
- $browser.url('http://host.com/base');
- $browser.$$baseHref = '/base/index.html';
- var $location = scope.$service('$location');
- originalBrowser = $browser.url();
-
- // we have to prevent the default operation, as we need to test absolute links (http://...)
- // and navigating to these links would kill jstd
- jqRoot.bind('click', function(e) {
- lastEventPreventDefault = e.isDefaultPrevented();
- e.preventDefault();
- });
+ function initBrowser() {
+ return function($browser){
+ $browser.url('http://host.com/base');
+ $browser.$$baseHref = '/base/index.html';
+ };
+ }
+
+ function initLocation() {
+ return function($browser, $location, $document) {
+ originalBrowser = $browser.url();
+ // we have to prevent the default operation, as we need to test absolute links (http://...)
+ // and navigating to these links would kill jstd
+ $document.bind('click', function(e) {
+ lastEventPreventDefault = e.isDefaultPrevented();
+ e.preventDefault();
+ });
+ };
}
- function expectRewriteTo(url) {
+ function expectRewriteTo($browser, url) {
expect(lastEventPreventDefault).toBe(true);
expect($browser.url()).toBe(url);
}
- function expectNoRewrite() {
+ function expectNoRewrite($browser) {
expect(lastEventPreventDefault).toBe(false);
expect($browser.url()).toBe(originalBrowser);
}
@@ -601,100 +629,152 @@ describe('$location', function() {
});
- it('should rewrite rel link to new url when history enabled on new browser', function() {
- init('link?a#b', true, true);
- browserTrigger(link, 'click');
- expectRewriteTo('http://host.com/base/link?a#b');
- });
-
-
- it('should rewrite abs link to new url when history enabled on new browser', function() {
- init('/base/link?a#b', true, true);
- browserTrigger(link, 'click');
- expectRewriteTo('http://host.com/base/link?a#b');
- });
-
-
- it('should rewrite rel link to hashbang url when history enabled on old browser', function() {
- init('link?a#b', true, false);
- browserTrigger(link, 'click');
- expectRewriteTo('http://host.com/base/index.html#!/link?a#b');
- });
-
-
- it('should rewrite abs link to hashbang url when history enabled on old browser', function() {
- init('/base/link?a#b', true, false);
- browserTrigger(link, 'click');
- expectRewriteTo('http://host.com/base/index.html#!/link?a#b');
- });
-
-
- it('should not rewrite when history disabled', function() {
- init('#new', false);
- browserTrigger(link, 'click');
- expectNoRewrite();
- });
-
-
- it('should not rewrite ng:ext-link', function() {
- init('#new', true, true, 'ng:ext-link');
- browserTrigger(link, 'click');
- expectNoRewrite();
- });
-
-
- it('should not rewrite full url links do different domain', function() {
- init('http://www.dot.abc/a?b=c', true);
- browserTrigger(link, 'click');
- expectNoRewrite();
- });
-
-
- it('should not rewrite links with target="_blank"', function() {
- init('/a?b=c', true, true, 'target="_blank"');
- browserTrigger(link, 'click');
- expectNoRewrite();
- });
-
-
- it('should not rewrite links with target specified', function() {
- init('/a?b=c', true, true, 'target="some-frame"');
- browserTrigger(link, 'click');
- expectNoRewrite();
- });
-
-
- it('should rewrite full url links to same domain and base path', function() {
- init('http://host.com/base/new', true);
- browserTrigger(link, 'click');
- expectRewriteTo('http://host.com/base/index.html#!/new');
- });
-
-
- it('should rewrite when clicked span inside link', function() {
- init('some/link', true, true, '', '<span>link</span>');
- var span = jqLite(link).find('span');
-
- browserTrigger(span, 'click');
- expectRewriteTo('http://host.com/base/some/link');
- });
+ it('should rewrite rel link to new url when history enabled on new browser', inject(
+ configureService('link?a#b', true, true),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectRewriteTo($browser, 'http://host.com/base/link?a#b');
+ })
+ );
+
+
+ it('should rewrite abs link to new url when history enabled on new browser', inject(
+ configureService('/base/link?a#b', true, true),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectRewriteTo($browser, 'http://host.com/base/link?a#b');
+ })
+ );
+
+
+ it('should rewrite rel link to hashbang url when history enabled on old browser', inject(
+ configureService('link?a#b', true, false),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectRewriteTo($browser, 'http://host.com/base/index.html#!/link?a#b');
+ })
+ );
+
+
+ it('should rewrite abs link to hashbang url when history enabled on old browser', inject(
+ configureService('/base/link?a#b', true, false),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectRewriteTo($browser, 'http://host.com/base/index.html#!/link?a#b');
+ })
+ );
+
+
+ it('should not rewrite when history disabled', inject(
+ configureService('#new', false),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectNoRewrite($browser);
+ })
+ );
+
+
+ it('should not rewrite ng:ext-link', inject(
+ configureService('#new', true, true, 'ng:ext-link'),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectNoRewrite($browser);
+ })
+ );
+
+
+ it('should not rewrite full url links do different domain', inject(
+ configureService('http://www.dot.abc/a?b=c', true),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectNoRewrite($browser);
+ })
+ );
+
+
+ it('should not rewrite links with target="_blank"', inject(
+ configureService('/a?b=c', true, true, 'target="_blank"'),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectNoRewrite($browser);
+ })
+ );
+
+
+ it('should not rewrite links with target specified', inject(
+ configureService('/a?b=c', true, true, 'target="some-frame"'),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectNoRewrite($browser);
+ })
+ );
+
+
+ it('should rewrite full url links to same domain and base path', inject(
+ configureService('http://host.com/base/new', true),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click');
+ expectRewriteTo($browser, 'http://host.com/base/index.html#!/new');
+ })
+ );
+
+
+ it('should rewrite when clicked span inside link', inject(
+ configureService('some/link', true, true, '', '<span>link</span>'),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ var span = jqLite(link).find('span');
+
+ browserTrigger(span, 'click');
+ expectRewriteTo($browser, 'http://host.com/base/some/link');
+ })
+ );
// don't run next tests on IE<9, as browserTrigger does not simulate pressed keys
if (!(msie < 9)) {
- it('should not rewrite when clicked with ctrl pressed', function() {
- init('/a?b=c', true, true);
- browserTrigger(link, 'click', ['ctrl']);
- expectNoRewrite();
- });
-
-
- it('should not rewrite when clicked with meta pressed', function() {
- init('/a?b=c', true, true);
- browserTrigger(link, 'click', ['meta']);
- expectNoRewrite();
- });
+ it('should not rewrite when clicked with ctrl pressed', inject(
+ configureService('/a?b=c', true, true),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click', ['ctrl']);
+ expectNoRewrite($browser);
+ })
+ );
+
+
+ it('should not rewrite when clicked with meta pressed', inject(
+ configureService('/a?b=c', true, true),
+ initBrowser(),
+ initLocation(),
+ function($browser) {
+ browserTrigger(link, 'click', ['meta']);
+ expectNoRewrite($browser);
+ })
+ );
}
});
});