From f2dbe2e43716925f592db831d95fc5783abcecc9 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Mon, 25 Nov 2013 13:39:30 -0600 Subject: Bring RESTApi closer to ithe imminent keystoneclient.Session Prepare to use the (soon to be) common Session from keystoneclient * Rework RESTApi to eventually be a subclass of keystoneclient.Session Change-Id: I68e610f8b19a3f6267a93f7bf3de54a228be68aa --- openstackclient/tests/common/test_restapi.py | 124 ++++++++++++--------- .../tests/object/v1/lib/test_container.py | 80 +++++++------ openstackclient/tests/object/v1/lib/test_object.py | 107 ++++++++++-------- 3 files changed, 183 insertions(+), 128 deletions(-) (limited to 'openstackclient/tests') diff --git a/openstackclient/tests/common/test_restapi.py b/openstackclient/tests/common/test_restapi.py index 4b83ffa4..c1e02fcb 100644 --- a/openstackclient/tests/common/test_restapi.py +++ b/openstackclient/tests/common/test_restapi.py @@ -23,6 +23,8 @@ import requests from openstackclient.common import restapi from openstackclient.tests import utils +fake_user_agent = 'test_rapi' + fake_auth = '11223344556677889900' fake_url = 'http://gopher.com' fake_key = 'gopher' @@ -47,6 +49,9 @@ fake_gopher_list = { fake_gopher_tosh, ] } +fake_headers = { + 'User-Agent': fake_user_agent, +} class FakeResponse(requests.Response): @@ -68,11 +73,15 @@ class TestRESTApi(utils.TestCase): request=mock.MagicMock(return_value=resp), ) - api = restapi.RESTApi() + api = restapi.RESTApi( + user_agent=fake_user_agent, + ) gopher = api.request('GET', fake_url) session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers={}, + allow_redirects=True, ) self.assertEqual(gopher.status_code, 200) self.assertEqual(gopher.json(), fake_gopher_single) @@ -83,11 +92,15 @@ class TestRESTApi(utils.TestCase): request=mock.MagicMock(return_value=resp), ) - api = restapi.RESTApi() + api = restapi.RESTApi( + user_agent=fake_user_agent, + ) gopher = api.request('GET', fake_url) session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers={}, + allow_redirects=True, ) self.assertEqual(gopher.status_code, 300) self.assertEqual(gopher.json(), fake_gopher_single) @@ -98,11 +111,15 @@ class TestRESTApi(utils.TestCase): request=mock.MagicMock(return_value=resp), ) - api = restapi.RESTApi() + api = restapi.RESTApi( + user_agent=fake_user_agent, + ) self.assertRaises(requests.HTTPError, api.request, 'GET', fake_url) session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers={}, + allow_redirects=True, ) def test_request_get_auth(self, session_mock): @@ -112,66 +129,67 @@ class TestRESTApi(utils.TestCase): headers=mock.MagicMock(return_value={}), ) - api = restapi.RESTApi(os_auth=fake_auth) - gopher = api.request('GET', fake_url) - session_mock.return_value.headers.setdefault.assert_called_with( - 'X-Auth-Token', - fake_auth, + api = restapi.RESTApi( + auth_header=fake_auth, + user_agent=fake_user_agent, ) + gopher = api.request('GET', fake_url) + #session_mock.return_value.headers.setdefault.assert_called_with( + # 'X-Auth-Token', + # fake_auth, + #) session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers={ + 'X-Auth-Token': fake_auth, + }, + allow_redirects=True, ) self.assertEqual(gopher.json(), fake_gopher_single) - def test_request_get_header(self, session_mock): + def test_request_post(self, session_mock): resp = FakeResponse(data=fake_gopher_single) session_mock.return_value = mock.MagicMock( request=mock.MagicMock(return_value=resp), - headers=mock.MagicMock(return_value={}), ) - api = restapi.RESTApi(user_agent='fake_agent') - api.set_header('X-Fake-Header', 'wb') - gopher = api.request('GET', fake_url) - session_mock.return_value.headers.__setitem__.assert_any_call( - 'Content-Type', - 'application/json', - ) - session_mock.return_value.headers.__setitem__.assert_any_call( - 'User-Agent', - 'fake_agent', - ) - session_mock.return_value.headers.__setitem__.assert_any_call( - 'X-Fake-Header', - 'wb', + api = restapi.RESTApi( + user_agent=fake_user_agent, ) + data = fake_gopher_tosh + gopher = api.request('POST', fake_url, json=data) session_mock.return_value.request.assert_called_with( - 'GET', + 'POST', fake_url, + headers={ + 'Content-Type': 'application/json', + }, + allow_redirects=True, + data=json.dumps(data), ) self.assertEqual(gopher.json(), fake_gopher_single) - api.set_header('X-Fake-Header', None) - session_mock.return_value.headers.__delitem__.assert_any_call( - 'X-Fake-Header', - ) + # Methods + # TODO(dtroyer): add the other method methods - def test_request_post(self, session_mock): - resp = FakeResponse(data=fake_gopher_single) + def test_delete(self, session_mock): + resp = FakeResponse(status_code=200, data=None) session_mock.return_value = mock.MagicMock( request=mock.MagicMock(return_value=resp), ) api = restapi.RESTApi() - data = fake_gopher_tosh - gopher = api.request('POST', fake_url, data=data) + gopher = api.delete(fake_url) session_mock.return_value.request.assert_called_with( - 'POST', + 'DELETE', fake_url, - data=json.dumps(data), + headers=mock.ANY, + allow_redirects=True, ) - self.assertEqual(gopher.json(), fake_gopher_single) + self.assertEqual(gopher.status_code, 200) + + # Commands def test_create(self, session_mock): resp = FakeResponse(data=fake_gopher_single) @@ -187,6 +205,8 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'POST', fake_url, + headers=mock.ANY, + allow_redirects=True, data=json.dumps(data), ) self.assertEqual(gopher, fake_gopher_single) @@ -196,24 +216,12 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'POST', fake_url, + headers=mock.ANY, + allow_redirects=True, data=json.dumps(data), ) self.assertEqual(gopher, fake_gopher_mac) - def test_delete(self, session_mock): - resp = FakeResponse(data=None) - session_mock.return_value = mock.MagicMock( - request=mock.MagicMock(return_value=resp), - ) - - api = restapi.RESTApi() - gopher = api.delete(fake_url) - session_mock.return_value.request.assert_called_with( - 'DELETE', - fake_url, - ) - self.assertEqual(gopher, None) - def test_list(self, session_mock): resp = FakeResponse(data=fake_gopher_list) session_mock.return_value = mock.MagicMock( @@ -226,6 +234,7 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers=mock.ANY, allow_redirects=True, ) self.assertEqual(gopher, [fake_gopher_mac, fake_gopher_tosh]) @@ -237,6 +246,8 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'POST', fake_url, + headers=mock.ANY, + allow_redirects=True, data=json.dumps(data), ) self.assertEqual(gopher, [fake_gopher_mac, fake_gopher_tosh]) @@ -248,6 +259,7 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers=mock.ANY, allow_redirects=True, params=params, ) @@ -270,7 +282,9 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'PUT', fake_url, - data=None, + headers=mock.ANY, + allow_redirects=True, + json=None, ) self.assertEqual(gopher, None) @@ -279,6 +293,8 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'PUT', fake_url, + headers=mock.ANY, + allow_redirects=True, data=json.dumps(data), ) self.assertEqual(gopher, fake_gopher_single) @@ -291,6 +307,8 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'PUT', fake_url, + headers=mock.ANY, + allow_redirects=True, data=json.dumps(data), ) self.assertEqual(gopher, fake_gopher_mac) @@ -308,6 +326,8 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers=mock.ANY, + allow_redirects=True, ) self.assertEqual(gopher, fake_gopher_single) @@ -316,5 +336,7 @@ class TestRESTApi(utils.TestCase): session_mock.return_value.request.assert_called_with( 'GET', fake_url, + headers=mock.ANY, + allow_redirects=True, ) self.assertEqual(gopher, fake_gopher_mac) diff --git a/openstackclient/tests/object/v1/lib/test_container.py b/openstackclient/tests/object/v1/lib/test_container.py index c3fdea72..f7355592 100644 --- a/openstackclient/tests/object/v1/lib/test_container.py +++ b/openstackclient/tests/object/v1/lib/test_container.py @@ -46,7 +46,7 @@ class TestContainerList(TestContainer): def test_container_list_no_options(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_container.list_containers( self.app.restapi, @@ -54,15 +54,17 @@ class TestContainerList(TestContainer): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '?format=json', + self.app.restapi.list.assert_called_with( + fake_url, + params={ + 'format': 'json', + } ) self.assertEqual(data, resp) def test_container_list_marker(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_container.list_containers( self.app.restapi, @@ -71,15 +73,18 @@ class TestContainerList(TestContainer): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '?format=json&marker=next', + self.app.restapi.list.assert_called_with( + fake_url, + params={ + 'format': 'json', + 'marker': 'next', + } ) self.assertEqual(data, resp) def test_container_list_limit(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_container.list_containers( self.app.restapi, @@ -88,15 +93,18 @@ class TestContainerList(TestContainer): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '?format=json&limit=5', + self.app.restapi.list.assert_called_with( + fake_url, + params={ + 'format': 'json', + 'limit': 5, + } ) self.assertEqual(data, resp) def test_container_list_end_marker(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_container.list_containers( self.app.restapi, @@ -105,15 +113,18 @@ class TestContainerList(TestContainer): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '?format=json&end_marker=last', + self.app.restapi.list.assert_called_with( + fake_url, + params={ + 'format': 'json', + 'end_marker': 'last', + } ) self.assertEqual(data, resp) def test_container_list_prefix(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_container.list_containers( self.app.restapi, @@ -122,25 +133,26 @@ class TestContainerList(TestContainer): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '?format=json&prefix=foo/', + self.app.restapi.list.assert_called_with( + fake_url, + params={ + 'format': 'json', + 'prefix': 'foo/', + } ) self.assertEqual(data, resp) def test_container_list_full_listing(self): def side_effect(*args, **kwargs): - rv = self.app.restapi.request.return_value - self.app.restapi.request.return_value = restapi.FakeResponse( - data=[], - ) - self.app.restapi.request.side_effect = None + rv = self.app.restapi.list.return_value + self.app.restapi.list.return_value = [] + self.app.restapi.list.side_effect = None return rv resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) - self.app.restapi.request.side_effect = side_effect + self.app.restapi.list.return_value = resp + self.app.restapi.list.side_effect = side_effect data = lib_container.list_containers( self.app.restapi, @@ -149,9 +161,12 @@ class TestContainerList(TestContainer): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '?format=json&marker=is-name', + self.app.restapi.list.assert_called_with( + fake_url, + params={ + 'format': 'json', + 'marker': 'is-name', + } ) self.assertEqual(data, resp) @@ -163,7 +178,7 @@ class TestContainerShow(TestContainer): 'x-container-object-count': 1, 'x-container-bytes-used': 577, } - self.app.restapi.request.return_value = \ + self.app.restapi.head.return_value = \ restapi.FakeResponse(headers=resp) data = lib_container.show_container( @@ -173,8 +188,7 @@ class TestContainerShow(TestContainer): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'HEAD', + self.app.restapi.head.assert_called_with( fake_url + '/is-name', ) diff --git a/openstackclient/tests/object/v1/lib/test_object.py b/openstackclient/tests/object/v1/lib/test_object.py index ef93877a..064efb53 100644 --- a/openstackclient/tests/object/v1/lib/test_object.py +++ b/openstackclient/tests/object/v1/lib/test_object.py @@ -47,7 +47,7 @@ class TestObjectListObjects(TestObject): def test_list_objects_no_options(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_object.list_objects( self.app.restapi, @@ -56,15 +56,17 @@ class TestObjectListObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + } ) self.assertEqual(data, resp) def test_list_objects_marker(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_object.list_objects( self.app.restapi, @@ -74,15 +76,18 @@ class TestObjectListObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json&marker=next', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + 'marker': 'next', + } ) self.assertEqual(data, resp) def test_list_objects_limit(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_object.list_objects( self.app.restapi, @@ -92,15 +97,18 @@ class TestObjectListObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json&limit=5', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + 'limit': 5, + } ) self.assertEqual(data, resp) def test_list_objects_end_marker(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_object.list_objects( self.app.restapi, @@ -110,15 +118,18 @@ class TestObjectListObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json&end_marker=last', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + 'end_marker': 'last', + } ) self.assertEqual(data, resp) def test_list_objects_delimiter(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_object.list_objects( self.app.restapi, @@ -131,15 +142,18 @@ class TestObjectListObjects(TestObject): # NOTE(dtroyer): requests handles the URL encoding and we're # mocking that so use the otherwise-not-legal # pipe '|' char in the response. - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json&delimiter=|', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + 'delimiter': '|', + } ) self.assertEqual(data, resp) def test_list_objects_prefix(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_object.list_objects( self.app.restapi, @@ -149,15 +163,18 @@ class TestObjectListObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json&prefix=foo/', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + 'prefix': 'foo/', + } ) self.assertEqual(data, resp) def test_list_objects_path(self): resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) + self.app.restapi.list.return_value = resp data = lib_object.list_objects( self.app.restapi, @@ -167,25 +184,26 @@ class TestObjectListObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json&path=next', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + 'path': 'next', + } ) self.assertEqual(data, resp) def test_list_objects_full_listing(self): def side_effect(*args, **kwargs): - rv = self.app.restapi.request.return_value - self.app.restapi.request.return_value = restapi.FakeResponse( - data=[], - ) - self.app.restapi.request.side_effect = None + rv = self.app.restapi.list.return_value + self.app.restapi.list.return_value = [] + self.app.restapi.list.side_effect = None return rv resp = [{'name': 'is-name'}] - self.app.restapi.request.return_value = restapi.FakeResponse(data=resp) - self.app.restapi.request.side_effect = side_effect + self.app.restapi.list.return_value = resp + self.app.restapi.list.side_effect = side_effect data = lib_object.list_objects( self.app.restapi, @@ -195,9 +213,12 @@ class TestObjectListObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'GET', - fake_url + '/' + fake_container + '?format=json&marker=is-name', + self.app.restapi.list.assert_called_with( + fake_url + '/' + fake_container, + params={ + 'format': 'json', + 'marker': 'is-name', + } ) self.assertEqual(data, resp) @@ -208,7 +229,7 @@ class TestObjectShowObjects(TestObject): resp = { 'content-type': 'text/alpha', } - self.app.restapi.request.return_value = \ + self.app.restapi.head.return_value = \ restapi.FakeResponse(headers=resp) data = lib_object.show_object( @@ -219,8 +240,7 @@ class TestObjectShowObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'HEAD', + self.app.restapi.head.assert_called_with( fake_url + '/%s/%s' % (fake_container, fake_object), ) @@ -242,7 +262,7 @@ class TestObjectShowObjects(TestObject): 'x-object-meta-wife': 'Wilma', 'x-tra-header': 'yabba-dabba-do', } - self.app.restapi.request.return_value = \ + self.app.restapi.head.return_value = \ restapi.FakeResponse(headers=resp) data = lib_object.show_object( @@ -253,8 +273,7 @@ class TestObjectShowObjects(TestObject): ) # Check expected values - self.app.restapi.request.assert_called_with( - 'HEAD', + self.app.restapi.head.assert_called_with( fake_url + '/%s/%s' % (fake_container, fake_object), ) -- cgit v1.2.1