def test_invalid_root_dict_fromjson(self): try: parse('["invalid"]', {'a': ArrayType(str)}, False) assert False except Exception as e: assert isinstance(e, ClientSideError) assert e.msg == "Request must be a JSON dict"
def test_invalid_list_fromjson(self): jlist = "invalid" try: parse('{"a": "%s"}' % jlist, {'a': ArrayType(str)}, False) assert False except Exception as e: assert isinstance(e, InvalidInput) assert e.fieldname == 'a' assert e.value == jlist assert e.msg == "Value not a valid list: %s" % jlist
def test_invalid_dict_fromjson(self): jdict = "invalid" try: parse('{"a": "%s"}' % jdict, {'a': DictType(str, str)}, False) assert False except Exception as e: assert isinstance(e, InvalidInput) assert e.fieldname == 'a' assert e.value == jdict assert e.msg == "Value not a valid dict: %s" % jdict
def test_invalid_date_fromjson_bodyarg(self): jdate = "2015-01-invalid" try: parse('"%s"' % jdate, {'a': datetime.date}, True) assert False except Exception as e: assert isinstance(e, InvalidInput) assert e.fieldname == 'a' assert e.value == jdate assert e.msg == "'%s' is not a legal date value" % jdate
def test_ambiguous_to_bool(self): amb_values = ('', 'randomstring', '2', '-32', 'not true') for value in amb_values: for ba in True, False: jd = '"%s"' if ba else '{"a": "%s"}' try: parse(jd % value, {'a': bool}, ba) assert False, ( "Value '%s' should not parse correctly for %s." % (value, bool)) except ClientSideError as e: self.assertIsInstance(e, InvalidInput) self.assertEqual(e.fieldname, 'a') self.assertEqual(e.value, value)
def test_parse_unexpected_attribute(self): o = { "id": "1", "name": "test", "other": "unknown", "other2": "still unknown", } for ba in True, False: jd = o if ba else {"o": o} try: parse(json.dumps(jd), {'o': Obj}, ba) raise AssertionError("Object should not parse correcty.") except wsme.exc.UnknownAttribute as e: self.assertEqual(e.attributes, set(['other', 'other2']))
def test_ambiguous_to_bool(self): amb_values = ('', 'randomstring', '2', '-32', 'not true') for value in amb_values: for ba in True, False: jd = '"%s"' if ba else '{"a": "%s"}' try: parse(jd % value, {'a': bool}, ba) assert False, ( "Value '%s' should not parse correctly for %s." % (value, bool) ) except ClientSideError as e: self.assertIsInstance(e, InvalidInput) self.assertEqual(e.fieldname, 'a') self.assertEqual(e.value, value)
def test_parse_unexpected_nested_attribute(self): no = { "o": { "id": "1", "name": "test", "other": "unknown", }, } for ba in False, True: jd = no if ba else {"no": no} try: parse(json.dumps(jd), {'no': NestedObj}, ba) except wsme.exc.UnknownAttribute as e: self.assertEqual(e.attributes, set(['other'])) self.assertEqual(e.fieldname, "no.o")
def test_invalid_str_to_buitin_fromjson(self): types = six.integer_types + (float, bool) value = '2a' for t in types: for ba in True, False: jd = '"%s"' if ba else '{"a": "%s"}' try: parse(jd % value, {'a': t}, ba) assert False, ( "Value '%s' should not parse correctly for %s." % (value, t)) except ClientSideError as e: self.assertIsInstance(e, InvalidInput) self.assertEqual(e.fieldname, 'a') self.assertEqual(e.value, value)
def test_invalid_str_to_buitin_fromjson(self): types = six.integer_types + (float,) value = '2a' for t in types: for ba in True, False: jd = '"%s"' if ba else '{"a": "%s"}' try: parse(jd % value, {'a': t}, ba) assert False, ( "Value '%s' should not parse correctly for %s." % (value, t) ) except ClientSideError as e: self.assertIsInstance(e, InvalidInput) self.assertEqual(e.fieldname, 'a') self.assertEqual(e.value, value)
def test_valid_int_fromjson(self): value = 2 for ba in True, False: jd = '%d' if ba else '{"a": %d}' i = parse(jd % value, {'a': int}, ba) self.assertEqual(i, {'a': 2}) self.assertIsInstance(i['a'], int)
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_empty_str_to_bool_fromjson(self): value = '' for ba in True, False: jd = '"%s"' if ba else '{"a": "%s"}' i = parse(jd % value, {'a': bool}, ba) self.assertIsInstance(i['a'], bool) self.assertFalse(i['a'])
def test_false_ints_to_bool(self): value = 0 for ba in True, False: jd = '%d' if ba else '{"a": %d}' i = parse(jd % value, {'a': bool}, ba) self.assertIsInstance(i['a'], bool) self.assertFalse(i['a'])
def test_false_strings_to_bool(self): false_values = ('false', 'f', 'no', 'n', 'off', '0') for value in false_values: for ba in True, False: jd = '"%s"' if ba else '{"a": "%s"}' i = parse(jd % value, {'a': bool}, ba) self.assertIsInstance(i['a'], bool) self.assertFalse(i['a'])
def test_valid_num_to_float_fromjson(self): values = 2, 2.3 for v in values: for ba in True, False: jd = '%f' if ba else '{"a": %f}' i = parse(jd % v, {'a': float}, ba) self.assertEqual(i, {'a': float(v)}) self.assertIsInstance(i['a'], float)
def test_true_ints_to_bool(self): true_values = (1, 5, -3) for value in true_values: for ba in True, False: jd = '%d' if ba else '{"a": %d}' i = parse(jd % value, {'a': bool}, ba) self.assertIsInstance(i['a'], bool) self.assertTrue(i['a'])
def test_true_strings_to_bool(self): true_values = ('true', 't', 'yes', 'y', 'on', '1') for value in true_values: for ba in True, False: jd = '"%s"' if ba else '{"a": "%s"}' i = parse(jd % value, {'a': bool}, ba) self.assertIsInstance(i['a'], bool) self.assertTrue(i['a'])
def test_valid_str_to_builtin_fromjson(self): types = six.integer_types + (bool, float) value = '2' for t in types: for ba in True, False: jd = '%s' if ba else '{"a": %s}' i = parse(jd % value, {'a': t}, ba) self.assertEqual( i, {'a': t(value)}, "Parsed value does not correspond for %s: " "%s != {'a': %s}" % (t, repr(i), repr(t(value)))) self.assertIsInstance(i['a'], t)
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_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_valid_str_to_builtin_fromjson(self): types = six.integer_types + (bool, float) value = '2' for t in types: for ba in True, False: jd = '%s' if ba else '{"a": %s}' i = parse(jd % value, {'a': t}, ba) self.assertEqual( i, {'a': t(value)}, "Parsed value does not correspond for %s: " "%s != {'a': %s}" % ( t, repr(i), repr(t(value)) ) ) self.assertIsInstance(i['a'], t)
def test_parse_valid_date_bodyarg(self): j = parse('"2011-01-01"', {'a': datetime.date}, True) assert isinstance(j['a'], datetime.date)
def test_parse_valid_date(self): j = parse('{"a": "2011-01-01"}', {'a': datetime.date}, False) assert isinstance(j['a'], datetime.date)