Ensure UserType objects are converted to basetype
Add some tests to verify that UserType objects are correctly converted to the specified basetype. Bug #1228040 was based on a wrong usage of the UserType base class, so these also stand as a further example of correct usage. Related-Bug: #1228040 Change-Id: I7d50164930c2ae7abeddcade4f876eef5b273b6b
This commit is contained in:
parent
9a0d3c1461
commit
d2f8f8fb1c
@ -70,6 +70,11 @@ class CustomObject(object):
|
|||||||
name = wsme.types.text
|
name = wsme.types.text
|
||||||
|
|
||||||
|
|
||||||
|
class ExtendedInt(wsme.types.UserType):
|
||||||
|
basetype = int
|
||||||
|
name = "Extended integer"
|
||||||
|
|
||||||
|
|
||||||
class NestedInnerApi(object):
|
class NestedInnerApi(object):
|
||||||
@expose(bool)
|
@expose(bool)
|
||||||
def deepfunction(self):
|
def deepfunction(self):
|
||||||
@ -324,6 +329,12 @@ class ArgTypes(object):
|
|||||||
self.assertIsInstance(value.aint, int)
|
self.assertIsInstance(value.aint, int)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@expose(ExtendedInt())
|
||||||
|
@validate(ExtendedInt())
|
||||||
|
def setextendedint(self, value):
|
||||||
|
self.assertEquals(isinstance(value, ExtendedInt.basetype), True)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
class BodyTypes(object):
|
class BodyTypes(object):
|
||||||
def assertEquals(self, a, b):
|
def assertEquals(self, a, b):
|
||||||
|
@ -11,7 +11,7 @@ except:
|
|||||||
|
|
||||||
from wsme.rest.json import fromjson, tojson, parse
|
from wsme.rest.json import fromjson, tojson, parse
|
||||||
from wsme.utils import parse_isodatetime, parse_isotime, parse_isodate
|
from wsme.utils import parse_isodatetime, parse_isotime, parse_isodate
|
||||||
from wsme.types import isarray, isdict, isusertype, register_type
|
from wsme.types import isarray, isdict, isusertype, register_type, UserType
|
||||||
from wsme.rest import expose, validate
|
from wsme.rest import expose, validate
|
||||||
from wsme.exc import ClientSideError, InvalidInput
|
from wsme.exc import ClientSideError, InvalidInput
|
||||||
|
|
||||||
@ -90,6 +90,11 @@ def prepare_result(value, datatype):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
class CustomInt(UserType):
|
||||||
|
basetype = int
|
||||||
|
name = "custom integer"
|
||||||
|
|
||||||
|
|
||||||
class Obj(wsme.types.Base):
|
class Obj(wsme.types.Base):
|
||||||
id = int
|
id = int
|
||||||
name = wsme.types.text
|
name = wsme.types.text
|
||||||
@ -279,6 +284,15 @@ class TestRestJson(wsme.tests.protocol.RestOnlyProtocolTestCase):
|
|||||||
self.assertEqual(r.status_int, 200)
|
self.assertEqual(r.status_int, 200)
|
||||||
self.assertEqual(r.json, {'aint': 2, 'name': 'test'})
|
self.assertEqual(r.json, {'aint': 2, 'name': 'test'})
|
||||||
|
|
||||||
|
def test_set_extended_int(self):
|
||||||
|
r = self.app.post(
|
||||||
|
'/argtypes/setextendedint',
|
||||||
|
'{"value": 3}',
|
||||||
|
headers={"Content-Type": "application/json"}
|
||||||
|
)
|
||||||
|
self.assertEqual(r.status_int, 200)
|
||||||
|
self.assertEqual(r.json, 3)
|
||||||
|
|
||||||
def test_unset_attrs(self):
|
def test_unset_attrs(self):
|
||||||
class AType(object):
|
class AType(object):
|
||||||
attr = int
|
attr = int
|
||||||
@ -438,6 +452,30 @@ class TestRestJson(wsme.tests.protocol.RestOnlyProtocolTestCase):
|
|||||||
self.assertIsInstance(i['a'], bool)
|
self.assertIsInstance(i['a'], bool)
|
||||||
self.assertFalse(i['a'])
|
self.assertFalse(i['a'])
|
||||||
|
|
||||||
|
def test_valid_simple_custom_type_fromjson(self):
|
||||||
|
value = 2
|
||||||
|
for ba in True, False:
|
||||||
|
jd = '"%d"' if ba else '{"a": "%d"}'
|
||||||
|
i = parse(jd % value, {'a': CustomInt()}, ba)
|
||||||
|
self.assertEqual(i, {'a': 2})
|
||||||
|
self.assertIsInstance(i['a'], int)
|
||||||
|
|
||||||
|
def test_invalid_simple_custom_type_fromjson(self):
|
||||||
|
value = '2b'
|
||||||
|
for ba in True, False:
|
||||||
|
jd = '"%s"' if ba else '{"a": "%s"}'
|
||||||
|
try:
|
||||||
|
i = parse(jd % value, {'a': CustomInt()}, ba)
|
||||||
|
self.assertEqual(i, {'a': 2})
|
||||||
|
except ClientSideError as e:
|
||||||
|
self.assertIsInstance(e, InvalidInput)
|
||||||
|
self.assertEqual(e.fieldname, 'a')
|
||||||
|
self.assertEqual(e.value, value)
|
||||||
|
self.assertEqual(
|
||||||
|
e.msg,
|
||||||
|
"invalid literal for int() with base 10: '%s'" % value
|
||||||
|
)
|
||||||
|
|
||||||
def test_nest_result(self):
|
def test_nest_result(self):
|
||||||
self.root.protocols[0].nest_result = True
|
self.root.protocols[0].nest_result = True
|
||||||
r = self.app.get('/returntypes/getint.json')
|
r = self.app.get('/returntypes/getint.json')
|
||||||
|
@ -18,7 +18,7 @@ class TestSpore(unittest.TestCase):
|
|||||||
|
|
||||||
spore = json.loads(spore)
|
spore = json.loads(spore)
|
||||||
|
|
||||||
assert len(spore['methods']) == 50, str(len(spore['methods']))
|
assert len(spore['methods']) == 51, str(len(spore['methods']))
|
||||||
|
|
||||||
m = spore['methods']['argtypes_setbytesarray']
|
m = spore['methods']['argtypes_setbytesarray']
|
||||||
assert m['path'] == 'argtypes/setbytesarray', m['path']
|
assert m['path'] == 'argtypes/setbytesarray', m['path']
|
||||||
|
@ -397,7 +397,7 @@ class TestSOAP(wsme.tests.protocol.ProtocolTestCase):
|
|||||||
|
|
||||||
assert len(sd.ports) == 1
|
assert len(sd.ports) == 1
|
||||||
port, methods = sd.ports[0]
|
port, methods = sd.ports[0]
|
||||||
self.assertEquals(len(methods), 50)
|
self.assertEquals(len(methods), 51)
|
||||||
|
|
||||||
methods = dict(methods)
|
methods = dict(methods)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user