From 9b02605983a91b720271534a1eebfe66d16dadc3 Mon Sep 17 00:00:00 2001 From: James Andersen Date: Thu, 17 Oct 2013 20:33:46 -0600 Subject: [PATCH 1/4] avoid copying response.data to value if they are the same reference --- src/ngResource/resource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 2498bdf3a43a..eafa574700e9 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -488,7 +488,7 @@ angular.module('ngResource', ['ng']). value.push(new Resource(item)); }); } else { - copy(data, value); + if(data !== value) copy(data, value); value.$promise = promise; } } From dbd97bceaa121d5c51db9d2812a98340fb6edf00 Mon Sep 17 00:00:00 2001 From: James Andersen Date: Thu, 17 Oct 2013 21:02:45 -0600 Subject: [PATCH 2/4] added unit test ensuring resource does not throw when response.data is the resource instance --- test/ngResource/resourceSpec.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index d13156b3fcbc..a6d9f45a6b30 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -430,6 +430,21 @@ describe("resource", function() { expect(idBefore).toEqual(cc.id); }); + it('should not mutate the resource object if response.data is the resource object', function() { + var data = {id:{key:123}, number:'9876'}; + $httpBackend.expect('GET', '/CreditCard/123').respond(data); + + var cc = CreditCard.get({id:123}); + $httpBackend.flush(); + expect(cc instanceof CreditCard).toBe(true); + + $httpBackend.expect('POST', '/CreditCard/123', angular.toJson(data)).respond(cc); + + expect(function() { + cc.$save(); + $httpBackend.flush(); + }).not.toThrow(); + }); it('should bind default parameters', function() { $httpBackend.expect('GET', '/CreditCard/123.visa?minimum=0.05').respond({id: 123}); From b687b5002e766aec4384c8eb7ecac755ff6245d5 Mon Sep 17 00:00:00 2001 From: James Andersen Date: Thu, 17 Oct 2013 21:02:45 -0600 Subject: [PATCH 3/4] added unit test ensuring resource does not throw when response.data is the resource instance --- test/ngResource/resourceSpec.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index d13156b3fcbc..a6d9f45a6b30 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -430,6 +430,21 @@ describe("resource", function() { expect(idBefore).toEqual(cc.id); }); + it('should not mutate the resource object if response.data is the resource object', function() { + var data = {id:{key:123}, number:'9876'}; + $httpBackend.expect('GET', '/CreditCard/123').respond(data); + + var cc = CreditCard.get({id:123}); + $httpBackend.flush(); + expect(cc instanceof CreditCard).toBe(true); + + $httpBackend.expect('POST', '/CreditCard/123', angular.toJson(data)).respond(cc); + + expect(function() { + cc.$save(); + $httpBackend.flush(); + }).not.toThrow(); + }); it('should bind default parameters', function() { $httpBackend.expect('GET', '/CreditCard/123.visa?minimum=0.05').respond({id: 123}); From 862a6d5ebbdabea00b2d902eae8a4165edc2ff0e Mon Sep 17 00:00:00 2001 From: James Andersen Date: Thu, 17 Oct 2013 21:50:22 -0600 Subject: [PATCH 4/4] updated test description --- test/ngResource/resourceSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index a6d9f45a6b30..29b2b4836d30 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -430,7 +430,7 @@ describe("resource", function() { expect(idBefore).toEqual(cc.id); }); - it('should not mutate the resource object if response.data is the resource object', function() { + it('should not throw if response.data is the resource object', function() { var data = {id:{key:123}, number:'9876'}; $httpBackend.expect('GET', '/CreditCard/123').respond(data);