~ubuntu-branches/ubuntu/quantal/python-django/quantal-security

« back to all changes in this revision

Viewing changes to tests/regressiontests/httpwrappers/tests.py

  • Committer: Bazaar Package Importer
  • Author(s): Jamie Strandboge
  • Date: 2010-10-12 11:34:35 UTC
  • mfrom: (1.2.7 upstream)
  • mto: This revision was merged to the branch mainline in revision 30.
  • Revision ID: james.westby@ubuntu.com-20101012113435-9lnsrh0i3mxozbt0
Tags: upstream-1.2.3
ImportĀ upstreamĀ versionĀ 1.2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
"""
2
 
###################
3
 
# Empty QueryDict #
4
 
###################
5
 
 
6
 
>>> q = QueryDict('')
7
 
 
8
 
>>> q['foo']
9
 
Traceback (most recent call last):
10
 
...
11
 
MultiValueDictKeyError: "Key 'foo' not found in <QueryDict: {}>"
12
 
 
13
 
>>> q['something'] = 'bar'
14
 
Traceback (most recent call last):
15
 
...
16
 
AttributeError: This QueryDict instance is immutable
17
 
 
18
 
>>> q.get('foo', 'default')
19
 
'default'
20
 
 
21
 
>>> q.getlist('foo')
22
 
[]
23
 
 
24
 
>>> q.setlist('foo', ['bar', 'baz'])
25
 
Traceback (most recent call last):
26
 
...
27
 
AttributeError: This QueryDict instance is immutable
28
 
 
29
 
>>> q.appendlist('foo', ['bar'])
30
 
Traceback (most recent call last):
31
 
...
32
 
AttributeError: This QueryDict instance is immutable
33
 
 
34
 
>>> q.has_key('foo')
35
 
False
36
 
 
37
 
>>> 'foo' in q
38
 
False
39
 
 
40
 
>>> q.items()
41
 
[]
42
 
 
43
 
>>> q.lists()
44
 
[]
45
 
 
46
 
>>> q.keys()
47
 
[]
48
 
 
49
 
>>> q.values()
50
 
[]
51
 
 
52
 
>>> len(q)
53
 
0
54
 
 
55
 
>>> q.update({'foo': 'bar'})
56
 
Traceback (most recent call last):
57
 
...
58
 
AttributeError: This QueryDict instance is immutable
59
 
 
60
 
>>> q.pop('foo')
61
 
Traceback (most recent call last):
62
 
...
63
 
AttributeError: This QueryDict instance is immutable
64
 
 
65
 
>>> q.popitem()
66
 
Traceback (most recent call last):
67
 
...
68
 
AttributeError: This QueryDict instance is immutable
69
 
 
70
 
>>> q.clear()
71
 
Traceback (most recent call last):
72
 
...
73
 
AttributeError: This QueryDict instance is immutable
74
 
 
75
 
>>> q.setdefault('foo', 'bar')
76
 
Traceback (most recent call last):
77
 
...
78
 
AttributeError: This QueryDict instance is immutable
79
 
 
80
 
>>> q.urlencode()
81
 
''
82
 
 
83
 
###################################
84
 
# Mutable copy of empty QueryDict #
85
 
###################################
86
 
 
87
 
>>> q = q.copy()
88
 
 
89
 
>>> q['foo']
90
 
Traceback (most recent call last):
91
 
...
92
 
MultiValueDictKeyError: "Key 'foo' not found in <QueryDict: {}>"
93
 
 
94
 
>>> q['name'] = 'john'
95
 
 
96
 
>>> q['name']
97
 
u'john'
98
 
 
99
 
>>> del q['name']
100
 
>>> 'name' in q
101
 
False
102
 
 
103
 
>>> q['name'] = 'john'
104
 
 
105
 
>>> q.get('foo', 'default')
106
 
'default'
107
 
 
108
 
>>> q.get('name', 'default')
109
 
u'john'
110
 
 
111
 
>>> q.getlist('name')
112
 
[u'john']
113
 
 
114
 
>>> q.getlist('foo')
115
 
[]
116
 
 
117
 
>>> q.setlist('foo', ['bar', 'baz'])
118
 
 
119
 
>>> q.get('foo', 'default')
120
 
u'baz'
121
 
 
122
 
>>> q.getlist('foo')
123
 
[u'bar', u'baz']
124
 
 
125
 
>>> q.appendlist('foo', 'another')
126
 
 
127
 
>>> q.getlist('foo')
128
 
[u'bar', u'baz', u'another']
129
 
 
130
 
>>> q['foo']
131
 
u'another'
132
 
 
133
 
>>> q.has_key('foo')
134
 
True
135
 
 
136
 
>>> 'foo' in q
137
 
True
138
 
 
139
 
>>> q.items()
140
 
[(u'foo', u'another'), (u'name', u'john')]
141
 
 
142
 
>>> q.lists()
143
 
[(u'foo', [u'bar', u'baz', u'another']), (u'name', [u'john'])]
144
 
 
145
 
>>> q.keys()
146
 
[u'foo', u'name']
147
 
 
148
 
>>> q.values()
149
 
[u'another', u'john']
150
 
 
151
 
>>> len(q)
152
 
2
153
 
 
154
 
>>> q.update({'foo': 'hello'})
155
 
 
156
 
# Displays last value
157
 
>>> q['foo']
158
 
u'hello'
159
 
 
160
 
>>> q.get('foo', 'not available')
161
 
u'hello'
162
 
 
163
 
>>> q.getlist('foo')
164
 
[u'bar', u'baz', u'another', u'hello']
165
 
 
166
 
>>> q.pop('foo')
167
 
[u'bar', u'baz', u'another', u'hello']
168
 
 
169
 
>>> q.pop('foo', 'not there')
170
 
'not there'
171
 
 
172
 
>>> q.get('foo', 'not there')
173
 
'not there'
174
 
 
175
 
>>> q.setdefault('foo', 'bar')
176
 
u'bar'
177
 
 
178
 
>>> q['foo']
179
 
u'bar'
180
 
 
181
 
>>> q.getlist('foo')
182
 
[u'bar']
183
 
 
184
 
>>> q.urlencode()
185
 
'foo=bar&name=john'
186
 
 
187
 
>>> q.clear()
188
 
 
189
 
>>> len(q)
190
 
0
191
 
 
192
 
#####################################
193
 
# QueryDict with one key/value pair #
194
 
#####################################
195
 
 
196
 
>>> q = QueryDict('foo=bar')
197
 
 
198
 
>>> q['foo']
199
 
u'bar'
200
 
 
201
 
>>> q['bar']
202
 
Traceback (most recent call last):
203
 
...
204
 
MultiValueDictKeyError: "Key 'bar' not found in <QueryDict: {u'foo': [u'bar']}>"
205
 
 
206
 
>>> q['something'] = 'bar'
207
 
Traceback (most recent call last):
208
 
...
209
 
AttributeError: This QueryDict instance is immutable
210
 
 
211
 
>>> q.get('foo', 'default')
212
 
u'bar'
213
 
 
214
 
>>> q.get('bar', 'default')
215
 
'default'
216
 
 
217
 
>>> q.getlist('foo')
218
 
[u'bar']
219
 
 
220
 
>>> q.getlist('bar')
221
 
[]
222
 
 
223
 
>>> q.setlist('foo', ['bar', 'baz'])
224
 
Traceback (most recent call last):
225
 
...
226
 
AttributeError: This QueryDict instance is immutable
227
 
 
228
 
>>> q.appendlist('foo', ['bar'])
229
 
Traceback (most recent call last):
230
 
...
231
 
AttributeError: This QueryDict instance is immutable
232
 
 
233
 
>>> q.has_key('foo')
234
 
True
235
 
 
236
 
>>> 'foo' in q
237
 
True
238
 
 
239
 
>>> q.has_key('bar')
240
 
False
241
 
 
242
 
>>> 'bar' in q
243
 
False
244
 
 
245
 
>>> q.items()
246
 
[(u'foo', u'bar')]
247
 
 
248
 
>>> q.lists()
249
 
[(u'foo', [u'bar'])]
250
 
 
251
 
>>> q.keys()
252
 
[u'foo']
253
 
 
254
 
>>> q.values()
255
 
[u'bar']
256
 
 
257
 
>>> len(q)
258
 
1
259
 
 
260
 
>>> q.update({'foo': 'bar'})
261
 
Traceback (most recent call last):
262
 
...
263
 
AttributeError: This QueryDict instance is immutable
264
 
 
265
 
>>> q.pop('foo')
266
 
Traceback (most recent call last):
267
 
...
268
 
AttributeError: This QueryDict instance is immutable
269
 
 
270
 
>>> q.popitem()
271
 
Traceback (most recent call last):
272
 
...
273
 
AttributeError: This QueryDict instance is immutable
274
 
 
275
 
>>> q.clear()
276
 
Traceback (most recent call last):
277
 
...
278
 
AttributeError: This QueryDict instance is immutable
279
 
 
280
 
>>> q.setdefault('foo', 'bar')
281
 
Traceback (most recent call last):
282
 
...
283
 
AttributeError: This QueryDict instance is immutable
284
 
 
285
 
>>> q.urlencode()
286
 
'foo=bar'
287
 
 
288
 
#####################################################
289
 
# QueryDict with two key/value pairs with same keys #
290
 
#####################################################
291
 
 
292
 
>>> q = QueryDict('vote=yes&vote=no')
293
 
 
294
 
>>> q['vote']
295
 
u'no'
296
 
 
297
 
>>> q['something'] = 'bar'
298
 
Traceback (most recent call last):
299
 
...
300
 
AttributeError: This QueryDict instance is immutable
301
 
 
302
 
>>> q.get('vote', 'default')
303
 
u'no'
304
 
 
305
 
>>> q.get('foo', 'default')
306
 
'default'
307
 
 
308
 
>>> q.getlist('vote')
309
 
[u'yes', u'no']
310
 
 
311
 
>>> q.getlist('foo')
312
 
[]
313
 
 
314
 
>>> q.setlist('foo', ['bar', 'baz'])
315
 
Traceback (most recent call last):
316
 
...
317
 
AttributeError: This QueryDict instance is immutable
318
 
 
319
 
>>> q.appendlist('foo', ['bar'])
320
 
Traceback (most recent call last):
321
 
...
322
 
AttributeError: This QueryDict instance is immutable
323
 
 
324
 
>>> q.has_key('vote')
325
 
True
326
 
 
327
 
>>> 'vote' in q
328
 
True
329
 
 
330
 
>>> q.has_key('foo')
331
 
False
332
 
 
333
 
>>> 'foo' in q
334
 
False
335
 
 
336
 
>>> q.items()
337
 
[(u'vote', u'no')]
338
 
 
339
 
>>> q.lists()
340
 
[(u'vote', [u'yes', u'no'])]
341
 
 
342
 
>>> q.keys()
343
 
[u'vote']
344
 
 
345
 
>>> q.values()
346
 
[u'no']
347
 
 
348
 
>>> len(q)
349
 
1
350
 
 
351
 
>>> q.update({'foo': 'bar'})
352
 
Traceback (most recent call last):
353
 
...
354
 
AttributeError: This QueryDict instance is immutable
355
 
 
356
 
>>> q.pop('foo')
357
 
Traceback (most recent call last):
358
 
...
359
 
AttributeError: This QueryDict instance is immutable
360
 
 
361
 
>>> q.popitem()
362
 
Traceback (most recent call last):
363
 
...
364
 
AttributeError: This QueryDict instance is immutable
365
 
 
366
 
>>> q.clear()
367
 
Traceback (most recent call last):
368
 
...
369
 
AttributeError: This QueryDict instance is immutable
370
 
 
371
 
>>> q.setdefault('foo', 'bar')
372
 
Traceback (most recent call last):
373
 
...
374
 
AttributeError: This QueryDict instance is immutable
375
 
 
376
 
>>> q.urlencode()
377
 
'vote=yes&vote=no'
378
 
 
379
 
>>> del q['vote']
380
 
Traceback (most recent call last):
381
 
...
382
 
AttributeError: This QueryDict instance is immutable
383
 
 
384
 
# QueryDicts must be able to handle invalid input encoding (in this case, bad
385
 
# UTF-8 encoding).
386
 
>>> q = QueryDict('foo=bar&foo=\xff')
387
 
 
388
 
>>> q['foo']
389
 
u'\ufffd'
390
 
 
391
 
>>> q.getlist('foo')
392
 
[u'bar', u'\ufffd']
393
 
 
394
 
 
395
 
########################
396
 
# Pickling a QueryDict #
397
 
########################
398
 
>>> import pickle
399
 
>>> q = QueryDict('')
400
 
>>> q1 = pickle.loads(pickle.dumps(q, 2))
401
 
>>> q == q1
402
 
True
403
 
>>> q = QueryDict('a=b&c=d')
404
 
>>> q1 = pickle.loads(pickle.dumps(q, 2))
405
 
>>> q == q1
406
 
True
407
 
>>> q = QueryDict('a=b&c=d&a=1') 
408
 
>>> q1 = pickle.loads(pickle.dumps(q, 2))
409
 
>>> q == q1 
410
 
True
411
 
 
412
 
######################################
413
 
# HttpResponse with Unicode headers  #
414
 
######################################
415
 
 
416
 
>>> r = HttpResponse()
417
 
 
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.
420
 
 
421
 
>>> r['value'] = u'test value'
422
 
>>> isinstance(r['value'], str)
423
 
True
424
 
 
425
 
An error is raised When a unicode object with non-ascii is assigned.
426
 
 
427
 
>>> r['value'] = u't\xebst value' # doctest:+ELLIPSIS
428
 
Traceback (most recent call last):
429
 
...
430
 
UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
431
 
 
432
 
The response also converts unicode keys to strings.
433
 
 
434
 
>>> r[u'test'] = 'testing key'
435
 
>>> l = list(r.items())
436
 
>>> l.sort()
437
 
>>> l[1]
438
 
('test', 'testing key')
439
 
 
440
 
It will also raise errors for keys with non-ascii data.
441
 
 
442
 
>>> r[u't\xebst'] = 'testing key'  # doctest:+ELLIPSIS
443
 
Traceback (most recent call last):
444
 
...
445
 
UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format
446
 
 
447
 
# Bug #10188: Do not allow newlines in headers (CR or LF)
448
 
>>> r['test\\rstr'] = 'test'
449
 
Traceback (most recent call last):
450
 
...
451
 
BadHeaderError: Header values can't contain newlines (got 'test\\rstr')
452
 
 
453
 
>>> r['test\\nstr'] = 'test'
454
 
Traceback (most recent call last):
455
 
...
456
 
BadHeaderError: Header values can't contain newlines (got 'test\\nstr')
457
 
 
458
 
#
459
 
# Regression test for #8278: QueryDict.update(QueryDict)
460
 
#
461
 
>>> x = QueryDict("a=1&a=2", mutable=True)
462
 
>>> y = QueryDict("a=3&a=4")
463
 
>>> x.update(y)
464
 
>>> x.getlist('a')
465
 
[u'1', u'2', u'3', u'4']
466
 
"""
467
 
 
468
 
