summaryrefslogtreecommitdiff
path: root/tests/test_multidict.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_multidict.py')
-rw-r--r--tests/test_multidict.py330
1 files changed, 292 insertions, 38 deletions
diff --git a/tests/test_multidict.py b/tests/test_multidict.py
index b4db015..d3ec57e 100644
--- a/tests/test_multidict.py
+++ b/tests/test_multidict.py
@@ -3,98 +3,213 @@
import unittest
from webob import multidict
-class MultiDictTestCase(unittest.TestCase):
- klass = multidict.MultiDict
- data = multidict.MultiDict([('a', u'\xe9'), ('a', 'e'), ('b', 1)])
-
+class BaseDictTests(object):
def setUp(self):
- self.d = self._get_instance()
+ self._list = [('a', u'\xe9'), ('a', 'e'), ('a', 'f'), ('b', 1)]
+ self.data = multidict.MultiDict(self._list)
+ self.d = self._get_instance()
def _get_instance(self):
return self.klass(self.data.copy())
def test_len(self):
- assert len(self.d) == 3
+ self.assertEqual(len(self.d), 4)
def test_getone(self):
- assert self.d.getone('b') == 1
+ self.assertEqual(self.d.getone('b'), 1)
+
+ def test_getone_missing(self):
+ self.assertRaises(KeyError, self.d.getone, 'z')
+
+ def test_getone_multiple_raises(self):
self.assertRaises(KeyError, self.d.getone, 'a')
def test_getall(self):
- assert self.d.getall('b') == [1]
+ self.assertEqual(self.d.getall('b'), [1])
def test_dict_of_lists(self):
- assert self.d.dict_of_lists() == {'a': [u'\xe9', u'e'], 'b': [1]}, self.d.dict_of_lists()
+ self.assertEqual(
+ self.d.dict_of_lists(),
+ {'a': [u'\xe9', u'e', u'f'], 'b': [1]})
def test_dict_api(self):
- assert 'a' in self.d.mixed()
- assert 'a' in self.d.keys()
- assert 'a' in self.d.iterkeys()
- assert ('b', 1) in self.d.items()
- assert ('b', 1) in self.d.iteritems()
- assert 1 in self.d.values()
- assert 1 in self.d.itervalues()
- assert len(self.d) == 3
+ self.assertTrue('a' in self.d.mixed())
+ self.assertTrue('a' in self.d.keys())
+ self.assertTrue('a' in self.d.iterkeys())
+ self.assertTrue(('b', 1) in self.d.items())
+ self.assertTrue(('b', 1) in self.d.iteritems())
+ self.assertTrue(1 in self.d.values())
+ self.assertTrue(1 in self.d.itervalues())
+ self.assertEqual(len(self.d), 4)
def test_set_del_item(self):
d = self._get_instance()
- assert 'a' in d
+ self.assertTrue('a' in d)
del d['a']
- assert 'a' not in d
- d['a'] = 1
+ self.assertTrue(not 'a' in d)
def test_pop(self):
d = self._get_instance()
d['a'] = 1
- assert d.pop('a') == 1
- assert d.pop('x', 1) == 1
- assert d.popitem() == ('b', 1)
+ self.assertEqual(d.pop('a'), 1)
+ self.assertEqual(d.pop('x', 1), 1)
+
+ def test_pop_wrong_args(self):
+ d = self._get_instance()
+ self.assertRaises(TypeError, d.pop, 'a', 1, 1)
+
+ def test_pop_missing(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.pop, 'z')
+
+ def test_popitem(self):
+ d = self._get_instance()
+ self.assertEqual(d.popitem(), ('b', 1))
def test_update(self):
d = self._get_instance()
d.update(e=1)
- assert 'e' in d
+ self.assertTrue('e' in d)
d.update(dict(x=1))
- assert 'x' in d
+ self.assertTrue('x' in d)
d.update([('y', 1)])
- assert 'y' in d
+ self.assertTrue('y' in d)
def test_setdefault(self):
d = self._get_instance()
d.setdefault('a', 1)
- assert d['a'] != 1
+ self.assertNotEqual(d['a'], 1)
d.setdefault('e', 1)
- assert 'e' in d
+ self.assertTrue('e' in d)
def test_add(self):
d = self._get_instance()
d.add('b', 3)
- assert d.getall('b') == [1, 3]
+ self.assertEqual(d.getall('b'), [1, 3])
def test_copy(self):
assert self.d.copy() is not self.d
if hasattr(self.d, 'multi'):
- assert self.d.copy().multi is not self.d.multi
- assert self.d.copy() is not self.d.multi
+ self.assertFalse(self.d.copy().multi is self.d.multi)
+ self.assertFalse(self.d.copy() is self.d.multi)
def test_clear(self):
d = self._get_instance()
d.clear()
- assert len(d) == 0
+ self.assertEqual(len(d), 0)
def test_nonzero(self):
d = self._get_instance()
- assert d
+ self.assertTrue(d)
d.clear()
- assert not d
+ self.assertFalse(d)
+
+ def test_repr(self):
+ self.assertTrue(repr(self._get_instance()))
+ def test_too_many_args(self):
+ from webob.multidict import MultiDict
+ self.assertRaises(TypeError, MultiDict, 1, 2)
-class UnicodeMultiDictTestCase(MultiDictTestCase):
+ def test_no_args(self):
+ from webob.multidict import MultiDict
+ md = MultiDict()
+ self.assertEqual(md._items, [])
+
+ def test_kwargs(self):
+ from webob.multidict import MultiDict
+ md = MultiDict(kw1='val1')
+ self.assertEqual(md._items, [('kw1','val1')])
+
+ def test_view_list_not_list(self):
+ from webob.multidict import MultiDict
+ d = MultiDict()
+ self.assertRaises(TypeError, d.view_list, 42)
+
+ def test_view_list(self):
+ from webob.multidict import MultiDict
+ d = MultiDict()
+ self.assertEqual(d.view_list([1,2])._items, [1,2])
+
+ def test_from_fieldstorage_with_filename(self):
+ from webob.multidict import MultiDict
+ d = MultiDict()
+ fs = DummyFieldStorage('a', '1', 'file')
+ self.assertEqual(d.from_fieldstorage(fs), MultiDict({'a':fs.list[0]}))
+
+ def test_from_fieldstorage_without_filename(self):
+ from webob.multidict import MultiDict
+ d = MultiDict()
+ fs = DummyFieldStorage('a', '1')
+ self.assertEqual(d.from_fieldstorage(fs), MultiDict({'a':'1'}))
+
+class MultiDictTestCase(BaseDictTests, unittest.TestCase):
+ klass = multidict.MultiDict
+
+ def test_update_behavior_warning(self):
+ import warnings
+ class Foo(dict):
+ def __len__(self):
+ return 0
+ foo = Foo()
+ foo['a'] = 1
+ d = self._get_instance()
+ try:
+ warnings.simplefilter('error')
+ self.assertRaises(UserWarning, d.update, foo)
+ finally:
+ warnings.resetwarnings()
+
+class UnicodeMultiDictTestCase(BaseDictTests, unittest.TestCase):
klass = multidict.UnicodeMultiDict
-class NestedMultiDictTestCase(MultiDictTestCase):
+ def test_decode_key(self):
+ d = self._get_instance()
+ d.decode_keys = True
+
+ class Key(object):
+ pass
+
+ key = Key()
+ self.assertEquals(key, d._decode_key(key))
+
+ def test_decode_value(self):
+ import cgi
+
+ d = self._get_instance()
+ d.decode_keys = True
+
+ fs = cgi.FieldStorage()
+ fs.name = 'a'
+ self.assertEqual(d._decode_value(fs).name, 'a')
+
+ def test_encode_key(self):
+ d = self._get_instance()
+ value = unicode('a')
+ d.decode_keys = True
+ self.assertEquals(d._encode_key(value),'a')
+
+ def test_encode_value(self):
+ d = self._get_instance()
+ value = unicode('a')
+ self.assertEquals(d._encode_value(value),'a')
+
+class NestedMultiDictTestCase(BaseDictTests, unittest.TestCase):
klass = multidict.NestedMultiDict
+ def test_getitem(self):
+ d = self.klass({'a':1})
+ self.assertEqual(d['a'], 1)
+
+ def test_getitem_raises(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.__getitem__, 'z')
+
+ def test_contains(self):
+ d = self._get_instance()
+ self.assertEquals(d.__contains__('a'), True)
+ self.assertEquals(d.__contains__('z'), False)
+
def test_add(self):
d = self._get_instance()
self.assertRaises(KeyError, d.add, 'b', 3)
@@ -119,17 +234,156 @@ class NestedMultiDictTestCase(MultiDictTestCase):
self.assertRaises(KeyError, d.pop, 'a')
self.assertRaises(KeyError, d.pop, 'a', 1)
+ def test_popitem(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.popitem, 'a')
+
+ def test_pop_wrong_args(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.pop, 'a', 1, 1)
+
def test_clear(self):
d = self._get_instance()
self.assertRaises(KeyError, d.clear)
def test_nonzero(self):
d = self._get_instance()
- assert d
+ self.assertEqual(d.__nonzero__(), True)
+ d.dicts = [{}]
+ self.assertEqual(d.__nonzero__(), False)
+ assert not d
-class TrackableMultiDict(MultiDictTestCase):
+class TrackableMultiDict(BaseDictTests, unittest.TestCase):
klass = multidict.TrackableMultiDict
def _get_instance(self):
def tracker(*args, **kwargs): pass
return self.klass(self.data.copy(), __tracker=tracker, __name='tracker')
+
+ def test_inititems(self):
+ #The first argument passed into the __init__ method
+ class Arg:
+ def items(self):
+ return [('a', u'\xe9'), ('a', 'e'), ('a', 'f'), ('b', 1)]
+
+ d = self._get_instance()
+ d._items = None
+ d.__init__(Arg())
+ self.assertEquals(self.d._items, self._list)
+
+ def test_nullextend(self):
+ d = self._get_instance()
+ self.assertEqual(d.extend(), None)
+ d.extend(test = 'a')
+ self.assertEqual(d['test'], 'a')
+
+ def test_listextend(self):
+ class Other:
+ def items(self):
+ return [u'\xe9', u'e', r'f', 1]
+
+ other = Other()
+ d = self._get_instance()
+ d.extend(other)
+
+ _list = [u'\xe9', u'e', r'f', 1]
+ for v in _list:
+ self.assertTrue(v in d._items)
+
+ def test_dictextend(self):
+ class Other:
+ def __getitem__(self, item):
+ return {'a':1, 'b':2, 'c':3}.get(item)
+
+ def keys(self):
+ return ['a', 'b', 'c']
+
+ other = Other()
+ d = self._get_instance()
+ d.extend(other)
+
+ _list = [('a', 1), ('b', 2), ('c', 3)]
+ for v in _list:
+ self.assertTrue(v in d._items)
+
+ def test_otherextend(self):
+ class Other(object):
+ def __iter__(self):
+ return iter([('a', 1)])
+
+ other = Other()
+ d = self._get_instance()
+ d.extend(other)
+
+ _list = [('a', 1)]
+ for v in _list:
+ self.assertTrue(v in d._items)
+
+class NoVarsTestCase(unittest.TestCase):
+ klass = multidict.NoVars
+
+ def _get_instance(self):
+ return self.klass()
+
+ def test_getitem(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.__getitem__, 'a')
+
+ def test_setitem(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.__setitem__, 'a')
+
+ def test_delitem(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.__delitem__, 'a')
+
+ def test_get(self):
+ d = self._get_instance()
+ self.assertEqual(d.get('a', default = 'b'), 'b')
+
+ def test_getall(self):
+ d = self._get_instance()
+ self.assertEqual(d.getall('a'), [])
+
+ def test_getone(self):
+ d = self._get_instance()
+ self.assertRaises(KeyError, d.getone, 'a')
+
+ def test_mixed(self):
+ d = self._get_instance()
+ self.assertEqual(d.mixed(), {})
+
+ def test_contains(self):
+ d = self._get_instance()
+ self.assertEqual(d.__contains__('a'), False)
+
+ def test_copy(self):
+ d = self._get_instance()
+ self.assertEqual(d.copy(), d)
+
+ def test_len(self):
+ d = self._get_instance()
+ self.assertEqual(len(d), 0)
+
+ def test_repr(self):
+ d = self._get_instance()
+ self.assertEqual(repr(d), '<NoVars: N/A>')
+
+ def test_keys(self):
+ d = self._get_instance()
+ self.assertEqual(d.keys(), [])
+
+ def test_iterkeys(self):
+ d = self._get_instance()
+ self.assertEqual(list(d.iterkeys()), [])
+
+class DummyField(object):
+ def __init__(self, name, value, filename=None):
+ self.name = name
+ self.value = value
+ self.filename = filename
+
+class DummyFieldStorage(object):
+ def __init__(self, name, value, filename=None):
+ self.list = [DummyField(name, value, filename)]
+