diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index f6e5cce71e96..e7f78fcccdbc 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1771,7 +1771,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { * See {@link ngMock.$httpBackend#when `when`} for more info. */ $httpBackend.whenRoute = function(method, url) { - var pathObj = routeToRegExp(url, {caseInsensitiveMatch: true, ignoreTrailingSlashes: true}); + var pathObj = routeToRegExp(url, {caseInsensitiveMatch: true, ignoreTrailingSlashes: true, isUrl: true}); return $httpBackend.when(method, pathObj.regexp, undefined, undefined, pathObj.keys); }; @@ -1955,7 +1955,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { * See {@link ngMock.$httpBackend#expect `expect`} for more info. */ $httpBackend.expectRoute = function(method, url) { - var pathObj = routeToRegExp(url, {caseInsensitiveMatch: true, ignoreTrailingSlashes: true}); + var pathObj = routeToRegExp(url, {caseInsensitiveMatch: true, ignoreTrailingSlashes: true, isUrl: true}); return $httpBackend.expect(method, pathObj.regexp, undefined, undefined, pathObj.keys); }; diff --git a/src/routeToRegExp.js b/src/routeToRegExp.js index ea0b94efe7f3..d8edd4706359 100644 --- a/src/routeToRegExp.js +++ b/src/routeToRegExp.js @@ -3,7 +3,7 @@ /* global routeToRegExp: true */ /** - * @param path {string} path + * @param pathOrUrl {string} path or url * @param opts {Object} options * @return {?Object} * @@ -13,10 +13,10 @@ * * Inspired by pathRexp in visionmedia/express/lib/utils.js. */ -function routeToRegExp(path, opts) { +function routeToRegExp(pathOrUrl, opts) { var keys = []; - var pattern = path + var pattern = pathOrUrl .replace(/([().])/g, '\\$1') .replace(/(\/)?:(\w+)(\*\?|[?*])?/g, function(_, slash, key, option) { var optional = option === '?' || option === '*?'; @@ -25,7 +25,7 @@ function routeToRegExp(path, opts) { slash = slash || ''; return ( (optional ? '(?:' + slash : slash + '(?:') + - (star ? '([^?#]+?)' : '([^/?#]+)') + + (opts.isUrl ? (star ? '([^?#]+?)' : '([^/?#]+)') : (star ? '(.+?)' : '([^/]+)')) + (optional ? '?)?' : ')') ); }) @@ -36,7 +36,7 @@ function routeToRegExp(path, opts) { } return { - originalPath: path, + originalPath: pathOrUrl, keys: keys, regexp: new RegExp( '^' + pattern + '(?:[?#]|$)', diff --git a/test/ngRoute/routeParamsSpec.js b/test/ngRoute/routeParamsSpec.js index e3357fee8152..6d4f416489f2 100644 --- a/test/ngRoute/routeParamsSpec.js +++ b/test/ngRoute/routeParamsSpec.js @@ -77,5 +77,24 @@ describe('$routeParams', function() { }); }); + it('should correctly extract path params containing hashes and/or question marks', function() { + module(function($routeProvider) { + $routeProvider.when('/foo/:bar', {}); + }); + + inject(function($rootScope, $route, $location, $routeParams) { + $location.path('/foo/bar#baz'); + $rootScope.$digest(); + expect($routeParams).toEqual({bar: 'bar#baz'}); + + $location.path('/foo/bar?baz'); + $rootScope.$digest(); + expect($routeParams).toEqual({bar: 'bar?baz'}); + + $location.path('/foo/bar#baz?qux'); + $rootScope.$digest(); + expect($routeParams).toEqual({bar: 'bar#baz?qux'}); + }); + }); });