summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-09-22 14:59:00 +0000
committerGerrit Code Review <review@openstack.org>2013-09-22 14:59:00 +0000
commit17adf7d4c6a5c593f7ab96915477acebf0302775 (patch)
treee7f9b0bd70b3418f81e4cc5f2671471d539d4891
parentdae62991576703822dc80c8dbe2b0439e3077b44 (diff)
parent2af9917e6ba7664d814ee171bc167421eccb9758 (diff)
downloadwsme-17adf7d4c6a5c593f7ab96915477acebf0302775.tar.gz
Merge "Handle mandatory attributes"
-rw-r--r--wsme/rest/json.py5
-rw-r--r--wsme/rest/xml.py7
-rw-r--r--wsme/tests/test_api.py53
3 files changed, 62 insertions, 3 deletions
diff --git a/wsme/rest/json.py b/wsme/rest/json.py
index 3509663..180ee2c 100644
--- a/wsme/rest/json.py
+++ b/wsme/rest/json.py
@@ -12,7 +12,7 @@ from simplegeneric import generic
from wsme.types import Unset
import wsme.types
import wsme.utils
-from wsme.exc import UnknownArgument
+from wsme.exc import UnknownArgument, InvalidInput
try:
@@ -137,6 +137,9 @@ def fromjson(datatype, value):
if attrdef.name in value:
setattr(obj, attrdef.key,
fromjson(attrdef.datatype, value[attrdef.name]))
+ elif attrdef.mandatory:
+ raise InvalidInput(attrdef.name, None,
+ "Mandatory field missing.")
return obj
elif wsme.types.isusertype(datatype):
value = datatype.frombasetype(
diff --git a/wsme/rest/xml.py b/wsme/rest/xml.py
index eb8ce7e..1ebc3d5 100644
--- a/wsme/rest/xml.py
+++ b/wsme/rest/xml.py
@@ -9,7 +9,7 @@ import xml.etree.ElementTree as et
from simplegeneric import generic
import wsme.types
-from wsme.exc import UnknownArgument
+from wsme.exc import UnknownArgument, InvalidInput
import re
@@ -98,10 +98,13 @@ def fromxml(datatype, element):
return datatype.frombasetype(fromxml(datatype.basetype, element))
if wsme.types.iscomplex(datatype):
obj = datatype()
- for attrdef in datatype._wsme_attributes:
+ for attrdef in wsme.types.list_attributes(datatype):
sub = element.find(attrdef.name)
if sub is not None:
setattr(obj, attrdef.key, fromxml(attrdef.datatype, sub))
+ elif attrdef.mandatory:
+ raise InvalidInput(attrdef.name, None,
+ "Mandatory field missing.")
return obj
if datatype is wsme.types.bytes:
return element.text.encode('ascii')
diff --git a/wsme/tests/test_api.py b/wsme/tests/test_api.py
index d2afed0..b53be6f 100644
--- a/wsme/tests/test_api.py
+++ b/wsme/tests/test_api.py
@@ -220,6 +220,59 @@ class TestController(unittest.TestCase):
self.assertEquals(res.body, b('"hellohello"'))
+ def test_wsattr_mandatory(self):
+ class ComplexType(object):
+ attr = wsme.types.wsattr(int, mandatory=True)
+
+ class MyRoot(WSRoot):
+ @expose(int, body=ComplexType)
+ @validate(ComplexType)
+ def clx(self, a):
+ return a.attr
+
+ r = MyRoot(['restjson'])
+ app = webtest.TestApp(r.wsgiapp())
+ res = app.post_json('/clx', params={}, expect_errors=True,
+ headers={'Accept': 'application/json'})
+ self.assertEqual(res.status_int, 400)
+
+ def test_wsproperty_mandatory(self):
+ class ComplexType(object):
+ def foo(self):
+ pass
+
+ attr = wsme.types.wsproperty(int, foo, foo, mandatory=True)
+
+ class MyRoot(WSRoot):
+ @expose(int, body=ComplexType)
+ @validate(ComplexType)
+ def clx(self, a):
+ return a.attr
+
+ r = MyRoot(['restjson'])
+ app = webtest.TestApp(r.wsgiapp())
+ res = app.post_json('/clx', params={}, expect_errors=True,
+ headers={'Accept': 'application/json'})
+ self.assertEqual(res.status_int, 400)
+
+ def test_validate_enum_mandatory(self):
+ class Version(object):
+ number = wsme.types.wsattr(wsme.types.Enum(str, 'v1', 'v2'),
+ mandatory=True)
+
+ class MyWS(WSRoot):
+ @expose(str)
+ @validate(Version)
+ def setcplx(self, version):
+ pass
+
+ r = MyWS(['restjson'])
+ app = webtest.TestApp(r.wsgiapp())
+ res = app.post_json('/setcplx', params={'version': {}},
+ expect_errors=True,
+ headers={'Accept': 'application/json'})
+ self.assertEqual(res.status_int, 400)
+
class TestFunctionDefinition(unittest.TestCase):