From 3f4f3772dbfc80e86b2859d3d2bbbcd5a3971fb4 Mon Sep 17 00:00:00 2001 From: rabi Date: Mon, 6 Jun 2016 19:37:54 +0530 Subject: [PATCH] Serialize files when using SessionClient SessionClient can not json serialize TemplateFiles object. We should do them explictly. Change-Id: Ia67562ae9a13c0975cb5c39532c0dc413d82c4c3 Closes-Bug: #1589519 --- heatclient/common/http.py | 6 ++--- heatclient/tests/unit/test_common_http.py | 27 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/heatclient/common/http.py b/heatclient/common/http.py index 55176092..329d9c2c 100644 --- a/heatclient/common/http.py +++ b/heatclient/common/http.py @@ -306,10 +306,8 @@ class SessionClient(adapter.LegacyJsonAdapter): redirect = kwargs.get('redirect') kwargs.setdefault('user_agent', USER_AGENT) - try: - kwargs.setdefault('json', kwargs.pop('data')) - except KeyError: - pass + if 'data' in kwargs: + kwargs['data'] = jsonutils.dumps(kwargs['data']) resp, body = super(SessionClient, self).request( url, method, diff --git a/heatclient/tests/unit/test_common_http.py b/heatclient/tests/unit/test_common_http.py index f271b596..49a918dd 100644 --- a/heatclient/tests/unit/test_common_http.py +++ b/heatclient/tests/unit/test_common_http.py @@ -11,6 +11,7 @@ # implied. # See the License for the specific language governing permissions and # limitations under the License. + import logging import mock import os @@ -833,7 +834,31 @@ class SessionClientTest(testtools.TestCase): resp = client.request('', 'GET', **kwargs) self.assertEqual({'endpoint_override': 'http://no.where/', - 'json': 'some_data', + 'data': '"some_data"', + 'user_agent': 'python-heatclient', + 'raise_exc': False}, self.request.call_args[1]) + self.assertEqual(200, resp.status_code) + + @mock.patch.object(jsonutils, 'dumps') + def test_kwargs_with_files(self, mock_dumps): + fake = fakes.FakeHTTPResponse( + 200, + 'OK', + {'content-type': 'application/json'}, + {} + ) + mock_dumps.return_value = "{'files': test}}" + data = six.BytesIO(b'test') + kwargs = {'endpoint_override': 'http://no.where/', + 'data': {'files': data}} + client = http.SessionClient(mock.ANY) + + self.request.return_value = (fake, {}) + + resp = client.request('', 'GET', **kwargs) + + self.assertEqual({'endpoint_override': 'http://no.where/', + 'data': "{'files': test}}", 'user_agent': 'python-heatclient', 'raise_exc': False}, self.request.call_args[1]) self.assertEqual(200, resp.status_code)