Merge "Add support for not including the ID in creation requests"

This commit is contained in:
Zuul
2020-03-24 19:14:43 +00:00
committed by Gerrit Code Review
2 changed files with 41 additions and 1 deletions

View File

@@ -436,6 +436,8 @@ class Resource(dict):
requires_id = True
#: Whether create requires an ID (determined from method if None).
create_requires_id = None
#: Whether create should exclude ID in the body of the request.
create_exclude_id_from_body = False
#: Do responses for this resource have bodies
has_body = True
#: Does create returns a body (if False requires ID), defaults to has_body
@@ -1261,6 +1263,10 @@ class Resource(dict):
requires_id = (self.create_requires_id
if self.create_requires_id is not None
else self.create_method == 'PUT')
if self.create_exclude_id_from_body:
self._body._dirty.discard("id")
if self.create_method == 'PUT':
request = self._prepare_request(requires_id=requires_id,
prepend_key=prepend_key,

View File

@@ -1045,6 +1045,25 @@ class TestResource(base.TestCase):
self.assertEqual({"x": body_value, "id": the_id}, result.body)
self.assertEqual({"y": header_value}, result.headers)
def test__prepare_request_with_id_marked_clean(self):
class Test(resource.Resource):
base_path = "/something"
body_attr = resource.Body("x")
header_attr = resource.Header("y")
the_id = "id"
body_value = "body"
header_value = "header"
sot = Test(id=the_id, body_attr=body_value, header_attr=header_value,
_synchronized=False)
sot._body._dirty.discard("id")
result = sot._prepare_request(requires_id=True)
self.assertEqual("something/id", result.url)
self.assertEqual({"x": body_value}, result.body)
self.assertEqual({"y": header_value}, result.headers)
def test__prepare_request_missing_id(self):
sot = resource.Resource(id=None)
@@ -1401,7 +1420,8 @@ class TestResourceActions(base.TestCase):
self.session.get_endpoint_data.return_value = self.endpoint_data
def _test_create(self, cls, requires_id=False, prepend_key=False,
microversion=None, base_path=None, params=None):
microversion=None, base_path=None, params=None,
id_marked_dirty=True):
id = "id" if requires_id else None
sot = cls(id=id)
sot._prepare_request = mock.Mock(return_value=self.request)
@@ -1411,6 +1431,9 @@ class TestResourceActions(base.TestCase):
result = sot.create(self.session, prepend_key=prepend_key,
base_path=base_path, **params)
id_is_dirty = ('id' in sot._body._dirty)
self.assertEqual(id_marked_dirty, id_is_dirty)
sot._prepare_request.assert_called_once_with(
requires_id=requires_id, prepend_key=prepend_key,
base_path=base_path)
@@ -1439,6 +1462,17 @@ class TestResourceActions(base.TestCase):
self._test_create(Test, requires_id=True, prepend_key=True)
def test_put_create_exclude_id(self):
class Test(resource.Resource):
service = self.service_name
base_path = self.base_path
allow_create = True
create_method = 'PUT'
create_exclude_id_from_body = True
self._test_create(Test, requires_id=True, prepend_key=True,
id_marked_dirty=False)
def test_put_create_with_microversion(self):
class Test(resource.Resource):
service = self.service_name