From 745d347d5a8201e9d76f67239a8c297d2f6d3f4f Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Sun, 21 Jun 2015 11:16:03 +0200 Subject: [PATCH 01/10] Added hasBody to ngResource action configuration --- src/ngResource/resource.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index f9f33670bd04..efd65312bebd 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -193,6 +193,8 @@ function shallowClearAndCopy(src, dst) { * - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods - * `response` and `responseError`. Both `response` and `responseError` interceptors get called * with `http response` object. See {@link ng.$http $http interceptors}. + * - **`hasBody`** - `{boolean}` - allows to specify if a request body is to be used (not + * required for POST,PUT,PATCH and can't disable body inclusion on this methods). * * @param {Object} options Hash with custom settings that should extend the * default `$resourceProvider` behavior. The supported options are: @@ -640,7 +642,7 @@ angular.module('ngResource', ['ng']). }; forEach(actions, function(action, name) { - var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method); + var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method) || action.hasBody === true; var numericTimeout = action.timeout; var cancellable = isDefined(action.cancellable) ? action.cancellable : route.defaults.cancellable; From c6f2687e42ff30f3b1e65763bb551d4528c5736c Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Tue, 6 Dec 2016 10:42:14 +0100 Subject: [PATCH 02/10] Refined version of hasBody check. --- 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 efd65312bebd..5bc838b03393 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -642,7 +642,7 @@ angular.module('ngResource', ['ng']). }; forEach(actions, function(action, name) { - var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method) || action.hasBody === true; + var hasBody = action.hasBody === true || (action.hasBody !== false && /^(POST|PUT|PATCH)$/i.test(action.method)); var numericTimeout = action.timeout; var cancellable = isDefined(action.cancellable) ? action.cancellable : route.defaults.cancellable; From 9e236247ab796d42013a85ed2e696c88a6bfb9ca Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Tue, 6 Dec 2016 11:39:42 +0100 Subject: [PATCH 03/10] Fixed documentation of ngResource.hasBody configuration. --- src/ngResource/resource.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 5bc838b03393..aa487a5c81e3 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -193,8 +193,8 @@ function shallowClearAndCopy(src, dst) { * - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods - * `response` and `responseError`. Both `response` and `responseError` interceptors get called * with `http response` object. See {@link ng.$http $http interceptors}. - * - **`hasBody`** - `{boolean}` - allows to specify if a request body is to be used (not - * required for POST,PUT,PATCH and can't disable body inclusion on this methods). + * - **`hasBody`** - `{boolean}` - allows to specify if a request body should be included or not. + * If not specified POST,PUT and PATCH will have a request body. * * @param {Object} options Hash with custom settings that should extend the * default `$resourceProvider` behavior. The supported options are: From be8aeebfccac7d653e390a07cf7801584062da83 Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Tue, 6 Dec 2016 11:46:00 +0100 Subject: [PATCH 04/10] Improved documentation of ngResource.hasBody that only POST, PUT and PATCH have a request body by default. --- 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 aa487a5c81e3..05ce4382797f 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -194,7 +194,7 @@ function shallowClearAndCopy(src, dst) { * `response` and `responseError`. Both `response` and `responseError` interceptors get called * with `http response` object. See {@link ng.$http $http interceptors}. * - **`hasBody`** - `{boolean}` - allows to specify if a request body should be included or not. - * If not specified POST,PUT and PATCH will have a request body. + * If not specified only POST, PUT and PATCH will have a request. * * @param {Object} options Hash with custom settings that should extend the * default `$resourceProvider` behavior. The supported options are: From c8212ada5e92c4e146aa5aa9abb8dc84030e4900 Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Tue, 28 Feb 2017 16:01:16 +0100 Subject: [PATCH 05/10] Added unit test for ngResource.hasBody. --- test/ngResource/resourceSpec.js | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 3e59ccb11fea..d5abe3d6a246 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -97,6 +97,43 @@ describe('basic usage', function() { $httpBackend.flush(); }); + it('should include a request body when calling custom delete with hasBody is true', function() { + var condition = {at: '2038-01-19 03:14:08'}; + $httpBackend.expect('DELETE', '/fooresource', condition).respond({}); + + var r = $resource('/fooresource', {}, { + delete: {method: 'DELETE', hasBody: true} + }); + + var deleteResponse = r.delete(condition); + + $httpBackend.flush(); + + expect(deleteResponse.$resolved).toBe(true); + }); + + it('should expect a body if hasBody is true', function() { + var username = 'yathos'; + var loginRequest = {name: username, password: 'Smile'}; + var user = {id: 1, name: username}; + + $httpBackend.expect('LOGIN', '/user/me', loginRequest).respond(user); + + $httpBackend.expect('LOGOUT', '/user/me', null).respond(null); + + var UserService = $resource('/user/me', {}, { + login: {method: 'LOGIN', hasBody: true}, + logout: {method: 'LOGOUT', hasBody: false} + }); + + var loginResponse = UserService.login(loginRequest); + var logoutResponse = UserService.logout(); + + $httpBackend.flush(); + + expect(loginResponse.id).toBe(user.id); + expect(logoutResponse.$resolved).toBe(true); + }); it('should build resource', function() { expect(typeof CreditCard).toBe('function'); From cf811f5ae8f5b360e3d935d6e12845bfa9dca468 Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Mon, 6 Mar 2017 11:02:40 +0100 Subject: [PATCH 06/10] Added additional test case for hasBody: false on POST,PUT and PATCH Extended test case with a custom CREATE request. Improved documentation of hasBody. --- src/ngResource/resource.js | 2 +- test/ngResource/resourceSpec.js | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 05ce4382797f..289a09fcc52d 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -194,7 +194,7 @@ function shallowClearAndCopy(src, dst) { * `response` and `responseError`. Both `response` and `responseError` interceptors get called * with `http response` object. See {@link ng.$http $http interceptors}. * - **`hasBody`** - `{boolean}` - allows to specify if a request body should be included or not. - * If not specified only POST, PUT and PATCH will have a request. + * If not specified only POST, PUT and PATCH requests will have a body. * * @param {Object} options Hash with custom settings that should extend the * default `$resourceProvider` behavior. The supported options are: diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index d5abe3d6a246..031bb8392c62 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -97,21 +97,50 @@ describe('basic usage', function() { $httpBackend.flush(); }); - it('should include a request body when calling custom delete with hasBody is true', function() { + it('should include a request body when calling custom method with hasBody is true', function() { + var instant = {name: 'info.txt', value: 'V2hlbiB0aGUgdGltZSBlbmRzLg=='}; + var fid = 42; + var created = {fid: fid, filname: 'fooresource', value: 'V2hlbiB0aGUgdGltZSBlbmRzLg=='}; var condition = {at: '2038-01-19 03:14:08'}; + $httpBackend.expect('CREATE', '/fooresource', instant).respond(created); $httpBackend.expect('DELETE', '/fooresource', condition).respond({}); var r = $resource('/fooresource', {}, { + create: {method: 'CREATE', hasBody: true}, delete: {method: 'DELETE', hasBody: true} }); + var creationResponse = r.create(instant); var deleteResponse = r.delete(condition); $httpBackend.flush(); + expect(creationResponse.fid).toBe(fid); expect(deleteResponse.$resolved).toBe(true); }); + it('should not include a request body if hasBody is false on POST, PUT and PATCH', function() { + $httpBackend.expect('POST', '/foo').respond({}); + $httpBackend.expect('PUT', '/foo').respond({}); + $httpBackend.expect('PATCH', '/foo').respond({}); + + var R = $resource('/foo', {}, { + post: {method: 'POST', hasBody: false}, + put: {method: 'PUT', hasBody: false}, + patch: {method: 'PATCH', hasBody: false} + }); + + var postResponse = R.post(); + var putResponse = R.put(); + var patchResponse = R.patch(); + + $httpBackend.flush(); + + expect(postResponse.$resolved).toBe(true); + expect(putResponse.$resolved).toBe(true); + expect(patchResponse.$resolved).toBe(true); + }); + it('should expect a body if hasBody is true', function() { var username = 'yathos'; var loginRequest = {name: username, password: 'Smile'}; From 36ce9f0450c186a398a568c7b8ddc90728fea618 Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Mon, 6 Mar 2017 15:07:57 +0100 Subject: [PATCH 07/10] Cleanup of hasBody test case variables. --- test/ngResource/resourceSpec.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 031bb8392c62..7e5e0c9c9298 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -98,11 +98,10 @@ describe('basic usage', function() { }); it('should include a request body when calling custom method with hasBody is true', function() { - var instant = {name: 'info.txt', value: 'V2hlbiB0aGUgdGltZSBlbmRzLg=='}; - var fid = 42; - var created = {fid: fid, filname: 'fooresource', value: 'V2hlbiB0aGUgdGltZSBlbmRzLg=='}; + var instant = {name: 'info.txt'}; var condition = {at: '2038-01-19 03:14:08'}; - $httpBackend.expect('CREATE', '/fooresource', instant).respond(created); + + $httpBackend.expect('CREATE', '/fooresource', instant).respond({fid: 42}); $httpBackend.expect('DELETE', '/fooresource', condition).respond({}); var r = $resource('/fooresource', {}, { @@ -115,7 +114,7 @@ describe('basic usage', function() { $httpBackend.flush(); - expect(creationResponse.fid).toBe(fid); + expect(creationResponse.fid).toBe(42); expect(deleteResponse.$resolved).toBe(true); }); From 91393029ba0b21512255616d6a76b164a8113483 Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Fri, 17 Mar 2017 12:52:45 +0100 Subject: [PATCH 08/10] Enhanced test case on methods with hasBody true. --- test/ngResource/resourceSpec.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 7e5e0c9c9298..9960f6f55097 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -102,6 +102,10 @@ describe('basic usage', function() { var condition = {at: '2038-01-19 03:14:08'}; $httpBackend.expect('CREATE', '/fooresource', instant).respond({fid: 42}); + $httpBackend.expectPOST('/fooresource').respond(function(method, url, data) { + expect(data).not.toBeUndefined(); + return [200, {id: 42}]; + }); $httpBackend.expect('DELETE', '/fooresource', condition).respond({}); var r = $resource('/fooresource', {}, { @@ -110,16 +114,21 @@ describe('basic usage', function() { }); var creationResponse = r.create(instant); + var saveResponse = r.save(null, {id: -1}); var deleteResponse = r.delete(condition); $httpBackend.flush(); expect(creationResponse.fid).toBe(42); + expect(saveResponse.id).toBe(42); expect(deleteResponse.$resolved).toBe(true); }); it('should not include a request body if hasBody is false on POST, PUT and PATCH', function() { - $httpBackend.expect('POST', '/foo').respond({}); + $httpBackend.expectPOST('/foo').respond(function(method, url, data) { + expect(data).toBeUndefined(); + return [200, {id: 42}]; + }); $httpBackend.expect('PUT', '/foo').respond({}); $httpBackend.expect('PATCH', '/foo').respond({}); @@ -135,7 +144,7 @@ describe('basic usage', function() { $httpBackend.flush(); - expect(postResponse.$resolved).toBe(true); + expect(postResponse.id).toBe(42); expect(putResponse.$resolved).toBe(true); expect(patchResponse.$resolved).toBe(true); }); From 77d9cfa08e41d005f69752859375061011dd7de5 Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Mon, 20 Mar 2017 20:49:43 +0100 Subject: [PATCH 09/10] Further improvement of unit tests for ngResource hasBody. --- test/ngResource/resourceSpec.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 9960f6f55097..c61746209399 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -102,10 +102,6 @@ describe('basic usage', function() { var condition = {at: '2038-01-19 03:14:08'}; $httpBackend.expect('CREATE', '/fooresource', instant).respond({fid: 42}); - $httpBackend.expectPOST('/fooresource').respond(function(method, url, data) { - expect(data).not.toBeUndefined(); - return [200, {id: 42}]; - }); $httpBackend.expect('DELETE', '/fooresource', condition).respond({}); var r = $resource('/fooresource', {}, { @@ -114,23 +110,23 @@ describe('basic usage', function() { }); var creationResponse = r.create(instant); - var saveResponse = r.save(null, {id: -1}); var deleteResponse = r.delete(condition); $httpBackend.flush(); expect(creationResponse.fid).toBe(42); - expect(saveResponse.id).toBe(42); expect(deleteResponse.$resolved).toBe(true); }); it('should not include a request body if hasBody is false on POST, PUT and PATCH', function() { - $httpBackend.expectPOST('/foo').respond(function(method, url, data) { + function verifyRequest(method, url, data) { expect(data).toBeUndefined(); return [200, {id: 42}]; - }); - $httpBackend.expect('PUT', '/foo').respond({}); - $httpBackend.expect('PATCH', '/foo').respond({}); + } + + $httpBackend.expect('POST', '/foo').respond(verifyRequest); + $httpBackend.expect('PUT', '/foo').respond(verifyRequest); + $httpBackend.expect('PATCH', '/foo').respond(verifyRequest); var R = $resource('/foo', {}, { post: {method: 'POST', hasBody: false}, From 4e2a8748089ea5360fa7bdc6da75567813acb7ca Mon Sep 17 00:00:00 2001 From: Richard Kaufhold Date: Tue, 21 Mar 2017 10:15:09 +0100 Subject: [PATCH 10/10] Changed expects of hasBody test to refere to a response value instead of $resolved. --- test/ngResource/resourceSpec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index c61746209399..03cef57765de 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -141,8 +141,8 @@ describe('basic usage', function() { $httpBackend.flush(); expect(postResponse.id).toBe(42); - expect(putResponse.$resolved).toBe(true); - expect(patchResponse.$resolved).toBe(true); + expect(putResponse.id).toBe(42); + expect(patchResponse.id).toBe(42); }); it('should expect a body if hasBody is true', function() {