from django.http import QueryDict, HttpResponse, CompatCookie
469
 
from django.test import TestCase
470
 
 
471
 
 
472
 
class Cookies(TestCase):
473
 
 
 
1
import copy
 
2
import pickle
 
3
import unittest
 
4
from django.http import QueryDict, HttpResponse, CompatCookie, BadHeaderError
 
5
 
 
6
class QueryDictTests(unittest.TestCase):
 
7
    def test_missing_key(self):
 
8
        q = QueryDict('')
 
9
        self.assertRaises(KeyError, q.__getitem__, 'foo')
 
10
 
 
11
    def test_immutability(self):
 
12
        q = QueryDict('')
 
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)
 
20
        
 
21
    def test_immutable_get_with_default(self):
 
22
        q = QueryDict('')
 
23
        self.assertEqual(q.get('foo', 'default'), 'default')
 
24
 
 
25
    def test_immutable_basic_operations(self):
 
26
        q = QueryDict('')
 
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(), '')
 
37
        
 
38
    def test_single_key_value(self):
 
39
        """Test QueryDict with one key/value pair"""
 
40
 
 
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')
 
45
 
 
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'), [])
 
50
        
 
51
        self.assertRaises(AttributeError, q.setlist, 'foo', ['bar'])
 
52
        self.assertRaises(AttributeError, q.appendlist, 'foo', ['bar'])
 
