1
# Copyright (c) 2008-2009 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
Tests for L{twisted.web.http_headers}.
10
from twisted.python.compat import set
11
from twisted.trial.unittest import TestCase
12
from twisted.web.http_headers import _DictHeaders, Headers
15
class HeadersTests(TestCase):
19
def test_initializer(self):
21
The header values passed to L{Headers.__init__} can be retrieved via
22
L{Headers.getRawHeaders}.
24
h = Headers({'Foo': ['bar']})
25
self.assertEqual(h.getRawHeaders('foo'), ['bar'])
28
def test_setRawHeaders(self):
30
L{Headers.setRawHeaders} sets the header values for the given
31
header name to the sequence of string values.
33
rawValue = ["value1", "value2"]
35
h.setRawHeaders("test", rawValue)
36
self.assertTrue(h.hasHeader("test"))
37
self.assertTrue(h.hasHeader("Test"))
38
self.assertEqual(h.getRawHeaders("test"), rawValue)
41
def test_addRawHeader(self):
43
L{Headers.addRawHeader} adds a new value for a given header.
46
h.addRawHeader("test", "lemur")
47
self.assertEqual(h.getRawHeaders("test"), ["lemur"])
48
h.addRawHeader("test", "panda")
49
self.assertEqual(h.getRawHeaders("test"), ["lemur", "panda"])
52
def test_getRawHeadersNoDefault(self):
54
L{Headers.getRawHeaders} returns C{None} if the header is not found and
55
no default is specified.
57
self.assertIdentical(Headers().getRawHeaders("test"), None)
60
def test_getRawHeadersDefaultValue(self):
62
L{Headers.getRawHeaders} returns the specified default value when no
67
self.assertIdentical(h.getRawHeaders("test", default), default)
70
def test_getRawHeaders(self):
72
L{Headers.getRawHeaders} returns the values which have been set for a
76
h.setRawHeaders("test", ["lemur"])
77
self.assertEqual(h.getRawHeaders("test"), ["lemur"])
78
self.assertEqual(h.getRawHeaders("Test"), ["lemur"])
81
def test_hasHeaderTrue(self):
83
Check that L{Headers.hasHeader} returns C{True} when the given header
87
h.setRawHeaders("test", ["lemur"])
88
self.assertTrue(h.hasHeader("test"))
89
self.assertTrue(h.hasHeader("Test"))
92
def test_hasHeaderFalse(self):
94
L{Headers.hasHeader} returns C{False} when the given header is not
97
self.assertFalse(Headers().hasHeader("test"))
100
def test_removeHeader(self):
102
Check that L{Headers.removeHeader} removes the given header.
106
h.setRawHeaders("foo", ["lemur"])
107
self.assertTrue(h.hasHeader("foo"))
108
h.removeHeader("foo")
109
self.assertFalse(h.hasHeader("foo"))
111
h.setRawHeaders("bar", ["panda"])
112
self.assertTrue(h.hasHeader("bar"))
113
h.removeHeader("Bar")
114
self.assertFalse(h.hasHeader("bar"))
117
def test_removeHeaderDoesntExist(self):
119
L{Headers.removeHeader} is a no-operation when the specified header is
123
h.removeHeader("test")
124
self.assertEqual(list(h.getAllRawHeaders()), [])
127
def test_canonicalNameCaps(self):
129
L{Headers._canonicalNameCaps} returns the canonical capitalization for
133
self.assertEqual(h._canonicalNameCaps("test"), "Test")
134
self.assertEqual(h._canonicalNameCaps("test-stuff"), "Test-Stuff")
135
self.assertEqual(h._canonicalNameCaps("www-authenticate"),
139
def test_getAllRawHeaders(self):
141
L{Headers.getAllRawHeaders} returns an iterable of (k, v) pairs, where
142
C{k} is the canonicalized representation of the header name, and C{v}
143
is a sequence of values.
146
h.setRawHeaders("test", ["lemurs"])
147
h.setRawHeaders("www-authenticate", ["basic aksljdlk="])
149
allHeaders = set([(k, tuple(v)) for k, v in h.getAllRawHeaders()])
151
self.assertEqual(allHeaders,
152
set([("WWW-Authenticate", ("basic aksljdlk=",)),
153
("Test", ("lemurs",))]))
156
def test_headersComparison(self):
158
A L{Headers} instance compares equal to itself and to another
159
L{Headers} instance with the same values.
162
first.setRawHeaders("foo", ["panda"])
164
second.setRawHeaders("foo", ["panda"])
166
third.setRawHeaders("foo", ["lemur", "panda"])
167
self.assertEqual(first, first)
168
self.assertEqual(first, second)
169
self.assertNotEqual(first, third)
172
def test_otherComparison(self):
174
An instance of L{Headers} does not compare equal to other unrelated
178
self.assertNotEqual(h, ())
179
self.assertNotEqual(h, object())
180
self.assertNotEqual(h, "foo")
185
The L{repr} of a L{Headers} instance shows the names and values of all
186
the headers it contains.
189
repr(Headers({"foo": ["bar", "baz"]})),
190
"Headers({'foo': ['bar', 'baz']})")
193
def test_subclassRepr(self):
195
The L{repr} of an instance of a subclass of L{Headers} uses the name
196
of the subclass instead of the string C{"Headers"}.
198
class FunnyHeaders(Headers):
201
repr(FunnyHeaders({"foo": ["bar", "baz"]})),
202
"FunnyHeaders({'foo': ['bar', 'baz']})")
206
class HeaderDictTests(TestCase):
208
Tests for the backwards compatible C{dict} interface for L{Headers}
209
provided by L{_DictHeaders}.
211
def headers(self, **kw):
213
Create a L{Headers} instance populated with the header name/values
214
specified by C{kw} and a L{_DictHeaders} wrapped around it and return
218
for k, v in kw.iteritems():
219
h.setRawHeaders(k, v)
220
return h, _DictHeaders(h)
223
def test_getItem(self):
225
L{_DictHeaders.__getitem__} returns a single header for the given name.
227
headers, wrapper = self.headers(test=["lemur"])
228
self.assertEqual(wrapper["test"], "lemur")
231
def test_getItemMultiple(self):
233
L{_DictHeaders.__getitem__} returns only the last header value for a
236
headers, wrapper = self.headers(test=["lemur", "panda"])
237
self.assertEqual(wrapper["test"], "panda")
240
def test_getItemMissing(self):
242
L{_DictHeaders.__getitem__} raises L{KeyError} if called with a header
243
which is not present.
245
headers, wrapper = self.headers()
246
exc = self.assertRaises(KeyError, wrapper.__getitem__, "test")
247
self.assertEqual(exc.args, ("test",))
250
def test_iteration(self):
252
L{_DictHeaders.__iter__} returns an iterator the elements of which
253
are the lowercase name of each header present.
255
headers, wrapper = self.headers(foo=["lemur", "panda"], bar=["baz"])
256
self.assertEqual(set(list(wrapper)), set(["foo", "bar"]))
259
def test_length(self):
261
L{_DictHeaders.__len__} returns the number of headers present.
263
headers, wrapper = self.headers()
264
self.assertEqual(len(wrapper), 0)
265
headers.setRawHeaders("foo", ["bar"])
266
self.assertEqual(len(wrapper), 1)
267
headers.setRawHeaders("test", ["lemur", "panda"])
268
self.assertEqual(len(wrapper), 2)
271
def test_setItem(self):
273
L{_DictHeaders.__setitem__} sets a single header value for the given
276
headers, wrapper = self.headers()
277
wrapper["test"] = "lemur"
278
self.assertEqual(headers.getRawHeaders("test"), ["lemur"])
281
def test_setItemOverwrites(self):
283
L{_DictHeaders.__setitem__} will replace any previous header values for
286
headers, wrapper = self.headers(test=["lemur", "panda"])
287
wrapper["test"] = "lemur"
288
self.assertEqual(headers.getRawHeaders("test"), ["lemur"])
291
def test_delItem(self):
293
L{_DictHeaders.__delitem__} will remove the header values for the given
296
headers, wrapper = self.headers(test=["lemur"])
298
self.assertFalse(headers.hasHeader("test"))
301
def test_delItemMissing(self):
303
L{_DictHeaders.__delitem__} will raise L{KeyError} if the given name is
306
headers, wrapper = self.headers()
307
exc = self.assertRaises(KeyError, wrapper.__delitem__, "test")
308
self.assertEqual(exc.args, ("test",))
311
def test_keys(self, _method='keys', _requireList=True):
313
L{_DictHeaders.keys} will return a list of all present header names.
315
headers, wrapper = self.headers(test=["lemur"], foo=["bar"])
316
keys = getattr(wrapper, _method)()
318
self.assertIsInstance(keys, list)
319
self.assertEqual(set(keys), set(["foo", "test"]))
322
def test_iterkeys(self):
324
L{_DictHeaders.iterkeys} will return all present header names.
326
self.test_keys('iterkeys', False)
329
def test_values(self, _method='values', _requireList=True):
331
L{_DictHeaders.values} will return a list of all present header values,
332
returning only the last value for headers with more than one.
334
headers, wrapper = self.headers(foo=["lemur"], bar=["marmot", "panda"])
335
values = getattr(wrapper, _method)()
337
self.assertIsInstance(values, list)
338
self.assertEqual(set(values), set(["lemur", "panda"]))
341
def test_itervalues(self):
343
L{_DictHeaders.itervalues} will return all present header values,
344
returning only the last value for headers with more than one.
346
self.test_values('itervalues', False)
349
def test_items(self, _method='items', _requireList=True):
351
L{_DictHeaders.items} will return a list of all present header names
352
and values as tuples, returning only the last value for headers with
355
headers, wrapper = self.headers(foo=["lemur"], bar=["marmot", "panda"])
356
items = getattr(wrapper, _method)()
358
self.assertIsInstance(items, list)
359
self.assertEqual(set(items), set([("foo", "lemur"), ("bar", "panda")]))
362
def test_iteritems(self):
364
L{_DictHeaders.iteritems} will return all present header names and
365
values as tuples, returning only the last value for headers with more
368
self.test_items('iteritems', False)
371
def test_clear(self):
373
L{_DictHeaders.clear} will remove all headers.
375
headers, wrapper = self.headers(foo=["lemur"], bar=["panda"])
377
self.assertEqual(list(headers.getAllRawHeaders()), [])
382
L{_DictHeaders.copy} will return a C{dict} with all the same headers
383
and the last value for each.
385
headers, wrapper = self.headers(foo=["lemur", "panda"], bar=["marmot"])
386
duplicate = wrapper.copy()
387
self.assertEqual(duplicate, {"foo": "panda", "bar": "marmot"})
392
L{_DictHeaders.get} returns the last value for the given header name.
394
headers, wrapper = self.headers(foo=["lemur", "panda"])
395
self.assertEqual(wrapper.get("foo"), "panda")
398
def test_getMissing(self):
400
L{_DictHeaders.get} returns C{None} for a header which is not present.
402
headers, wrapper = self.headers()
403
self.assertIdentical(wrapper.get("foo"), None)
406
def test_getDefault(self):
408
L{_DictHeaders.get} returns the last value for the given header name
409
even when it is invoked with a default value.
411
headers, wrapper = self.headers(foo=["lemur"])
412
self.assertEqual(wrapper.get("foo", "bar"), "lemur")
415
def test_getDefaultMissing(self):
417
L{_DictHeaders.get} returns the default value specified if asked for a
418
header which is not present.
420
headers, wrapper = self.headers()
421
self.assertEqual(wrapper.get("foo", "bar"), "bar")
424
def test_has_key(self):
426
L{_DictHeaders.has_key} returns C{True} if the given header is present,
429
headers, wrapper = self.headers(foo=["lemur"])
430
self.assertTrue(wrapper.has_key("foo"))
431
self.assertFalse(wrapper.has_key("bar"))
434
def test_contains(self):
436
L{_DictHeaders.__contains__} returns C{True} if the given header is
437
present, C{False} otherwise.
439
headers, wrapper = self.headers(foo=["lemur"])
440
self.assertIn("foo", wrapper)
441
self.assertNotIn("bar", wrapper)
446
L{_DictHeaders.pop} returns the last header value associated with the
447
given header name and removes the header.
449
headers, wrapper = self.headers(foo=["lemur", "panda"])
450
self.assertEqual(wrapper.pop("foo"), "panda")
451
self.assertIdentical(headers.getRawHeaders("foo"), None)
454
def test_popMissing(self):
456
L{_DictHeaders.pop} raises L{KeyError} if passed a header name which is
459
headers, wrapper = self.headers()
460
self.assertRaises(KeyError, wrapper.pop, "foo")
463
def test_popDefault(self):
465
L{_DictHeaders.pop} returns the last header value associated with the
466
given header name and removes the header, even if it is supplied with a
469
headers, wrapper = self.headers(foo=["lemur"])
470
self.assertEqual(wrapper.pop("foo", "bar"), "lemur")
471
self.assertIdentical(headers.getRawHeaders("foo"), None)
474
def test_popDefaultMissing(self):
476
L{_DictHeaders.pop} returns the default value is asked for a header
477
name which is not present.
479
headers, wrapper = self.headers(foo=["lemur"])
480
self.assertEqual(wrapper.pop("bar", "baz"), "baz")
481
self.assertEqual(headers.getRawHeaders("foo"), ["lemur"])
484
def test_popitem(self):
486
L{_DictHeaders.popitem} returns some header name/value pair.
488
headers, wrapper = self.headers(foo=["lemur", "panda"])
489
self.assertEqual(wrapper.popitem(), ("foo", "panda"))
490
self.assertIdentical(headers.getRawHeaders("foo"), None)
493
def test_popitemEmpty(self):
495
L{_DictHeaders.popitem} raises L{KeyError} if there are no headers
498
headers, wrapper = self.headers()
499
self.assertRaises(KeyError, wrapper.popitem)
502
def test_update(self):
504
L{_DictHeaders.update} adds the header/value pairs in the C{dict} it is
505
passed, overriding any existing values for those headers.
507
headers, wrapper = self.headers(foo=["lemur"])
508
wrapper.update({"foo": "panda", "bar": "marmot"})
509
self.assertEqual(headers.getRawHeaders("foo"), ["panda"])
510
self.assertEqual(headers.getRawHeaders("bar"), ["marmot"])
513
def test_updateWithKeywords(self):
515
L{_DictHeaders.update} adds header names given as keyword arguments
516
with the keyword values as the header value.
518
headers, wrapper = self.headers(foo=["lemur"])
519
wrapper.update(foo="panda", bar="marmot")
520
self.assertEqual(headers.getRawHeaders("foo"), ["panda"])
521
self.assertEqual(headers.getRawHeaders("bar"), ["marmot"])
523
if sys.version_info < (2, 4):
524
test_updateWithKeywords.skip = (
525
"Python 2.3 does not support keyword arguments to dict.update.")
528
def test_setdefaultMissing(self):
530
If passed the name of a header which is not present,
531
L{_DictHeaders.setdefault} sets the value of the given header to the
532
specified default value and returns it.
534
headers, wrapper = self.headers(foo=["bar"])
535
self.assertEqual(wrapper.setdefault("baz", "quux"), "quux")
536
self.assertEqual(headers.getRawHeaders("foo"), ["bar"])
537
self.assertEqual(headers.getRawHeaders("baz"), ["quux"])
540
def test_setdefaultPresent(self):
542
If passed the name of a header which is present,
543
L{_DictHeaders.setdefault} makes no changes to the headers and
544
returns the last value already associated with that header.
546
headers, wrapper = self.headers(foo=["bar", "baz"])
547
self.assertEqual(wrapper.setdefault("foo", "quux"), "baz")
548
self.assertEqual(headers.getRawHeaders("foo"), ["bar", "baz"])
551
def test_setdefaultDefault(self):
553
If a value is not passed to L{_DictHeaders.setdefault}, C{None} is
556
# This results in an invalid state for the headers, but maybe some
557
# application is doing this an intermediate step towards some other
558
# state. Anyway, it was broken with the old implementation so it's
559
# broken with the new implementation. Compatibility, for the win.
561
headers, wrapper = self.headers()
562
self.assertIdentical(wrapper.setdefault("foo"), None)
563
self.assertEqual(headers.getRawHeaders("foo"), [None])
566
def test_dictComparison(self):
568
An instance of L{_DictHeaders} compares equal to a C{dict} which
569
contains the same header/value pairs. For header names with multiple
570
values, the last value only is considered.
572
headers, wrapper = self.headers(foo=["lemur"], bar=["panda", "marmot"])
573
self.assertNotEqual(wrapper, {"foo": "lemur", "bar": "panda"})
574
self.assertEqual(wrapper, {"foo": "lemur", "bar": "marmot"})
577
def test_otherComparison(self):
579
An instance of L{_DictHeaders} does not compare equal to other
582
headers, wrapper = self.headers()
583
self.assertNotEqual(wrapper, ())
584
self.assertNotEqual(wrapper, object())
585
self.assertNotEqual(wrapper, "foo")