test_for_json.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import unittest
  2. import simplejson as json
  3. class ForJson(object):
  4. def for_json(self):
  5. return {'for_json': 1}
  6. class NestedForJson(object):
  7. def for_json(self):
  8. return {'nested': ForJson()}
  9. class ForJsonList(object):
  10. def for_json(self):
  11. return ['list']
  12. class DictForJson(dict):
  13. def for_json(self):
  14. return {'alpha': 1}
  15. class ListForJson(list):
  16. def for_json(self):
  17. return ['list']
  18. class TestForJson(unittest.TestCase):
  19. def assertRoundTrip(self, obj, other, for_json=True):
  20. if for_json is None:
  21. # None will use the default
  22. s = json.dumps(obj)
  23. else:
  24. s = json.dumps(obj, for_json=for_json)
  25. self.assertEqual(
  26. json.loads(s),
  27. other)
  28. def test_for_json_encodes_stand_alone_object(self):
  29. self.assertRoundTrip(
  30. ForJson(),
  31. ForJson().for_json())
  32. def test_for_json_encodes_object_nested_in_dict(self):
  33. self.assertRoundTrip(
  34. {'hooray': ForJson()},
  35. {'hooray': ForJson().for_json()})
  36. def test_for_json_encodes_object_nested_in_list_within_dict(self):
  37. self.assertRoundTrip(
  38. {'list': [0, ForJson(), 2, 3]},
  39. {'list': [0, ForJson().for_json(), 2, 3]})
  40. def test_for_json_encodes_object_nested_within_object(self):
  41. self.assertRoundTrip(
  42. NestedForJson(),
  43. {'nested': {'for_json': 1}})
  44. def test_for_json_encodes_list(self):
  45. self.assertRoundTrip(
  46. ForJsonList(),
  47. ForJsonList().for_json())
  48. def test_for_json_encodes_list_within_object(self):
  49. self.assertRoundTrip(
  50. {'nested': ForJsonList()},
  51. {'nested': ForJsonList().for_json()})
  52. def test_for_json_encodes_dict_subclass(self):
  53. self.assertRoundTrip(
  54. DictForJson(a=1),
  55. DictForJson(a=1).for_json())
  56. def test_for_json_encodes_list_subclass(self):
  57. self.assertRoundTrip(
  58. ListForJson(['l']),
  59. ListForJson(['l']).for_json())
  60. def test_for_json_ignored_if_not_true_with_dict_subclass(self):
  61. for for_json in (None, False):
  62. self.assertRoundTrip(
  63. DictForJson(a=1),
  64. {'a': 1},
  65. for_json=for_json)
  66. def test_for_json_ignored_if_not_true_with_list_subclass(self):
  67. for for_json in (None, False):
  68. self.assertRoundTrip(
  69. ListForJson(['l']),
  70. ['l'],
  71. for_json=for_json)
  72. def test_raises_typeerror_if_for_json_not_true_with_object(self):
  73. self.assertRaises(TypeError, json.dumps, ForJson())
  74. self.assertRaises(TypeError, json.dumps, ForJson(), for_json=False)