53
 
 
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)
 
58
 
 
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)
 
64
 
 
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')
 
70
        
 
71
        self.assertEqual(q.urlencode(), 'foo=bar')
 
72
        
 
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")
 
77
        q['name'] = 'john'
 
78
        self.assertEqual(q['name'], 'john')
 
79
        
 
80
    def test_mutable_delete(self):
 
81
        q = QueryDict('').copy()
 
82
        q['name'] = 'john'
 
83
        del q['name']
 
84
        self.failIf('name' in q)
 
85
 
 
86
    def test_basic_mutable_operations(self):
 
87
        q = QueryDict('').copy()
 
88
        q['name'] = 'john'
 
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'), [])
 
93
 
 
94
        q.setlist('foo', ['bar', 'baz'])
 
95
        self.assertEqual(q.get('foo', 'default'), 'baz')
 
96
        self.assertEqual(q.getlist('foo'), ['bar', 'baz'])
 
97
 
 
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)
 
103
 
 
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)
 
109
 
 
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')
 
121
 
 
122
        q.clear()
 
123
        self.assertEqual(len(q), 0)
 
124
 
 
125
    def test_multiple_keys(self):
 
126
        """Test QueryDict with two key/value pairs with same keys."""
 
127
 
 
128
        q = QueryDict('vote=yes&vote=no')
 
