rails-angularjs 1.4.9 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/rails-angularjs/version.rb +1 -1
  4. data/vendor/assets/javascripts/angular-animate.js +296 -48
  5. data/vendor/assets/javascripts/angular-animate.min.js +52 -51
  6. data/vendor/assets/javascripts/angular-animate.min.js.map +3 -3
  7. data/vendor/assets/javascripts/angular-aria.js +51 -51
  8. data/vendor/assets/javascripts/angular-aria.min.js +10 -10
  9. data/vendor/assets/javascripts/angular-aria.min.js.map +2 -2
  10. data/vendor/assets/javascripts/angular-cookies.js +9 -8
  11. data/vendor/assets/javascripts/angular-cookies.min.js +2 -2
  12. data/vendor/assets/javascripts/angular-cookies.min.js.map +1 -1
  13. data/vendor/assets/javascripts/angular-loader.js +16 -3
  14. data/vendor/assets/javascripts/angular-loader.min.js +5 -5
  15. data/vendor/assets/javascripts/angular-loader.min.js.map +2 -2
  16. data/vendor/assets/javascripts/angular-message-format.js +2 -2
  17. data/vendor/assets/javascripts/angular-message-format.min.js +2 -2
  18. data/vendor/assets/javascripts/angular-messages.js +7 -5
  19. data/vendor/assets/javascripts/angular-messages.min.js +8 -8
  20. data/vendor/assets/javascripts/angular-messages.min.js.map +2 -2
  21. data/vendor/assets/javascripts/angular-mocks.js +323 -30
  22. data/vendor/assets/javascripts/angular-resource.js +116 -42
  23. data/vendor/assets/javascripts/angular-resource.min.js +11 -10
  24. data/vendor/assets/javascripts/angular-resource.min.js.map +3 -3
  25. data/vendor/assets/javascripts/angular-route.js +36 -11
  26. data/vendor/assets/javascripts/angular-route.min.js +11 -11
  27. data/vendor/assets/javascripts/angular-route.min.js.map +2 -2
  28. data/vendor/assets/javascripts/angular-sanitize.js +280 -246
  29. data/vendor/assets/javascripts/angular-sanitize.min.js +11 -12
  30. data/vendor/assets/javascripts/angular-sanitize.min.js.map +3 -3
  31. data/vendor/assets/javascripts/angular-scenario.js +1227 -456
  32. data/vendor/assets/javascripts/angular-touch.js +114 -12
  33. data/vendor/assets/javascripts/angular-touch.min.js +10 -9
  34. data/vendor/assets/javascripts/angular-touch.min.js.map +3 -3
  35. data/vendor/assets/javascripts/angular.js +1227 -456
  36. data/vendor/assets/javascripts/angular.min.js +302 -293
  37. data/vendor/assets/javascripts/angular.min.js.map +3 -3
  38. metadata +1 -1
@@ -1,10 +1,10 @@
1
1
  /*
2
- AngularJS v1.4.9
3
- (c) 2010-2015 Google, Inc. http://angularjs.org
2
+ AngularJS v1.5.0
3
+ (c) 2010-2016 Google, Inc. http://angularjs.org
4
4
  License: MIT
5
5
  */
6
- (function(){'use strict';function d(b){return function(){var a=arguments[0],e;e="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.4.9/"+(b?b+"/":"")+a;for(a=1;a<arguments.length;a++){e=e+(1==a?"?":"&")+"p"+(a-1)+"=";var d=encodeURIComponent,c;c=arguments[a];c="function"==typeof c?c.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof c?"undefined":"string"!=typeof c?JSON.stringify(c):c;e+=d(c)}return Error(e)}}(function(b){function a(c,a,b){return c[a]||(c[a]=b())}var e=d("$injector"),n=d("ng");
6
+ (function(){'use strict';function d(b){return function(){var a=arguments[0],e;e="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.5.0/"+(b?b+"/":"")+a;for(a=1;a<arguments.length;a++){e=e+(1==a?"?":"&")+"p"+(a-1)+"=";var d=encodeURIComponent,c;c=arguments[a];c="function"==typeof c?c.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof c?"undefined":"string"!=typeof c?JSON.stringify(c):c;e+=d(c)}return Error(e)}}(function(b){function a(c,a,b){return c[a]||(c[a]=b())}var e=d("$injector"),n=d("ng");
7
7
  b=a(b,"angular",Object);b.$$minErr=b.$$minErr||d;return a(b,"module",function(){var c={};return function(b,d,h){if("hasOwnProperty"===b)throw n("badname","module");d&&c.hasOwnProperty(b)&&(c[b]=null);return a(c,b,function(){function c(a,b,d,e){e||(e=f);return function(){e[d||"push"]([a,b,arguments]);return g}}function a(c,e){return function(a,d){d&&"function"===typeof d&&(d.$$moduleName=b);f.push([c,e,arguments]);return g}}if(!d)throw e("nomod",b);var f=[],k=[],l=[],m=c("$injector","invoke","push",
8
- k),g={_invokeQueue:f,_configBlocks:k,_runBlocks:l,requires:d,name:b,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:c("$provide","value"),constant:c("$provide","constant","unshift"),decorator:a("$provide","decorator"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:m,run:function(a){l.push(a);return this}};h&&m(h);
9
- return g})}})})(window)})(window);
8
+ k),g={_invokeQueue:f,_configBlocks:k,_runBlocks:l,requires:d,name:b,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:c("$provide","value"),constant:c("$provide","constant","unshift"),decorator:a("$provide","decorator"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),component:a("$compileProvider","component"),config:m,run:function(a){l.push(a);
9
+ return this}};h&&m(h);return g})}})})(window)})(window);
10
10
  //# sourceMappingURL=angular-loader.min.js.map
@@ -2,7 +2,7 @@
2
2
  "version":3,
3
3
  "file":"angular-loader.min.js",
4
4
  "lineCount":9,
5
- "mappings":"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",
5
+ "mappings":"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",
6
6
  "sources":["angular-loader.js"],
