summaryrefslogtreecommitdiff
path: root/tests/test_cookies.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-10-10 12:00:59 -0400
committerChris McDonough <chrism@plope.com>2011-10-10 12:00:59 -0400
commit4b29bdaf6af8161320eb86ef25031afc11c4c083 (patch)
tree6aef2b2fee3496563aa793beb3271d2f481281cc /tests/test_cookies.py
parent7c963af17947612b3b0a67ca09bd60da12594e13 (diff)
downloadwebob-feature.cookie-bug-for-bug.tar.gz
* Mutating the ``request.cookies`` property now reflects the mutations intofeature.cookie-bug-for-bug
the ``HTTP_COOKIES`` environ header.
Diffstat (limited to 'tests/test_cookies.py')
-rw-r--r--tests/test_cookies.py183
1 files changed, 183 insertions, 0 deletions
diff --git a/tests/test_cookies.py b/tests/test_cookies.py
index 923978d..6a4c163 100644
--- a/tests/test_cookies.py
+++ b/tests/test_cookies.py
@@ -3,6 +3,9 @@ from datetime import timedelta
from webob import cookies
from webob.compat import text_
from nose.tools import eq_
+import unittest
+from webob.compat import native_
+from webob.compat import PY3
def test_cookie_empty():
c = cookies.Cookie() # empty cookie
@@ -140,3 +143,183 @@ def test_morsel_repr():
result = repr(v)
eq_(result, "<Morsel: a='b'>")
+class TestRequestCookies(unittest.TestCase):
+ def _makeOne(self, environ):
+ from webob.cookies import RequestCookies
+ return RequestCookies(environ)
+
+ def test_get_no_cache_key_in_environ_no_http_cookie_header(self):
+ environ = {}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.get('a'), None)
+ parsed = environ['webob._parsed_cookies']
+ self.assertEqual(parsed, ({}, ''))
+
+ def test_get_no_cache_key_in_environ_has_http_cookie_header(self):
+ header ='a=1; b=2'
+ environ = {'HTTP_COOKIE':header}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.get('a'), '1')
+ parsed = environ['webob._parsed_cookies'][0]
+ self.assertEqual(parsed['a'], '1')
+ self.assertEqual(parsed['b'], '2')
+ self.assertEqual(environ['HTTP_COOKIE'], header) # no change
+
+ def test_get_cache_key_in_environ_no_http_cookie_header(self):
+ environ = {'webob._parsed_cookies':({}, '')}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.get('a'), None)
+ parsed = environ['webob._parsed_cookies']
+ self.assertEqual(parsed, ({}, ''))
+
+ def test_get_cache_key_in_environ_has_http_cookie_header(self):
+ header ='a=1; b=2'
+ environ = {'HTTP_COOKIE':header, 'webob._parsed_cookies':({}, '')}
+ inst = self._makeOne(environ)
+ self.assertEqual(inst.get('a'), '1')
+ parsed = environ['webob._parsed_cookies'][0]
+ self.assertEqual(parsed['a'], '1')
+ self.assertEqual(parsed['b'], '2')
+ self.assertEqual(environ['HTTP_COOKIE'], header) # no change
+
+ def test___setitem__name_not_string_type(self):
+ inst = self._makeOne({})
+ self.assertRaises(TypeError, inst.__setitem__, None, 1)
+
+ def test___setitem__name_not_encodeable_to_ascii(self):
+ name = native_(b'La Pe\xc3\xb1a', 'utf-8')
+ inst = self._makeOne({})
+ self.assertRaises(TypeError, inst.__setitem__, name, 'abc')
+
+ def test___setitem__name_not_rfc2109_valid(self):
+ name = '$a'
+ inst = self._makeOne({})
+ self.assertRaises(TypeError, inst.__setitem__, name, 'abc')
+
+ def test___setitem__value_not_string_type(self):
+ inst = self._makeOne({})
+ self.assertRaises(ValueError, inst.__setitem__, 'a', None)
+
+ def test___setitem__value_not_utf_8_decodeable(self):
+ value = text_(b'La Pe\xc3\xb1a', 'utf-8')
+ value = value.encode('utf-16')
+ inst = self._makeOne({})
+ self.assertRaises(ValueError, inst.__setitem__, 'a', value)
+
+ def test__setitem__success_no_existing_headers(self):
+ value = native_(b'La Pe\xc3\xb1a', 'utf-8')
+ environ = {}
+ inst = self._makeOne(environ)
+ inst['a'] = value
+ self.assertEqual(environ['HTTP_COOKIE'], 'a="La Pe\\303\\261a"')
+
+ def test__setitem__success_append(self):
+ value = native_(b'La Pe\xc3\xb1a', 'utf-8')
+ environ = {'HTTP_COOKIE':'a=1; b=2'}
+ inst = self._makeOne(environ)
+ inst['c'] = value
+ self.assertEqual(
+ environ['HTTP_COOKIE'], 'a=1; b=2; c="La Pe\\303\\261a"')
+
+ def test__setitem__success_replace(self):
+ environ = {'HTTP_COOKIE':'a=1; b="La Pe\\303\\261a"; c=3'}
+ inst = self._makeOne(environ)
+ inst['b'] = 'abc'
+ self.assertEqual(environ['HTTP_COOKIE'], 'a=1; b=abc; c=3')
+ inst['c'] = '4'
+ self.assertEqual(environ['HTTP_COOKIE'], 'a=1; b=abc; c=4')
+
+ def test__delitem__fail_no_http_cookie(self):
+ environ = {}
+ inst = self._makeOne(environ)
+ self.assertRaises(KeyError, inst.__delitem__, 'a')
+ self.assertEqual(environ, {})
+
+ def test__delitem__fail_with_http_cookie(self):
+ environ = {'HTTP_COOKIE':''}
+ inst = self._makeOne(environ)
+ self.assertRaises(KeyError, inst.__delitem__, 'a')
+ self.assertEqual(environ, {'HTTP_COOKIE':''})
+
+ def test__delitem__success(self):
+ environ = {'HTTP_COOKIE':'a=1'}
+ inst = self._makeOne(environ)
+ del inst['a']
+ self.assertEqual(environ['HTTP_COOKIE'], '')
+ self.assertEqual(inst._cache, {})
+
+ def test_keys(self):
+ environ = {'HTTP_COOKIE':'a=1; b="La Pe\\303\\261a"; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(sorted(list(inst.keys())), ['a', 'b', 'c'])
+
+ def test_values(self):
+ val = text_(b'La Pe\xc3\xb1a', 'utf-8')
+ environ = {'HTTP_COOKIE':'a=1; b="La Pe\\303\\261a"; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(sorted(list(inst.values())), ['1', '3', val])
+
+ def test_items(self):
+ val = text_(b'La Pe\xc3\xb1a', 'utf-8')
+ environ = {'HTTP_COOKIE':'a=1; b="La Pe\\303\\261a"; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(sorted(list(inst.items())),
+ [('a', '1'), ('b', val), ('c', '3')])
+
+ if not PY3:
+ def test_iterkeys(self):
+ environ = {'HTTP_COOKIE':'a=1; b="La Pe\\303\\261a"; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(sorted(list(inst.iterkeys())), ['a', 'b', 'c'])
+
+ def test_itervalues(self):
+ val = text_(b'La Pe\xc3\xb1a', 'utf-8')
+ environ = {'HTTP_COOKIE':'a=1; b="La Pe\\303\\261a"; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(sorted(list(inst.itervalues())), ['1', '3', val])
+
+ def test_iteritems(self):
+ val = text_(b'La Pe\xc3\xb1a', 'utf-8')
+ environ = {'HTTP_COOKIE':'a=1; b="La Pe\\303\\261a"; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(sorted(list(inst.iteritems())),
+ [('a', '1'), ('b', val), ('c', '3')])
+
+ def test___contains__(self):
+ environ = {'HTTP_COOKIE':'a=1'}
+ inst = self._makeOne(environ)
+ self.assertTrue('a' in inst)
+ self.assertFalse('b' in inst)
+
+ def test___iter__(self):
+ environ = {'HTTP_COOKIE':'a=1; b=2; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(sorted(list(iter(inst))), ['a', 'b', 'c'])
+
+ def test___len__(self):
+ environ = {'HTTP_COOKIE':'a=1; b=2; c=3'}
+ inst = self._makeOne(environ)
+ self.assertEqual(len(inst), 3)
+ del inst['a']
+ self.assertEqual(len(inst), 2)
+
+ def test_clear(self):
+ environ = {'HTTP_COOKIE':'a=1; b=2; c=3'}
+ inst = self._makeOne(environ)
+ inst.clear()
+ self.assertEqual(environ['HTTP_COOKIE'], '')
+ self.assertEqual(inst.get('a'), None)
+
+ def test___repr__(self):
+ environ = {'HTTP_COOKIE':'a=1; b=2; c=3'}
+ inst = self._makeOne(environ)
+ r = repr(inst)
+ self.assertTrue(r.startswith(
+ '<RequestCookies (dict-like) with values '))
+ self.assertTrue(r.endswith('>'))
+
+
+
+
+
+