129
        
 
130
        self.assertEqual(q['vote'], u'no')
 
131
        self.assertRaises(AttributeError, q.__setitem__, 'something', 'bar')
 
132
                
 
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'), [])
 
137
        
 
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'])
 
141
 
 
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)
 
151
        
 
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')
 
158
        
 
159
    def test_invalid_input_encoding(self):
 
160
        """
 
161
        QueryDicts must be able to handle invalid input encoding (in this
 
162
        case, bad UTF-8 encoding).
 
163
        """
 
164
        q = QueryDict('foo=bar&foo=\xff')
 
165
        self.assertEqual(q['foo'], u'\ufffd')        
 
166
        self.assertEqual(q.getlist('foo'), [u'bar', u'\ufffd'])
 
167
   
 
168
    def test_pickle(self):
 
169
        q = QueryDict('')
 
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)
 
178
 
 
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")
 
183
        x.update(y)
 
184
        self.assertEqual(x.getlist('a'), [u'1', u'2', u'3', u'4'])    
 
185
 
 
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' )
 
192
        q = q.copy() 
 
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')
 
198
        
 
199
class HttpResponseTests(unittest.TestCase):
 
200
    def test_unicode_headers(self):
 
201
        r = HttpResponse()
 
202
 
 
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))
 
206
        
 
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')
 