7
- "names":["minErr","setupModuleLoader","window","ensure","obj","name","factory","$injectorMinErr","ngMinErr","angular","Object","$$minErr","modules","module","requires","configFn","context","hasOwnProperty","invokeLater","provider","method","insertMethod","queue","invokeQueue","arguments","moduleInstance","invokeLaterAndSetModuleName","recipeName","factoryFunction","$$moduleName","push","configBlocks","runBlocks","config","_invokeQueue","_configBlocks","_runBlocks","service","value","constant","decorator","animation","filter","controller","directive","run","block"]
7
+ "names":["minErr","setupModuleLoader","window","ensure","obj","name","factory","$injectorMinErr","ngMinErr","angular","Object","$$minErr","modules","module","requires","configFn","context","hasOwnProperty","invokeLater","provider","method","insertMethod","queue","invokeQueue","arguments","moduleInstance","invokeLaterAndSetModuleName","recipeName","factoryFunction","$$moduleName","push","configBlocks","runBlocks","config","_invokeQueue","_configBlocks","_runBlocks","service","value","constant","decorator","animation","filter","controller","directive","component","run","block"]
8
8
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @license AngularJS v1.4.9
3
- * (c) 2010-2015 Google, Inc. http://angularjs.org
2
+ * @license AngularJS v1.5.0
3
+ * (c) 2010-2016 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
6
6
  (function(window, angular, undefined) {'use strict';
@@ -1,6 +1,6 @@
1
1
  /*
2
- AngularJS v1.4.9
3
- (c) 2010-2015 Google, Inc. http://angularjs.org
2
+ AngularJS v1.5.0
3
+ (c) 2010-2016 Google, Inc. http://angularjs.org
4
4
  License: MIT
5
5
  */
6
6
  (function(h){'use strict';function C(a){if(null==a)return"";switch(typeof a){case "string":return a;case "number":return""+a;default:return D(a)}}function f(a,b){for(var d=a.split(/\n/g),k=0;k<d.length;k++){var c=d[k];if(b>=c.length)b-=c.length;else return{h:k+1,f:b+1}}}function t(a){function b(){return a}var d=u[a];if(null!=d)return d;b.$$watchDelegate=function(b,d,c){var e=b.$watch(v,function(){m(d)&&d.call(null,a,a,b);e()},c);return e};u[a]=b;b.exp=a;b.expressions=[];return b}function F(a,b){function d(a){return void 0==
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @license AngularJS v1.4.9
3
- * (c) 2010-2015 Google, Inc. http://angularjs.org
2
+ * @license AngularJS v1.5.0
3
+ * (c) 2010-2016 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
6
6
  (function(window, angular, undefined) {'use strict';
@@ -570,13 +570,14 @@ angular.module('ngMessages', [])
570
570
  *
571
571
  * @param {expression} ngMessage|when a string value corresponding to the message key.
572
572
  */
573
- .directive('ngMessage', ngMessageDirectiveFactory('AE'))
573
+ .directive('ngMessage', ngMessageDirectiveFactory())
574
574
 
575
575
 
576
576
  /**
577
577
  * @ngdoc directive
578
578
  * @name ngMessageExp
579
579
  * @restrict AE
580
+ * @priority 1
580
581
  * @scope
581
582
  *
582
583
  * @description
@@ -602,13 +603,14 @@ angular.module('ngMessages', [])
602
603
  *
603
604
  * @param {expression} ngMessageExp|whenExp an expression value corresponding to the message key.
604
605
  */
605
- .directive('ngMessageExp', ngMessageDirectiveFactory('A'));
606
+ .directive('ngMessageExp', ngMessageDirectiveFactory());
606
607
 
607
- function ngMessageDirectiveFactory(restrict) {
608
+ function ngMessageDirectiveFactory() {
608
609
  return ['$animate', function($animate) {
609
610
  return {
610
611
  restrict: 'AE',
611
612
  transclude: 'element',
613
+ priority: 1, // must run before ngBind, otherwise the text is set on the comment
612
614
  terminal: true,
613
615
  require: '^^ngMessages',
614
616
  link: function(scope, element, attrs, ngMessagesCtrl, $transclude) {
@@ -1,12 +1,12 @@
1
1
  /*
2
- AngularJS v1.4.9
3
- (c) 2010-2015 Google, Inc. http://angularjs.org
2
+ AngularJS v1.5.0
3
+ (c) 2010-2016 Google, Inc. http://angularjs.org
4
4
  License: MIT
5
5
  */
6
- (function(z,h,A){'use strict';function m(h){return["$animate",function(r){return{restrict:"AE",transclude:"element",terminal:!0,require:"^^ngMessages",link:function(n,f,a,g,l){var c=f[0],p,h=a.ngMessage||a.when;a=a.ngMessageExp||a.whenExp;var k=function(b){p=b?v(b)?b:b.split(/[\s,]+/):null;g.reRender()};a?(k(n.$eval(a)),n.$watchCollection(a,k)):k(h);var e,q;g.register(c,q={test:function(b){var a=p;b=a?v(a)?0<=a.indexOf(b):a.hasOwnProperty(b):void 0;return b},attach:function(){e||l(n,function(b){r.enter(b,
7
- null,f);e=b;var a=e.$$attachId=g.getAttachId();e.on("$destroy",function(){e&&e.$$attachId===a&&(g.deregister(c),q.detach())})})},detach:function(){if(e){var b=e;e=null;r.leave(b)}}})}}}]}var v=h.isArray,w=h.forEach,x=h.isString,y=h.element;h.module("ngMessages",[]).directive("ngMessages",["$animate",function(h){function r(f,a){return x(a)&&0===a.length||n(f.$eval(a))}function n(f){return x(f)?f.length:!!f}return{require:"ngMessages",restrict:"AE",controller:["$element","$scope","$attrs",function(f,
8
- a,g){function l(b,a){for(var d=a,f=[];d&&d!==b;){var c=d.$$ngMessageNode;if(c&&c.length)return k[c];d.childNodes.length&&-1==f.indexOf(d)?(f.push(d),d=d.childNodes[d.childNodes.length-1]):d=d.previousSibling||d.parentNode}}var c=this,p=0,m=0;this.getAttachId=function(){return m++};var k=this.messages={},e,q;this.render=function(b){b=b||{};e=!1;q=b;for(var p=r(a,g.ngMessagesMultiple)||r(a,g.multiple),d=[],k={},s=c.head,l=!1,m=0;null!=s;){m++;var t=s.message,u=!1;l||w(b,function(a,b){!u&&n(a)&&t.test(b)&&
9
- !k[b]&&(u=k[b]=!0,t.attach())});u?l=!p:d.push(t);s=s.next}w(d,function(b){b.detach()});d.length!==m?h.setClass(f,"ng-active","ng-inactive"):h.setClass(f,"ng-inactive","ng-active")};a.$watchCollection(g.ngMessages||g["for"],c.render);this.reRender=function(){e||(e=!0,a.$evalAsync(function(){e&&q&&c.render(q)}))};this.register=function(b,a){var d=p.toString();k[d]={message:a};var e=f[0],g=k[d];c.head?(e=l(e,b))?(g.next=e.next,e.next=g):(g.next=c.head,c.head=g):c.head=g;b.$$ngMessageNode=d;p++;c.reRender()};
10
- this.deregister=function(b){var a=b.$$ngMessageNode;delete b.$$ngMessageNode;var d=k[a];(b=l(f[0],b))?b.next=d.next:c.head=d.next;delete k[a];c.reRender()}}]}}]).directive("ngMessagesInclude",["$templateRequest","$document","$compile",function(h,m,n){return{restrict:"AE",require:"^^ngMessages",link:function(f,a,g){var l=g.ngMessagesInclude||g.src;h(l).then(function(c){n(c)(f,function(c){a.after(c);c=y(m[0].createComment(" ngMessagesInclude: "+l+" "));a.after(c);a.remove()})})}}}]).directive("ngMessage",
11
- m("AE")).directive("ngMessageExp",m("A"))})(window,window.angular);
6
+ (function(A,d,B){'use strict';function l(){return["$animate",function(v){return{restrict:"AE",transclude:"element",priority:1,terminal:!0,require:"^^ngMessages",link:function(n,r,a,b,m){var k=r[0],f,p=a.ngMessage||a.when;a=a.ngMessageExp||a.whenExp;var d=function(a){f=a?w(a)?a:a.split(/[\s,]+/):null;b.reRender()};a?(d(n.$eval(a)),n.$watchCollection(a,d)):d(p);var e,q;b.register(k,q={test:function(a){var g=f;a=g?w(g)?0<=g.indexOf(a):g.hasOwnProperty(a):void 0;return a},attach:function(){e||m(n,function(a){v.enter(a,
7
+ null,r);e=a;var g=e.$$attachId=b.getAttachId();e.on("$destroy",function(){e&&e.$$attachId===g&&(b.deregister(k),q.detach())})})},detach:function(){if(e){var a=e;e=null;v.leave(a)}}})}}}]}var w=d.isArray,x=d.forEach,y=d.isString,z=d.element;d.module("ngMessages",[]).directive("ngMessages",["$animate",function(d){function n(a,b){return y(b)&&0===b.length||r(a.$eval(b))}function r(a){return y(a)?a.length:!!a}return{require:"ngMessages",restrict:"AE",controller:["$element","$scope","$attrs",function(a,
8
+ b,m){function k(a,b){for(var c=b,f=[];c&&c!==a;){var h=c.$$ngMessageNode;if(h&&h.length)return e[h];c.childNodes.length&&-1==f.indexOf(c)?(f.push(c),c=c.childNodes[c.childNodes.length-1]):c=c.previousSibling||c.parentNode}}var f=this,p=0,l=0;this.getAttachId=function(){return l++};var e=this.messages={},q,s;this.render=function(g){g=g||{};q=!1;s=g;for(var e=n(b,m.ngMessagesMultiple)||n(b,m.multiple),c=[],k={},h=f.head,p=!1,l=0;null!=h;){l++;var t=h.message,u=!1;p||x(g,function(a,c){!u&&r(a)&&t.test(c)&&
9
+ !k[c]&&(u=k[c]=!0,t.attach())});u?p=!e:c.push(t);h=h.next}x(c,function(a){a.detach()});c.length!==l?d.setClass(a,"ng-active","ng-inactive"):d.setClass(a,"ng-inactive","ng-active")};b.$watchCollection(m.ngMessages||m["for"],f.render);this.reRender=function(){q||(q=!0,b.$evalAsync(function(){q&&s&&f.render(s)}))};this.register=function(g,b){var c=p.toString();e[c]={message:b};var d=a[0],h=e[c];f.head?(d=k(d,g))?(h.next=d.next,d.next=h):(h.next=f.head,f.head=h):f.head=h;g.$$ngMessageNode=c;p++;f.reRender()};
10
+ this.deregister=function(b){var d=b.$$ngMessageNode;delete b.$$ngMessageNode;var c=e[d];(b=k(a[0],b))?b.next=c.next:f.head=c.next;delete e[d];f.reRender()}}]}}]).directive("ngMessagesInclude",["$templateRequest","$document","$compile",function(d,n,l){return{restrict:"AE",require:"^^ngMessages",link:function(a,b,m){var k=m.ngMessagesInclude||m.src;d(k).then(function(d){l(d)(a,function(a){b.after(a);a=z(n[0].createComment(" ngMessagesInclude: "+k+" "));b.after(a);b.remove()})})}}}]).directive("ngMessage",
11
+ l()).directive("ngMessageExp",l())})(window,window.angular);
12
12
  //# sourceMappingURL=angular-messages.min.js.map
@@ -2,7 +2,7 @@
2
2
  "version":3,
3
3
  "file":"angular-messages.min.js",
4
4
  "lineCount":11,
5
- "mappings":"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",
5
+ "mappings":"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",
6
6
  "sources":["angular-messages.js"],
7
- "names":["window","angular","undefined","ngMessageDirectiveFactory","restrict","$animate","transclude","terminal","require","link","scope","element","attrs","ngMessagesCtrl","$transclude","commentNode","records","staticExp","ngMessage","when","dynamicExp","ngMessageExp","whenExp","assignRecords","items","isArray","split","reRender","$eval","$watchCollection","currentElement","messageCtrl","register","test","name","collection","indexOf","hasOwnProperty","attach","elm","enter","$$attachId","getAttachId","on","deregister","detach","leave","forEach","isString","jqLite","module","directive","isAttrTruthy","attr","length","truthy","val","controller","$element","$scope","$attrs","findPreviousMessage","parent","comment","prevNode","parentLookup","prevKey","$$ngMessageNode","messages","childNodes","push","previousSibling","parentNode","ctrl","latestKey","nextAttachId","this.getAttachId","renderLater","cachedCollection","render","this.render","multiple","ngMessagesMultiple","unmatchedMessages","matchedKeys","messageItem","head","messageFound","totalMessages","message","messageUsed","value","key","next","setClass","ACTIVE_CLASS","INACTIVE_CLASS","ngMessages","this.reRender","$evalAsync","this.register","nextKey","toString","messageNode","match","this.deregister","$templateRequest","$document","$compile","src","ngMessagesInclude","then","html","contents","after","anchor","createComment","remove"]
7
+ "names":["window","angular","undefined","ngMessageDirectiveFactory","$animate","restrict","transclude","priority","terminal","require","link","scope","element","attrs","ngMessagesCtrl","$transclude","commentNode","records","staticExp","ngMessage","when","dynamicExp","ngMessageExp","whenExp","assignRecords","items","isArray","split","reRender","$eval","$watchCollection","currentElement","messageCtrl","register","test","name","collection","indexOf","hasOwnProperty","attach","elm","enter","$$attachId","getAttachId","on","deregister","detach","leave","forEach","isString","jqLite","module","directive","isAttrTruthy","attr","length","truthy","val","controller","$element","$scope","$attrs","findPreviousMessage","parent","comment","prevNode","parentLookup","prevKey","$$ngMessageNode","messages","childNodes","push","previousSibling","parentNode","ctrl","latestKey","nextAttachId","this.getAttachId","renderLater","cachedCollection","render","this.render","multiple","ngMessagesMultiple","unmatchedMessages","matchedKeys","messageItem","head","messageFound","totalMessages","message","messageUsed","value","key","next","setClass","ACTIVE_CLASS","INACTIVE_CLASS","ngMessages","this.reRender","$evalAsync","this.register","nextKey","toString","messageNode","match","this.deregister","$templateRequest","$document","$compile","src","ngMessagesInclude","then","html","contents","after","anchor","createComment","remove"]
8
8
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @license AngularJS v1.4.9
3
- * (c) 2010-2015 Google, Inc. http://angularjs.org
2
+ * @license AngularJS v1.5.0
3
+ * (c) 2010-2016 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
6
6
  (function(window, angular, undefined) {
@@ -1028,7 +1028,7 @@ angular.mock.dump = function(object) {
1028
1028
  * - `$httpBackend.when` - specifies a backend definition
1029
1029
  *
1030
1030
  *
1031
- * # Request Expectations vs Backend Definitions
1031
+ * ## Request Expectations vs Backend Definitions
1032
1032
  *
1033
1033
  * Request expectations provide a way to make assertions about requests made by the application and
1034
1034
  * to define responses for those requests. The test will fail if the expected requests are not made
@@ -1084,7 +1084,7 @@ angular.mock.dump = function(object) {
1084
1084
  * the request. The response from the first matched definition is returned.
1085
1085
  *
1086
1086
  *
1087
- * # Flushing HTTP requests
1087
+ * ## Flushing HTTP requests
1088
1088
  *
1089
1089
  * The $httpBackend used in production always responds to requests asynchronously. If we preserved
1090
1090
  * this behavior in unit testing, we'd have to create async unit tests, which are hard to write,
@@ -1094,7 +1094,7 @@ angular.mock.dump = function(object) {
1094
1094
  * the async api of the backend, while allowing the test to execute synchronously.
1095
1095
  *
1096
1096
  *
1097
- * # Unit testing with mock $httpBackend
1097
+ * ## Unit testing with mock $httpBackend
1098
1098
  * The following code shows how to setup and use the mock backend when unit testing a controller.
1099
1099
  * First we create the controller under test:
1100
1100
  *
@@ -1108,18 +1108,18 @@ angular.mock.dump = function(object) {
1108
1108
  function MyController($scope, $http) {
1109
1109
  var authToken;
1110
1110
 
1111
- $http.get('/auth.py').success(function(data, status, headers) {
1112
- authToken = headers('A-Token');
1113
- $scope.user = data;
1111
+ $http.get('/auth.py').then(function(response) {
1112
+ authToken = response.headers('A-Token');
1113
+ $scope.user = response.data;
1114
1114
  });
1115
1115
 
1116
1116
  $scope.saveMessage = function(message) {
1117
1117
  var headers = { 'Authorization': authToken };
1118
1118
  $scope.status = 'Saving...';
1119
1119
 
1120
- $http.post('/add-msg.py', message, { headers: headers } ).success(function(response) {
1120
+ $http.post('/add-msg.py', message, { headers: headers } ).then(function(response) {
1121
1121
  $scope.status = '';
1122
- }).error(function() {
1122
+ }).catch(function() {
1123
1123
  $scope.status = 'Failed...';
1124
1124
  });
1125
1125
  };
@@ -1210,7 +1210,87 @@ angular.mock.dump = function(object) {
1210
1210
  $httpBackend.flush();
1211
1211
  });
1212
1212
  });
1213
- ```
1213
+ ```
1214
+ *
1215
+ * ## Dynamic responses
1216
+ *
1217
+ * You define a response to a request by chaining a call to `respond()` onto a definition or expectation.
1218
+ * If you provide a **callback** as the first parameter to `respond(callback)` then you can dynamically generate
1219
+ * a response based on the properties of the request.
1220
+ *
1221
+ * The `callback` function should be of the form `function(method, url, data, headers, params)`.
1222
+ *
1223
+ * ### Query parameters
1224
+ *
1225
+ * By default, query parameters on request URLs are parsed into the `params` object. So a request URL
1226
+ * of `/list?q=searchstr&orderby=-name` would set `params` to be `{q: 'searchstr', orderby: '-name'}`.
1227
+ *
1228
+ * ### Regex parameter matching
1229
+ *
1230
+ * If an expectation or definition uses a **regex** to match the URL, you can provide an array of **keys** via a
1231
+ * `params` argument. The index of each **key** in the array will match the index of a **group** in the
1232
+ * **regex**.
1233
+ *
1234
+ * The `params` object in the **callback** will now have properties with these keys, which hold the value of the
1235
+ * corresponding **group** in the **regex**.
1236
+ *
1237
+ * This also applies to the `when` and `expect` shortcut methods.
1238
+ *
1239
+ *
1240
+ * ```js
1241
+ * $httpBackend.expect('GET', /\/user\/(.+)/, undefined, undefined, ['id'])
1242
+ * .respond(function(method, url, data, headers, params) {
1243
+ * // for requested url of '/user/1234' params is {id: '1234'}
1244
+ * });
1245
+ *
1246
+ * $httpBackend.whenPATCH(/\/user\/(.+)\/article\/(.+)/, undefined, undefined, ['user', 'article'])
1247
+ * .respond(function(method, url, data, headers, params) {
1248
+ * // for url of '/user/1234/article/567' params is {user: '1234', article: '567'}
1249
+ * });
1250
+ * ```
1251
+ *
1252
+ * ## Matching route requests
1253
+ *
1254
+ * For extra convenience, `whenRoute` and `expectRoute` shortcuts are available. These methods offer colon
1255
+ * delimited matching of the url path, ignoring the query string. This allows declarations
1256
+ * similar to how application routes are configured with `$routeProvider`. Because these methods convert
1257
+ * the definition url to regex, declaration order is important. Combined with query parameter parsing,
1258
+ * the following is possible:
1259
+ *
1260
+ ```js
1261
+ $httpBackend.whenRoute('GET', '/users/:id')
1262
+ .respond(function(method, url, data, headers, params) {
1263
+ return [200, MockUserList[Number(params.id)]];
1264
+ });
1265
+
1266
+ $httpBackend.whenRoute('GET', '/users')
1267
+ .respond(function(method, url, data, headers, params) {
1268
+ var userList = angular.copy(MockUserList),
1269
+ defaultSort = 'lastName',
1270
+ count, pages, isPrevious, isNext;
1271
+
1272
+ // paged api response '/v1/users?page=2'
1273
+ params.page = Number(params.page) || 1;
1274
+
1275
+ // query for last names '/v1/users?q=Archer'
1276
+ if (params.q) {
1277
+ userList = $filter('filter')({lastName: params.q});
1278
+ }
1279
+
1280
+ pages = Math.ceil(userList.length / pagingLength);
1281
+ isPrevious = params.page > 1;
1282
+ isNext = params.page < pages;
1283
+
1284
+ return [200, {
1285
+ count: userList.length,
1286
+ previous: isPrevious,
1287
+ next: isNext,
1288
+ // sort field -> '/v1/users?sortBy=firstName'
1289
+ results: $filter('orderBy')(userList, params.sortBy || defaultSort)
1290
+ .splice((params.page - 1) * pagingLength, pagingLength)
1291
+ }];
1292
+ });
1293
+ ```
1214
1294
  */
1215
1295
  angular.mock.$HttpBackendProvider = function() {
1216
1296
  this.$get = ['$rootScope', '$timeout', createHttpBackendMock];
@@ -1267,7 +1347,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1267
1347
  return handleResponse;
1268
1348
 
1269
1349
  function handleResponse() {
1270
- var response = wrapped.response(method, url, data, headers);
1350
+ var response = wrapped.response(method, url, data, headers, wrapped.params(url));
1271
1351
  xhr.$$respHeaders = response[2];
1272
1352
  callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(),
1273
1353
  copy(response[3] || ''));
@@ -1336,20 +1416,21 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1336
1416
  * data string and returns true if the data is as expected.
1337
1417
  * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
1338
1418
  * object and returns true if the headers match the current definition.
1419
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1339
1420
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1340
1421
  * request is handled. You can save this object for later use and invoke `respond` again in
1341
1422
  * order to change how a matched request is handled.
1342
1423
  *
1343
1424
  * - respond –
1344
1425
  * `{function([status,] data[, headers, statusText])
1345
- * | function(function(method, url, data, headers)}`
1426
+ * | function(function(method, url, data, headers, params)}`
1346
1427
  * – The respond method takes a set of static data to be returned or a function that can
1347
1428
  * return an array containing response status (number), response data (string), response
1348
1429
  * headers (Object), and the text for the status (string). The respond method returns the
1349
1430
  * `requestHandler` object for possible overrides.
1350
1431
  */
1351
- $httpBackend.when = function(method, url, data, headers) {
1352
- var definition = new MockHttpExpectation(method, url, data, headers),
1432
+ $httpBackend.when = function(method, url, data, headers, keys) {
1433
+ var definition = new MockHttpExpectation(method, url, data, headers, keys),
1353
1434
  chain = {
1354
1435
  respond: function(status, data, headers, statusText) {
1355
1436
  definition.passThrough = undefined;
@@ -1379,6 +1460,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1379
1460
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
1380
1461
  * and returns true if the url matches the current definition.
1381
1462
  * @param {(Object|function(Object))=} headers HTTP headers.
1463
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1382
1464
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1383
1465
  * request is handled. You can save this object for later use and invoke `respond` again in
1384
1466
  * order to change how a matched request is handled.
@@ -1393,6 +1475,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1393
1475
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
1394
1476
  * and returns true if the url matches the current definition.
1395
1477
  * @param {(Object|function(Object))=} headers HTTP headers.
1478
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1396
1479
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1397
1480
  * request is handled. You can save this object for later use and invoke `respond` again in
1398
1481
  * order to change how a matched request is handled.
@@ -1407,6 +1490,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1407
1490
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
1408
1491
  * and returns true if the url matches the current definition.
1409
1492
  * @param {(Object|function(Object))=} headers HTTP headers.
1493
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1410
1494
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1411
1495
  * request is handled. You can save this object for later use and invoke `respond` again in
1412
1496
  * order to change how a matched request is handled.
@@ -1423,6 +1507,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1423
1507
  * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
1424
1508
  * data string and returns true if the data is as expected.
1425
1509
  * @param {(Object|function(Object))=} headers HTTP headers.
1510
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1426
1511
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1427
1512
  * request is handled. You can save this object for later use and invoke `respond` again in
1428
1513
  * order to change how a matched request is handled.
@@ -1439,6 +1524,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1439
1524
  * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
1440
1525
  * data string and returns true if the data is as expected.
1441
1526
  * @param {(Object|function(Object))=} headers HTTP headers.
1527
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1442
1528
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1443
1529
  * request is handled. You can save this object for later use and invoke `respond` again in
1444
1530
  * order to change how a matched request is handled.
@@ -1452,12 +1538,59 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1452
1538
  *
1453
1539
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
1454
1540
  * and returns true if the url matches the current definition.
1541
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1455
1542
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1456
1543
  * request is handled. You can save this object for later use and invoke `respond` again in
1457
1544
  * order to change how a matched request is handled.
1458
1545
  */
1459
1546
  createShortMethods('when');
1460
1547
 
1548
+ /**
1549
+ * @ngdoc method
1550
+ * @name $httpBackend#whenRoute
1551
+ * @description
1552
+ * Creates a new backend definition that compares only with the requested route.
1553
+ *
1554
+ * @param {string} method HTTP method.
1555
+ * @param {string} url HTTP url string that supports colon param matching.
1556
+ * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1557
+ * request is handled. You can save this object for later use and invoke `respond` again in
1558
+ * order to change how a matched request is handled. See #when for more info.
1559
+ */
1560
+ $httpBackend.whenRoute = function(method, url) {
1561
+ var pathObj = parseRoute(url);
1562
+ return $httpBackend.when(method, pathObj.regexp, undefined, undefined, pathObj.keys);
1563
+ };
1564
+
1565
+ function parseRoute(url) {
1566
+ var ret = {
1567
+ regexp: url
1568
+ },
1569
+ keys = ret.keys = [];
1570
+
1571
+ if (!url || !angular.isString(url)) return ret;
1572
+
1573
+ url = url
1574
+ .replace(/([().])/g, '\\$1')
1575
+ .replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option) {
1576
+ var optional = option === '?' ? option : null;
1577
+ var star = option === '*' ? option : null;
1578
+ keys.push({ name: key, optional: !!optional });
1579
+ slash = slash || '';
1580
+ return ''
1581
+ + (optional ? '' : slash)
1582
+ + '(?:'
1583
+ + (optional ? slash : '')
1584
+ + (star && '(.+?)' || '([^/]+)')
1585
+ + (optional || '')
1586
+ + ')'
1587
+ + (optional || '');
1588
+ })
1589
+ .replace(/([\/$\*])/g, '\\$1');
1590
+
1591
+ ret.regexp = new RegExp('^' + url, 'i');
1592
+ return ret;
1593
+ }
1461
1594
 
1462
1595
  /**
1463
1596
  * @ngdoc method
@@ -1473,20 +1606,21 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1473
1606
  * is in JSON format.
1474
1607
  * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
1475
1608
  * object and returns true if the headers match the current expectation.
1609
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1476
1610
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1477
1611
  * request is handled. You can save this object for later use and invoke `respond` again in
1478
1612
  * order to change how a matched request is handled.
1479
1613
  *
1480
1614
  * - respond –
1481
1615
  * `{function([status,] data[, headers, statusText])
1482
- * | function(function(method, url, data, headers)}`
1616
+ * | function(function(method, url, data, headers, params)}`
1483
1617
  * – The respond method takes a set of static data to be returned or a function that can
1484
1618
  * return an array containing response status (number), response data (string), response
1485
1619
  * headers (Object), and the text for the status (string). The respond method returns the
1486
1620
  * `requestHandler` object for possible overrides.
1487
1621
  */
1488
- $httpBackend.expect = function(method, url, data, headers) {
1489
- var expectation = new MockHttpExpectation(method, url, data, headers),
1622
+ $httpBackend.expect = function(method, url, data, headers, keys) {
1623
+ var expectation = new MockHttpExpectation(method, url, data, headers, keys),
1490
1624
  chain = {
1491
1625
  respond: function(status, data, headers, statusText) {
1492
1626
  expectation.response = createResponse(status, data, headers, statusText);
@@ -1498,7 +1632,6 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1498
1632
  return chain;
1499
1633
  };
1500
1634
 
1501
-
1502
1635
  /**
1503
1636
  * @ngdoc method
1504
1637
  * @name $httpBackend#expectGET
@@ -1508,6 +1641,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1508
1641
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
1509
1642
  * and returns true if the url matches the current definition.
1510
1643
  * @param {Object=} headers HTTP headers.
1644
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1511
1645
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1512
1646
  * request is handled. You can save this object for later use and invoke `respond` again in
1513
1647
  * order to change how a matched request is handled. See #expect for more info.
@@ -1522,6 +1656,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1522
1656
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
1523
1657
  * and returns true if the url matches the current definition.
1524
1658
  * @param {Object=} headers HTTP headers.
1659
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1525
1660
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1526
1661
  * request is handled. You can save this object for later use and invoke `respond` again in
1527
1662
  * order to change how a matched request is handled.
@@ -1536,6 +1671,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1536
1671
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
1537
1672
  * and returns true if the url matches the current definition.
1538
1673
  * @param {Object=} headers HTTP headers.
1674
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1539
1675
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1540
1676
  * request is handled. You can save this object for later use and invoke `respond` again in
1541
1677
  * order to change how a matched request is handled.
@@ -1553,6 +1689,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1553
1689
  * receives data string and returns true if the data is as expected, or Object if request body
1554
1690
  * is in JSON format.
1555
1691
  * @param {Object=} headers HTTP headers.
1692
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1556
1693
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1557
1694
  * request is handled. You can save this object for later use and invoke `respond` again in
1558
1695
  * order to change how a matched request is handled.
@@ -1570,6 +1707,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1570
1707
  * receives data string and returns true if the data is as expected, or Object if request body
1571
1708
  * is in JSON format.
1572
1709
  * @param {Object=} headers HTTP headers.
1710
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1573
1711
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1574
1712
  * request is handled. You can save this object for later use and invoke `respond` again in
1575
1713
  * order to change how a matched request is handled.
@@ -1587,6 +1725,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1587
1725
  * receives data string and returns true if the data is as expected, or Object if request body
1588
1726
  * is in JSON format.
1589
1727
  * @param {Object=} headers HTTP headers.
1728
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1590
1729
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1591
1730
  * request is handled. You can save this object for later use and invoke `respond` again in
1592
1731
  * order to change how a matched request is handled.
@@ -1600,12 +1739,30 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1600
1739
  *
1601
1740
  * @param {string|RegExp|function(string)} url HTTP url or function that receives an url
1602
1741
  * and returns true if the url matches the current definition.
1742
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
1603
1743
  * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1604
1744
  * request is handled. You can save this object for later use and invoke `respond` again in
1605
1745
  * order to change how a matched request is handled.
1606
1746
  */
1607
1747
  createShortMethods('expect');
1608
1748
 
1749
+ /**
1750
+ * @ngdoc method
1751
+ * @name $httpBackend#expectRoute
1752
+ * @description
1753
+ * Creates a new request expectation that compares only with the requested route.
1754
+ *
1755
+ * @param {string} method HTTP method.
1756
+ * @param {string} url HTTP url string that supports colon param matching.
1757
+ * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
1758
+ * request is handled. You can save this object for later use and invoke `respond` again in
1759
+ * order to change how a matched request is handled. See #expect for more info.
1760
+ */
1761
+ $httpBackend.expectRoute = function(method, url) {
1762
+ var pathObj = parseRoute(url);
1763
+ return $httpBackend.expect(method, pathObj.regexp, undefined, undefined, pathObj.keys);
1764
+ };
1765
+
1609
1766
 
1610
1767
  /**
1611
1768
  * @ngdoc method
@@ -1695,20 +1852,20 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1695
1852
 
1696
1853
  function createShortMethods(prefix) {
1697
1854
  angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {
1698
- $httpBackend[prefix + method] = function(url, headers) {
1699
- return $httpBackend[prefix](method, url, undefined, headers);
1855
+ $httpBackend[prefix + method] = function(url, headers, keys) {
1856
+ return $httpBackend[prefix](method, url, undefined, headers, keys);
1700
1857
  };
1701
1858
  });
1702
1859
 
1703
1860
  angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
1704
- $httpBackend[prefix + method] = function(url, data, headers) {
1705
- return $httpBackend[prefix](method, url, data, headers);
1861
+ $httpBackend[prefix + method] = function(url, data, headers, keys) {
1862
+ return $httpBackend[prefix](method, url, data, headers, keys);
1706
1863
  };
1707
1864
  });
1708
1865
  }
1709
1866
  }
1710
1867
 
1711
- function MockHttpExpectation(method, url, data, headers) {
1868
+ function MockHttpExpectation(method, url, data, headers, keys) {
1712
1869
 
1713
1870
  this.data = data;
1714
1871
  this.headers = headers;
@@ -1747,6 +1904,59 @@ function MockHttpExpectation(method, url, data, headers) {
1747
1904
  this.toString = function() {
1748
1905
  return method + ' ' + url;
1749
1906
  };
1907
+
1908
+ this.params = function(u) {
1909
+ return angular.extend(parseQuery(), pathParams());
1910
+
1911
+ function pathParams() {
1912
+ var keyObj = {};
1913
+ if (!url || !angular.isFunction(url.test) || !keys || keys.length === 0) return keyObj;
1914
+
1915
+ var m = url.exec(u);
1916
+ if (!m) return keyObj;
1917
+ for (var i = 1, len = m.length; i < len; ++i) {
1918
+ var key = keys[i - 1];
1919
+ var val = m[i];
1920
+ if (key && val) {
1921
+ keyObj[key.name || key] = val;
1922
+ }
1923
+ }
1924
+
1925
+ return keyObj;
1926
+ }
1927
+
1928
+ function parseQuery() {
1929
+ var obj = {}, key_value, key,
1930
+ queryStr = u.indexOf('?') > -1
1931
+ ? u.substring(u.indexOf('?') + 1)
1932
+ : "";
1933
+
1934
+ angular.forEach(queryStr.split('&'), function(keyValue) {
1935
+ if (keyValue) {
1936
+ key_value = keyValue.replace(/\+/g,'%20').split('=');
1937
+ key = tryDecodeURIComponent(key_value[0]);
1938
+ if (angular.isDefined(key)) {
1939
+ var val = angular.isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
1940
+ if (!hasOwnProperty.call(obj, key)) {
1941
+ obj[key] = val;
1942
+ } else if (angular.isArray(obj[key])) {
1943
+ obj[key].push(val);
1944
+ } else {
1945
+ obj[key] = [obj[key],val];
1946
+ }
1947
+ }
1948
+ }
1949
+ });
1950
+ return obj;
1951
+ }
1952
+ function tryDecodeURIComponent(value) {
1953
+ try {
1954
+ return decodeURIComponent(value);
1955
+ } catch (e) {
1956
+ // Ignore any invalid uri component
1957
+ }
1958
+ }
1959
+ };
1750
1960
  }
1751
1961
 
1752
1962
  function createMockXhr() {
@@ -1961,6 +2171,49 @@ angular.mock.$ControllerDecorator = ['$delegate', function($delegate) {
1961
2171
  };
1962
2172
  }];
1963
2173
 
2174
+ /**
2175
+ * @ngdoc service
2176
+ * @name $componentController
2177
+ * @description
2178
+ * A service that can be used to create instances of component controllers.
2179
+ * <div class="alert alert-info">
2180
+ * Be aware that the controller will be instantiated and attached to the scope as specified in
2181
+ * the component definition object. That means that you must always provide a `$scope` object
2182
+ * in the `locals` param.
2183
+ * </div>
2184
+ * @param {string} componentName the name of the component whose controller we want to instantiate
2185
+ * @param {Object} locals Injection locals for Controller.
2186
+ * @param {Object=} bindings Properties to add to the controller before invoking the constructor. This is used
2187
+ * to simulate the `bindToController` feature and simplify certain kinds of tests.
2188
+ * @param {string=} ident Override the property name to use when attaching the controller to the scope.
2189
+ * @return {Object} Instance of requested controller.
2190
+ */
2191
+ angular.mock.$ComponentControllerProvider = ['$compileProvider', function($compileProvider) {
2192
+ return {
2193
+ $get: ['$controller','$injector', function($controller,$injector) {
2194
+ return function $componentController(componentName, locals, bindings, ident) {
2195
+ // get all directives associated to the component name
2196
+ var directives = $injector.get(componentName + 'Directive');
2197
+ // look for those directives that are components
2198
+ var candidateDirectives = directives.filter(function(directiveInfo) {
2199
+ // components have controller, controllerAs and restrict:'E'
2200
+ return directiveInfo.controller && directiveInfo.controllerAs && directiveInfo.restrict === 'E';
2201
+ });
2202
+ // check if valid directives found
2203
+ if (candidateDirectives.length === 0) {
2204
+ throw new Error('No component found');
2205
+ }
2206
+ if (candidateDirectives.length > 1) {
2207
+ throw new Error('Too many components found');
2208
+ }
2209
+ // get the info of the component
2210
+ var directiveInfo = candidateDirectives[0];
2211
+ return $controller(directiveInfo.controller, locals, bindings, ident || directiveInfo.controllerAs);
2212
+ };
2213
+ }]
2214
+ };
2215
+ }];
2216
+
1964
2217
 
1965
2218
  /**
1966
2219
  * @ngdoc module
@@ -1984,7 +2237,8 @@ angular.module('ngMock', ['ng']).provider({
1984
2237
  $log: angular.mock.$LogProvider,
1985
2238
  $interval: angular.mock.$IntervalProvider,
1986
2239
  $httpBackend: angular.mock.$HttpBackendProvider,
1987
- $rootElement: angular.mock.$RootElementProvider
2240
+ $rootElement: angular.mock.$RootElementProvider,
2241
+ $componentController: angular.mock.$ComponentControllerProvider
1988
2242
  }).config(['$provide', function($provide) {
1989
2243
  $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
1990
2244
  $provide.decorator('$$rAF', angular.mock.$RAFDecorator);
@@ -2071,13 +2325,15 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2071
2325
  * @param {(string|RegExp)=} data HTTP request body.
2072
2326
  * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
2073
2327
  * object and returns true if the headers match the current definition.
2328
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2329
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2074
2330
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2075
2331
  * control how a matched request is handled. You can save this object for later use and invoke
2076
2332
  * `respond` or `passThrough` again in order to change how a matched request is handled.
2077
2333
  *
2078
2334
  * - respond –
2079
2335
  * `{function([status,] data[, headers, statusText])
2080
- * | function(function(method, url, data, headers)}`
2336
+ * | function(function(method, url, data, headers, params)}`
2081
2337
  * – The respond method takes a set of static data to be returned or a function that can return
2082
2338
  * an array containing response status (number), response data (string), response headers
2083
2339
  * (Object), and the text for the status (string).
@@ -2097,6 +2353,8 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2097
2353
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
2098
2354
  * and returns true if the url matches the current definition.
2099
2355
  * @param {(Object|function(Object))=} headers HTTP headers.
2356
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2357
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2100
2358
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2101
2359
  * control how a matched request is handled. You can save this object for later use and invoke
2102
2360
  * `respond` or `passThrough` again in order to change how a matched request is handled.
@@ -2112,6 +2370,8 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2112
2370
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
2113
2371
  * and returns true if the url matches the current definition.
2114
2372
  * @param {(Object|function(Object))=} headers HTTP headers.
2373
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2374
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2115
2375
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2116
2376
  * control how a matched request is handled. You can save this object for later use and invoke
2117
2377
  * `respond` or `passThrough` again in order to change how a matched request is handled.
@@ -2127,6 +2387,8 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2127
2387
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
2128
2388
  * and returns true if the url matches the current definition.
2129
2389
  * @param {(Object|function(Object))=} headers HTTP headers.
2390
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2391
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2130
2392
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2131
2393
  * control how a matched request is handled. You can save this object for later use and invoke
2132
2394
  * `respond` or `passThrough` again in order to change how a matched request is handled.
@@ -2143,6 +2405,8 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2143
2405
  * and returns true if the url matches the current definition.
2144
2406
  * @param {(string|RegExp)=} data HTTP request body.
2145
2407
  * @param {(Object|function(Object))=} headers HTTP headers.
2408
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2409
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2146
2410
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2147
2411
  * control how a matched request is handled. You can save this object for later use and invoke
2148
2412
  * `respond` or `passThrough` again in order to change how a matched request is handled.
@@ -2159,6 +2423,8 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2159
2423
  * and returns true if the url matches the current definition.
2160
2424
  * @param {(string|RegExp)=} data HTTP request body.
2161
2425
  * @param {(Object|function(Object))=} headers HTTP headers.
2426
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2427
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2162
2428
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2163
2429
  * control how a matched request is handled. You can save this object for later use and invoke
2164
2430
  * `respond` or `passThrough` again in order to change how a matched request is handled.
@@ -2175,6 +2441,8 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2175
2441
  * and returns true if the url matches the current definition.
2176
2442
  * @param {(string|RegExp)=} data HTTP request body.
2177
2443
  * @param {(Object|function(Object))=} headers HTTP headers.
2444
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2445
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2178
2446
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2179
2447
  * control how a matched request is handled. You can save this object for later use and invoke
2180
2448
  * `respond` or `passThrough` again in order to change how a matched request is handled.
@@ -2189,6 +2457,21 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2189
2457
  *
2190
2458
  * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
2191
2459
  * and returns true if the url matches the current definition.
2460
+ * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
2461
+ * {@link ngMock.$httpBackend $httpBackend mock}.
2462
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2463
+ * control how a matched request is handled. You can save this object for later use and invoke
2464
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
2465
+ */
2466
+ /**
2467
+ * @ngdoc method
2468
+ * @name $httpBackend#whenRoute
2469
+ * @module ngMockE2E
2470
+ * @description
2471
+ * Creates a new backend definition that compares only with the requested route.
2472
+ *
2473
+ * @param {string} method HTTP method.
2474
+ * @param {string} url HTTP url string that supports colon param matching.
2192
2475
  * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
2193
2476
  * control how a matched request is handled. You can save this object for later use and invoke
2194
2477
  * `respond` or `passThrough` again in order to change how a matched request is handled.
@@ -2321,10 +2604,12 @@ if (window.jasmine || window.mocha) {
2321
2604
 
2322
2605
  currentSpec.$injector = null;
2323
2606
  currentSpec.$modules = null;
2607
+ currentSpec.$providerInjector = null;
2324
2608
  currentSpec = null;
2325
2609
 
2326
2610
  if (injector) {
2327
2611
  injector.get('$rootElement').off();
2612
+ injector.get('$rootScope').$destroy();
2328
2613
  }
2329
2614
 
2330
2615
  // clean up jquery's fragment cache
@@ -2368,16 +2653,21 @@ if (window.jasmine || window.mocha) {
2368
2653
  if (currentSpec.$injector) {
2369
2654
  throw new Error('Injector already created, can not register a module!');
2370
2655
  } else {
2371
- var modules = currentSpec.$modules || (currentSpec.$modules = []);
2656
+ var fn, modules = currentSpec.$modules || (currentSpec.$modules = []);
2372
2657
  angular.forEach(moduleFns, function(module) {
2373
2658
  if (angular.isObject(module) && !angular.isArray(module)) {
2374
- modules.push(function($provide) {
2659
+ fn = function($provide) {
2375
2660
  angular.forEach(module, function(value, key) {
2376
2661
  $provide.value(key, value);
2377
2662
  });
2378
- });
2663
+ };
2379
2664
  } else {
2380
- modules.push(module);
2665
+ fn = module;
2666
+ }
2667
+ if (currentSpec.$providerInjector) {
2668
+ currentSpec.$providerInjector.invoke(fn);
2669
+ } else {
2670
+ modules.push(fn);
2381
2671
  }
2382
2672
  });
2383
2673
  }
@@ -2491,6 +2781,9 @@ if (window.jasmine || window.mocha) {
2491
2781
  function workFn() {
2492
2782
  var modules = currentSpec.$modules || [];
2493
2783
  var strictDi = !!currentSpec.$injectorStrict;
2784
+ modules.unshift(function($injector) {
2785
+ currentSpec.$providerInjector = $injector;
2786
+ });
2494
2787
  modules.unshift('ngMock');
2495
2788
  modules.unshift('ng');
2496
2789
  var injector = currentSpec.$injector;