9
Traceback (most recent call last):
11
MultiValueDictKeyError: "Key 'foo' not found in <QueryDict: {}>"
13
>>> q['something'] = 'bar'
14
Traceback (most recent call last):
16
AttributeError: This QueryDict instance is immutable
18
>>> q.get('foo', 'default')
24
>>> q.setlist('foo', ['bar', 'baz'])
25
Traceback (most recent call last):
27
AttributeError: This QueryDict instance is immutable
29
>>> q.appendlist('foo', ['bar'])
30
Traceback (most recent call last):
32
AttributeError: This QueryDict instance is immutable
55
>>> q.update({'foo': 'bar'})
56
Traceback (most recent call last):
58
AttributeError: This QueryDict instance is immutable
61
Traceback (most recent call last):
63
AttributeError: This QueryDict instance is immutable
66
Traceback (most recent call last):
68
AttributeError: This QueryDict instance is immutable
71
Traceback (most recent call last):
73
AttributeError: This QueryDict instance is immutable
75
>>> q.setdefault('foo', 'bar')
76
Traceback (most recent call last):
78
AttributeError: This QueryDict instance is immutable
83
###################################
84
# Mutable copy of empty QueryDict #
85
###################################
90
Traceback (most recent call last):
92
MultiValueDictKeyError: "Key 'foo' not found in <QueryDict: {}>"
94
>>> q['name'] = 'john'
103
>>> q['name'] = 'john'
105
>>> q.get('foo', 'default')
108
>>> q.get('name', 'default')
111
>>> q.getlist('name')
117
>>> q.setlist('foo', ['bar', 'baz'])
119
>>> q.get('foo', 'default')
125
>>> q.appendlist('foo', 'another')
128
[u'bar', u'baz', u'another']
140
[(u'foo', u'another'), (u'name', u'john')]
143
[(u'foo', [u'bar', u'baz', u'another']), (u'name', [u'john'])]
149
[u'another', u'john']
154
>>> q.update({'foo': 'hello'})
156
# Displays last value
160
>>> q.get('foo', 'not available')
164
[u'bar', u'baz', u'another', u'hello']
167
[u'bar', u'baz', u'another', u'hello']
169
>>> q.pop('foo', 'not there')
172
>>> q.get('foo', 'not there')
175
>>> q.setdefault('foo', 'bar')
192
#####################################
193
# QueryDict with one key/value pair #
194
#####################################
196
>>> q = QueryDict('foo=bar')
202
Traceback (most recent call last):
204
MultiValueDictKeyError: "Key 'bar' not found in <QueryDict: {u'foo': [u'bar']}>"
206
>>> q['something'] = 'bar'
207
Traceback (most recent call last):
209
AttributeError: This QueryDict instance is immutable
211
>>> q.get('foo', 'default')
214
>>> q.get('bar', 'default')
223
>>> q.setlist('foo', ['bar', 'baz'])
224
Traceback (most recent call last):
226
AttributeError: This QueryDict instance is immutable
228
>>> q.appendlist('foo', ['bar'])
229
Traceback (most recent call last):
231
AttributeError: This QueryDict instance is immutable
260
>>> q.update({'foo': 'bar'})
261
Traceback (most recent call last):
263
AttributeError: This QueryDict instance is immutable
266
Traceback (most recent call last):
268
AttributeError: This QueryDict instance is immutable
271
Traceback (most recent call last):
273
AttributeError: This QueryDict instance is immutable
276
Traceback (most recent call last):
278
AttributeError: This QueryDict instance is immutable
280
>>> q.setdefault('foo', 'bar')
281
Traceback (most recent call last):
283
AttributeError: This QueryDict instance is immutable
288
#####################################################
289
# QueryDict with two key/value pairs with same keys #
290
#####################################################
292
>>> q = QueryDict('vote=yes&vote=no')
297
>>> q['something'] = 'bar'
298
Traceback (most recent call last):
300
AttributeError: This QueryDict instance is immutable
302
>>> q.get('vote', 'default')
305
>>> q.get('foo', 'default')
308
>>> q.getlist('vote')
314
>>> q.setlist('foo', ['bar', 'baz'])
315
Traceback (most recent call last):
317
AttributeError: This QueryDict instance is immutable
319
>>> q.appendlist('foo', ['bar'])
320
Traceback (most recent call last):
322
AttributeError: This QueryDict instance is immutable
324
>>> q.has_key('vote')
340
[(u'vote', [u'yes', u'no'])]
351
>>> q.update({'foo': 'bar'})
352
Traceback (most recent call last):
354
AttributeError: This QueryDict instance is immutable
357
Traceback (most recent call last):
359
AttributeError: This QueryDict instance is immutable
362
Traceback (most recent call last):
364
AttributeError: This QueryDict instance is immutable
367
Traceback (most recent call last):
369
AttributeError: This QueryDict instance is immutable
371
>>> q.setdefault('foo', 'bar')
372
Traceback (most recent call last):
374
AttributeError: This QueryDict instance is immutable
380
Traceback (most recent call last):
382
AttributeError: This QueryDict instance is immutable
384
# QueryDicts must be able to handle invalid input encoding (in this case, bad
386
>>> q = QueryDict('foo=bar&foo=\xff')
395
########################
396
# Pickling a QueryDict #
397
########################
399
>>> q = QueryDict('')
400
>>> q1 = pickle.loads(pickle.dumps(q, 2))
403
>>> q = QueryDict('a=b&c=d')
404
>>> q1 = pickle.loads(pickle.dumps(q, 2))
407
>>> q = QueryDict('a=b&c=d&a=1')
408
>>> q1 = pickle.loads(pickle.dumps(q, 2))
412
######################################
413
# HttpResponse with Unicode headers #
414
######################################
416
>>> r = HttpResponse()
418
If we insert a unicode value it will be converted to an ascii
419
string. This makes sure we comply with the HTTP specifications.
421
>>> r['value'] = u'test value'
422
>>> isinstance(r['value'], str)
425
An error is raised When a unicode object with non-ascii is assigned.
427
>>> r['value'] = u't\xebst value' # doctest:+ELLIPSIS
428
Traceback (most recent call last):
430
UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
432
The response also converts unicode keys to strings.
434
>>> r[u'test'] = 'testing key'
435
>>> l = list(r.items())
438
('test', 'testing key')
440
It will also raise errors for keys with non-ascii data.
442
>>> r[u't\xebst'] = 'testing key' # doctest:+ELLIPSIS
443
Traceback (most recent call last):
445
UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
447
# Bug #10188: Do not allow newlines in headers (CR or LF)
448
>>> r['test\\rstr'] = 'test'
449
Traceback (most recent call last):
451
BadHeaderError: Header values can't contain newlines (got 'test\\rstr')
453
>>> r['test\\nstr'] = 'test'
454
Traceback (most recent call last):
456
BadHeaderError: Header values can't contain newlines (got 'test\\nstr')
459
# Regression test for #8278: QueryDict.update(QueryDict)
461
>>> x = QueryDict("a=1&a=2", mutable=True)
462
>>> y = QueryDict("a=3&a=4")
465
[u'1', u'2', u'3', u'4']
468
from django.http import QueryDict, HttpResponse, CompatCookie
469
from django.test import TestCase
472
class Cookies(TestCase):
4
from django.http import QueryDict, HttpResponse, CompatCookie, BadHeaderError
6
class QueryDictTests(unittest.TestCase):
7
def test_missing_key(self):
9
self.assertRaises(KeyError, q.__getitem__, 'foo')
11
def test_immutability(self):
13
self.assertRaises(AttributeError, q.__setitem__, 'something', 'bar')
14
self.assertRaises(AttributeError, q.setlist, 'foo', ['bar'])
15
self.assertRaises(AttributeError, q.appendlist, 'foo', ['bar'])
16
self.assertRaises(AttributeError, q.update, {'foo': 'bar'})
17
self.assertRaises(AttributeError, q.pop, 'foo')
18
self.assertRaises(AttributeError, q.popitem)
19
self.assertRaises(AttributeError, q.clear)
21
def test_immutable_get_with_default(self):
23
self.assertEqual(q.get('foo', 'default'), 'default')
25
def test_immutable_basic_operations(self):
27
self.assertEqual(q.getlist('foo'), [])
28
self.assertEqual(q.has_key('foo'), False)
29
self.assertEqual('foo' in q, False)
30
self.assertEqual(q.items(), [])
31
self.assertEqual(q.lists(), [])
32
self.assertEqual(q.items(), [])
33
self.assertEqual(q.keys(), [])
34
self.assertEqual(q.values(), [])
35
self.assertEqual(len(q), 0)
36
self.assertEqual(q.urlencode(), '')
38
def test_single_key_value(self):
39
"""Test QueryDict with one key/value pair"""
41
q = QueryDict('foo=bar')
42
self.assertEqual(q['foo'], 'bar')
43
self.assertRaises(KeyError, q.__getitem__, 'bar')
44
self.assertRaises(AttributeError, q.__setitem__, 'something', 'bar')
46
self.assertEqual(q.get('foo', 'default'), 'bar')
47
self.assertEqual(q.get('bar', 'default'), 'default')
48
self.assertEqual(q.getlist('foo'), ['bar'])
49
self.assertEqual(q.getlist('bar'), [])
51
self.assertRaises(AttributeError, q.setlist, 'foo', ['bar'])
52
self.assertRaises(AttributeError, q.appendlist, 'foo', ['bar'])
54
self.failUnless(q.has_key('foo'))
55
self.failUnless('foo' in q)
56
self.failIf(q.has_key('bar'))
57
self.failIf('bar' in q)
59
self.assertEqual(q.items(), [(u'foo', u'bar')])
60
self.assertEqual(q.lists(), [(u'foo', [u'bar'])])
61
self.assertEqual(q.keys(), ['foo'])
62
self.assertEqual(q.values(), ['bar'])
63
self.assertEqual(len(q), 1)
65
self.assertRaises(AttributeError, q.update, {'foo': 'bar'})
66
self.assertRaises(AttributeError, q.pop, 'foo')
67
self.assertRaises(AttributeError, q.popitem)
68
self.assertRaises(AttributeError, q.clear)
69
self.assertRaises(AttributeError, q.setdefault, 'foo', 'bar')
71
self.assertEqual(q.urlencode(), 'foo=bar')
73
def test_mutable_copy(self):
74
"""A copy of a QueryDict is mutable."""
75
q = QueryDict('').copy()
76
self.assertRaises(KeyError, q.__getitem__, "foo")
78
self.assertEqual(q['name'], 'john')
80
def test_mutable_delete(self):
81
q = QueryDict('').copy()
84
self.failIf('name' in q)
86
def test_basic_mutable_operations(self):
87
q = QueryDict('').copy()
89
self.assertEqual(q.get('foo', 'default'), 'default')
90
self.assertEqual(q.get('name', 'default'), 'john')
91
self.assertEqual(q.getlist('name'), ['john'])
92
self.assertEqual(q.getlist('foo'), [])
94
q.setlist('foo', ['bar', 'baz'])
95
self.assertEqual(q.get('foo', 'default'), 'baz')
96
self.assertEqual(q.getlist('foo'), ['bar', 'baz'])
98
q.appendlist('foo', 'another')
99
self.assertEqual(q.getlist('foo'), ['bar', 'baz', 'another'])
100
self.assertEqual(q['foo'], 'another')
101
self.failUnless(q.has_key('foo'))
102
self.failUnless('foo' in q)
104
self.assertEqual(q.items(), [(u'foo', u'another'), (u'name', u'john')])
105
self.assertEqual(q.lists(), [(u'foo', [u'bar', u'baz', u'another']), (u'name', [u'john'])])
106
self.assertEqual(q.keys(), [u'foo', u'name'])
107
self.assertEqual(q.values(), [u'another', u'john'])
108
self.assertEqual(len(q), 2)
110
q.update({'foo': 'hello'})
111
self.assertEqual(q['foo'], 'hello')
112
self.assertEqual(q.get('foo', 'not available'), 'hello')
113
self.assertEqual(q.getlist('foo'), [u'bar', u'baz', u'another', u'hello'])
114
self.assertEqual(q.pop('foo'), [u'bar', u'baz', u'another', u'hello'])
115
self.assertEqual(q.pop('foo', 'not there'), 'not there')
116
self.assertEqual(q.get('foo', 'not there'), 'not there')
117
self.assertEqual(q.setdefault('foo', 'bar'), 'bar')
118
self.assertEqual(q['foo'], 'bar')
119
self.assertEqual(q.getlist('foo'), ['bar'])
120
self.assertEqual(q.urlencode(), 'foo=bar&name=john')
123
self.assertEqual(len(q), 0)
125
def test_multiple_keys(self):
126
"""Test QueryDict with two key/value pairs with same keys."""
128
q = QueryDict('vote=yes&vote=no')
130
self.assertEqual(q['vote'], u'no')
131
self.assertRaises(AttributeError, q.__setitem__, 'something', 'bar')
133
self.assertEqual(q.get('vote', 'default'), u'no')
134
self.assertEqual(q.get('foo', 'default'), 'default')
135
self.assertEqual(q.getlist('vote'), [u'yes', u'no'])
136
self.assertEqual(q.getlist('foo'), [])
138
self.assertRaises(AttributeError, q.setlist, 'foo', ['bar', 'baz'])
139
self.assertRaises(AttributeError, q.setlist, 'foo', ['bar', 'baz'])
140
self.assertRaises(AttributeError, q.appendlist, 'foo', ['bar'])
142
self.assertEqual(q.has_key('vote'), True)
143
self.assertEqual('vote' in q, True)
144
self.assertEqual(q.has_key('foo'), False)
145
self.assertEqual('foo' in q, False)
146
self.assertEqual(q.items(), [(u'vote', u'no')])
147
self.assertEqual(q.lists(), [(u'vote', [u'yes', u'no'])])
148
self.assertEqual(q.keys(), [u'vote'])
149
self.assertEqual(q.values(), [u'no'])
150
self.assertEqual(len(q), 1)
152
self.assertRaises(AttributeError, q.update, {'foo': 'bar'})
153
self.assertRaises(AttributeError, q.pop, 'foo')
154
self.assertRaises(AttributeError, q.popitem)
155
self.assertRaises(AttributeError, q.clear)
156
self.assertRaises(AttributeError, q.setdefault, 'foo', 'bar')
157
self.assertRaises(AttributeError, q.__delitem__, 'vote')
159
def test_invalid_input_encoding(self):
161
QueryDicts must be able to handle invalid input encoding (in this
162
case, bad UTF-8 encoding).
164
q = QueryDict('foo=bar&foo=\xff')
165
self.assertEqual(q['foo'], u'\ufffd')
166
self.assertEqual(q.getlist('foo'), [u'bar', u'\ufffd'])
168
def test_pickle(self):
170
q1 = pickle.loads(pickle.dumps(q, 2))
171
self.assertEqual(q == q1, True)
172
q = QueryDict('a=b&c=d')
173
q1 = pickle.loads(pickle.dumps(q, 2))
174
self.assertEqual(q == q1, True)
175
q = QueryDict('a=b&c=d&a=1')
176
q1 = pickle.loads(pickle.dumps(q, 2))
177
self.assertEqual(q == q1 , True)
179
def test_update_from_querydict(self):
180
"""Regression test for #8278: QueryDict.update(QueryDict)"""
181
x = QueryDict("a=1&a=2", mutable=True)
182
y = QueryDict("a=3&a=4")
184
self.assertEqual(x.getlist('a'), [u'1', u'2', u'3', u'4'])
186
def test_non_default_encoding(self):
187
"""#13572 - QueryDict with a non-default encoding"""
188
q = QueryDict('sbb=one', encoding='rot_13')
189
self.assertEqual(q.encoding , 'rot_13' )
190
self.assertEqual(q.items() , [(u'foo', u'bar')] )
191
self.assertEqual(q.urlencode() , 'sbb=one' )
193
self.assertEqual(q.encoding , 'rot_13' )
194
self.assertEqual(q.items() , [(u'foo', u'bar')] )
195
self.assertEqual(q.urlencode() , 'sbb=one' )
196
self.assertEqual(copy.copy(q).encoding , 'rot_13' )
197
self.assertEqual(copy.deepcopy(q).encoding , 'rot_13')
199
class HttpResponseTests(unittest.TestCase):
200
def test_unicode_headers(self):
203
# If we insert a unicode value it will be converted to an ascii
204
r['value'] = u'test value'
205
self.failUnless(isinstance(r['value'], str))
207
# An error is raised ~hen a unicode object with non-ascii is assigned.
208
self.assertRaises(UnicodeEncodeError, r.__setitem__, 'value', u't\xebst value')
210
# An error is raised when a unicode object with non-ASCII format is
211
# passed as initial mimetype or content_type.
212
self.assertRaises(UnicodeEncodeError, HttpResponse,
213
mimetype=u't\xebst value')
215
# HttpResponse headers must be convertible to ASCII.
216
self.assertRaises(UnicodeEncodeError, HttpResponse,
217
content_type=u't\xebst value')
219
# The response also converts unicode keys to strings.)
220
r[u'test'] = 'testing key'
223
self.assertEqual(l[1], ('test', 'testing key'))
225
# It will also raise errors for keys with non-ascii data.
226
self.assertRaises(UnicodeEncodeError, r.__setitem__, u't\xebst key', 'value')
228
def test_newlines_in_headers(self):
229
# Bug #10188: Do not allow newlines in headers (CR or LF)
231
self.assertRaises(BadHeaderError, r.__setitem__, 'test\rstr', 'test')
232
self.assertRaises(BadHeaderError, r.__setitem__, 'test\nstr', 'test')
234
class CookieTests(unittest.TestCase):
474
235
def test_encode(self):
476
237
Test that we don't output tricky characters in encoded value