209
        
 
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')
 
214
 
 
215
        # HttpResponse headers must be convertible to ASCII.
 
216
        self.assertRaises(UnicodeEncodeError, HttpResponse,
 
217
                content_type=u't\xebst value')
 
218
 
 
219
        # The response also converts unicode keys to strings.)      
 
220
        r[u'test'] = 'testing key'
 
221
        l = list(r.items())
 
222
        l.sort()
 
223
        self.assertEqual(l[1], ('test', 'testing key'))
 
224
        
 
225
        # It will also raise errors for keys with non-ascii data.
 
226
        self.assertRaises(UnicodeEncodeError, r.__setitem__, u't\xebst key', 'value')
 
227
 
 
228
    def test_newlines_in_headers(self):
 
229
        # Bug #10188: Do not allow newlines in headers (CR or LF)
 
230
        r = HttpResponse()
 
231
        self.assertRaises(BadHeaderError, r.__setitem__, 'test\rstr', 'test')
 
232
        self.assertRaises(BadHeaderError, r.__setitem__, 'test\nstr', 'test')
 
233
 
 
234
class CookieTests(unittest.TestCase):
474
235
    def test_encode(self):
475
236
        """
476
237
        Test that we don't output tricky characters in encoded value
502
263
        c2 = CompatCookie()
503
264
        c2.load(c.output())
504
265
        self.assertEqual(c['test'].value, c2['test'].value)
505
 
 
506
 
if __name__ == "__main__":
507
 
    import doctest
508
 
    doctest.testmod()