|
18 | 18 | import datetime |
19 | 19 | import pickle |
20 | 20 | import re |
| 21 | +import UserDict |
| 22 | +import collections |
| 23 | +import json |
21 | 24 |
|
22 | 25 |
|
23 | 26 | DUMMYSTATUS = status.HTTP_200_OK |
@@ -244,6 +247,60 @@ def test_render_lazy_strings(self): |
244 | 247 | ret = JSONRenderer().render(_('test')) |
245 | 248 | self.assertEqual(ret, b'"test"') |
246 | 249 |
|
| 250 | + def test_render_userdict_obj(self): |
| 251 | + class DictLike(UserDict.DictMixin): |
| 252 | + def __init__(self): |
| 253 | + self._dict = dict() |
| 254 | + def __getitem__(self, key): |
| 255 | + return self._dict.__getitem__(key) |
| 256 | + def __setitem__(self, key, value): |
| 257 | + return self._dict.__setitem__(key, value) |
| 258 | + def __delitem__(self, key): |
| 259 | + return self._dict.__delitem__(key) |
| 260 | + def keys(self): |
| 261 | + return self._dict.keys() |
| 262 | + x = DictLike() |
| 263 | + x['a'] = 1 |
| 264 | + x['b'] = "string value" |
| 265 | + ret = JSONRenderer().render(x) |
| 266 | + self.assertEquals(json.loads(ret), {u'a': 1, u'b': u'string value'}) |
| 267 | + |
| 268 | + def test_render_dict_abc_obj(self): |
| 269 | + class Dict(collections.MutableMapping): |
| 270 | + def __init__(self): |
| 271 | + self._dict = dict() |
| 272 | + def __getitem__(self, key): |
| 273 | + return self._dict.__getitem__(key) |
| 274 | + def __setitem__(self, key, value): |
| 275 | + return self._dict.__setitem__(key, value) |
| 276 | + def __delitem__(self, key): |
| 277 | + return self._dict.__delitem__(key) |
| 278 | + def __iter__(self): |
| 279 | + return self._dict.__iter__() |
| 280 | + def __len__(self): |
| 281 | + return self._dict.__len__() |
| 282 | + |
| 283 | + x = Dict() |
| 284 | + x['key'] = 'string value' |
| 285 | + x[2] = 3 |
| 286 | + ret = JSONRenderer().render(x) |
| 287 | + self.assertEquals(json.loads(ret), {u'key': 'string value', u'2': 3}) |
| 288 | + |
| 289 | + |
| 290 | + def test_render_obj_with_getitem(self): |
| 291 | + class DictLike(object): |
| 292 | + def __init__(self): |
| 293 | + self._dict = {} |
| 294 | + def set(self, value): |
| 295 | + self._dict = dict(value) |
| 296 | + def __getitem__(self, key): |
| 297 | + return self._dict[key] |
| 298 | + |
| 299 | + x = DictLike() |
| 300 | + x.set({'a': 1, 'b': 'string'}) |
| 301 | + with self.assertRaises(TypeError): |
| 302 | + JSONRenderer().render(x) |
| 303 | + |
247 | 304 | def test_without_content_type_args(self): |
248 | 305 | """ |
249 | 306 | Test basic JSON rendering. |
|
0 commit comments