mirror of
https://github.com/kennethreitz/requests.git
synced 2026-06-05 22:50:18 +00:00
white / improvements
Signed-off-by: Kenneth Reitz <me@kennethreitz.org>
This commit is contained in:
@@ -53,7 +53,6 @@ class TestCaseInsensitiveDict:
|
||||
|
||||
|
||||
class TestHTTPHeaderDictCompatibility(TestCaseInsensitiveDict):
|
||||
|
||||
"""HTTPHeaderDict should be completely compatible with CaseInsensitiveDict
|
||||
when used for headers, so ensure that all the tests for the base class
|
||||
also pass for this one."""
|
||||
@@ -75,22 +74,18 @@ class TestHTTPHeaderDict:
|
||||
('Sauce', 'Bread'),
|
||||
('Sauce', 'Cherry, or Plum Tomato'),
|
||||
]
|
||||
|
||||
# HTTPHeaderDict from urllib3.
|
||||
self.u3dict = ud = U3HeaderDict()
|
||||
[ud.add(*tpl) for tpl in self.kvs]
|
||||
|
||||
# Regular dictionary.
|
||||
self.ddict = dict(self.kvs)
|
||||
self.ddict['Sauce'] = ['Bread!', 'Cherry, or Plum Tomato']
|
||||
|
||||
# Used by test_extend. All of these "extra" values are mostly
|
||||
# equivalent to each other.
|
||||
self.extra_hd = hd2 = HTTPHeaderDict(ANIMAL=['Dog', 'elephant'])
|
||||
hd2['cake'] = 'Babka'
|
||||
hd2.setlist('sound', ['quiet', 'LOUD'])
|
||||
hd2['CUTLERY'] = 'fork'
|
||||
|
||||
self.extra_tuple_pairs = tuple_pairs = [
|
||||
('ANIMAL', 'Dog'),
|
||||
('Animal', 'elephant'),
|
||||
@@ -99,10 +94,8 @@ class TestHTTPHeaderDict:
|
||||
('sound', 'LOUD'),
|
||||
('CUTLERY', 'fork'),
|
||||
]
|
||||
|
||||
self.extra_simple_dict = dict(tuple_pairs)
|
||||
self.extra_simple_dict['sound'] = ('quiet', 'LOUD')
|
||||
|
||||
self.extra_u3 = U3HeaderDict()
|
||||
for k, v in tuple_pairs:
|
||||
if isinstance(v, (tuple, list)):
|
||||
@@ -113,19 +106,15 @@ class TestHTTPHeaderDict:
|
||||
|
||||
def test_item_access(self):
|
||||
hd = HTTPHeaderDict(self.kvs)
|
||||
|
||||
# Test that values are combined.
|
||||
assert hd['Sauce'] == 'Bread, Cherry, or Plum Tomato'
|
||||
assert hd['ANIMAL'] == 'chicken, Cow'
|
||||
|
||||
# Test we can overwrite values.
|
||||
hd['animal'] = 'Goat!'
|
||||
assert hd['anIMal'] == 'Goat!'
|
||||
|
||||
# Test deletion works.
|
||||
del hd['sauce']
|
||||
pytest.raises(KeyError, hd.__getitem__, 'sauce')
|
||||
|
||||
# Only string types allowed.
|
||||
pytest.raises(ValueError, hd.__setitem__, 'cake', ['Cheese', 'sponge'])
|
||||
|
||||
@@ -133,7 +122,6 @@ class TestHTTPHeaderDict:
|
||||
hd = HTTPHeaderDict(self.u3dict)
|
||||
assert hd == self.u3dict
|
||||
assert hd == HTTPHeaderDict(hd)
|
||||
|
||||
# Test that we still work even if we are comparing to a
|
||||
# CaseInsensitiveDict instance.
|
||||
cid = CaseInsensitiveDict(hd)
|
||||
@@ -160,15 +148,12 @@ class TestHTTPHeaderDict:
|
||||
assert hd.getlist('SAUCE') == ['Bread', 'Cherry, or Plum Tomato']
|
||||
assert hd.getlist('CAKE') == ['Cheese!']
|
||||
assert hd.getlist('DRINK') == []
|
||||
|
||||
# Needs to be a regular sequence type containing just strings.
|
||||
pytest.raises(ValueError, hd.setlist, 'Drink', 'Water')
|
||||
pytest.raises(ValueError, hd.setlist, 'Drink', ['H', 2, 'O'])
|
||||
|
||||
# Test multi-setting.
|
||||
hd.setlist('Drink', ['Water', 'Juice'])
|
||||
assert hd.getlist('DRINK') == ['Water', 'Juice']
|
||||
|
||||
# Setting to an empty sequence should remove the entry.
|
||||
hd.setlist('DRInk', [])
|
||||
pytest.raises(KeyError, hd.__getitem__, 'DrinK')
|
||||
@@ -179,37 +164,28 @@ class TestHTTPHeaderDict:
|
||||
hd.add('sound', 'quiet')
|
||||
hd.add('SOUND', 'LOUD')
|
||||
assert hd.getlist('Sound') == ['quiet', 'LOUD']
|
||||
|
||||
# Enforce type-checking in the add method.
|
||||
pytest.raises(ValueError, hd.add, 'Sound', 5)
|
||||
|
||||
@pytest.mark.parametrize('attr,as_arg,animal_arg_is_ordered', [
|
||||
@pytest.mark.parametrize(
|
||||
'attr,as_arg,animal_arg_is_ordered',
|
||||
[('extra_hd', True, True), ('extra_tuple_pairs', True, True), ('extra_simple_dict', True, False), ('extra_u3', True, False), ('extra_simple_dict', False, False)],
|
||||
# These types will have the "animal" arguments in our preferred order.
|
||||
('extra_hd', True, True),
|
||||
('extra_tuple_pairs', True, True),
|
||||
|
||||
# And these types will lose the ordering, so we can't make assertions
|
||||
# about the final order of those values.
|
||||
('extra_simple_dict', True, False),
|
||||
('extra_u3', True, False),
|
||||
('extra_simple_dict', False, False),
|
||||
])
|
||||
)
|
||||
def test_extend(self, attr, as_arg, animal_arg_is_ordered):
|
||||
item = getattr(self, attr)
|
||||
|
||||
# Call extend with the associated values - we should see all of the
|
||||
# merged data in the HTTPHeaderDict instance.
|
||||
extras = {'cutlery': 'knife'}
|
||||
hd = HTTPHeaderDict(self.kvs)
|
||||
|
||||
if as_arg:
|
||||
hd.extend(item, **extras)
|
||||
else:
|
||||
hd.extend(extras, **item)
|
||||
|
||||
# Test all the stored values are what we expect.
|
||||
mget = hd.getlist
|
||||
|
||||
# Depending on the item we merged in, we might be able to make
|
||||
# assumptions what the overall order of the structure is.
|
||||
animal_seq = mget('animal')
|
||||
@@ -221,17 +197,13 @@ class TestHTTPHeaderDict:
|
||||
# two values are added.
|
||||
assert animal_seq in [
|
||||
['chicken', 'Cow', 'Dog', 'elephant'],
|
||||
['chicken', 'Cow', 'elephant', 'Dog']
|
||||
['chicken', 'Cow', 'elephant', 'Dog'],
|
||||
]
|
||||
|
||||
assert mget('cake') == ['Cheese!', 'Babka']
|
||||
assert mget('sound') == ['quiet', 'LOUD']
|
||||
|
||||
# We don't mandate the order in which these dictionaries are
|
||||
# processed, so it's fine whichever order it is.
|
||||
assert mget('cutlery') in [
|
||||
['fork', 'knife'], ['knife', 'fork']
|
||||
]
|
||||
assert mget('cutlery') in [['fork', 'knife'], ['knife', 'fork']]
|
||||
|
||||
def test_extend_type_checking(self):
|
||||
hd = HTTPHeaderDict()
|
||||
@@ -244,7 +216,6 @@ class TestHTTPHeaderDict:
|
||||
assert repr(hd) == "{'type': 'xml'}"
|
||||
hd.add('type', 'html')
|
||||
assert repr(hd) == "{'type': ('xml', 'html')}"
|
||||
|
||||
# We can't guarantee order once we have more than one key.
|
||||
hd.add('Accept', 'text/html')
|
||||
assert repr(hd) in [
|
||||
|
||||
Reference in New Issue
Block a user