aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/content/error/ngResource/badcfg.ngdoc4
-rw-r--r--src/ngResource/resource.js5
-rw-r--r--test/ngResource/resourceSpec.js49
3 files changed, 57 insertions, 1 deletions
diff --git a/docs/content/error/ngResource/badcfg.ngdoc b/docs/content/error/ngResource/badcfg.ngdoc
new file mode 100644
index 00000000..c27dc7c0
--- /dev/null
+++ b/docs/content/error/ngResource/badcfg.ngdoc
@@ -0,0 +1,4 @@
+@ngdoc error
+@name ngResource:badcfg
+@fullName Response does not match configured parameter
+@description
diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js
index 92cbcd16..003b41f1 100644
--- a/src/ngResource/resource.js
+++ b/src/ngResource/resource.js
@@ -473,6 +473,11 @@ angular.module('ngResource', ['ng']).
promise = value.$promise;
if (data) {
+ if ( angular.isArray(data) != !!action.isArray ) {
+ throw ngResourceMinErr('badcfg', 'Error in resource configuration. Expected response' +
+ ' to contain an {0} but got an {1}',
+ action.isArray?'array':'object', angular.isArray(data)?'array':'object');
+ }
if (action.isArray) {
value.length = 0;
forEach(data, function(item) {
diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js
index 52395297..19456f01 100644
--- a/test/ngResource/resourceSpec.js
+++ b/test/ngResource/resourceSpec.js
@@ -807,7 +807,6 @@ describe("resource", function() {
});
});
-
it('should transform request/response', function() {
var Person = $resource('/Person/:id', {}, {
save: {
@@ -1034,3 +1033,51 @@ describe("resource", function() {
});
});
});
+
+describe('resource', function() {
+ var $httpBackend, $resource;
+
+ beforeEach(module(function($exceptionHandlerProvider) {
+ $exceptionHandlerProvider.mode('log');
+ }));
+
+ beforeEach(module('ngResource'));
+
+ beforeEach(inject(function($injector) {
+ $httpBackend = $injector.get('$httpBackend');
+ $resource = $injector.get('$resource');
+ }));
+
+
+ it('should fail if action expects an object but response is an array', function() {
+ var successSpy = jasmine.createSpy('successSpy');
+ var failureSpy = jasmine.createSpy('failureSpy');
+
+ $httpBackend.expect('GET', '/Customer/123').respond({id: 'abc'});
+
+ $resource('/Customer/123').query()
+ .$promise.then(successSpy, function(e) { failureSpy(e.message); });
+ $httpBackend.flush();
+
+ expect(successSpy).not.toHaveBeenCalled();
+ expect(failureSpy).toHaveBeenCalledWith(
+ '[ngResource:badcfg] Error in resource configuration. Expected response to contain an array but got an object');
+ });
+
+ it('should fail if action expects an array but response is an object', function() {
+ var successSpy = jasmine.createSpy('successSpy');
+ var failureSpy = jasmine.createSpy('failureSpy');
+
+ $httpBackend.expect('GET', '/Customer/123').respond([1,2,3]);
+
+ $resource('/Customer/123').get()
+ .$promise.then(successSpy, function(e) { failureSpy(e.message); });
+ $httpBackend.flush();
+
+ expect(successSpy).not.toHaveBeenCalled();
+ expect(failureSpy).toHaveBeenCalledWith(
+ '[ngResource:badcfg] Error in resource configuration. Expected response to contain an object but got an array');
+ });
+
+
+}); \ No newline at end of file