diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-09-22 14:59:00 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-09-22 14:59:00 +0000 |
commit | 17adf7d4c6a5c593f7ab96915477acebf0302775 (patch) | |
tree | e7f9b0bd70b3418f81e4cc5f2671471d539d4891 | |
parent | dae62991576703822dc80c8dbe2b0439e3077b44 (diff) | |
parent | 2af9917e6ba7664d814ee171bc167421eccb9758 (diff) | |
download | wsme-17adf7d4c6a5c593f7ab96915477acebf0302775.tar.gz |
Merge "Handle mandatory attributes"
-rw-r--r-- | wsme/rest/json.py | 5 | ||||
-rw-r--r-- | wsme/rest/xml.py | 7 | ||||
-rw-r--r-- | wsme/tests/test_api.py | 53 |
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): |