mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-27 18:31:22 +00:00
a5c4cd0340
This makes MultiDictView work with a simple getter/setter pair, rather than using attributes with implicit leading underscores. Also move MultiDictView into multidict.py and adds some simple unit tests.
240 lines
6.0 KiB
Python
240 lines
6.0 KiB
Python
from netlib import tutils
|
|
from netlib.multidict import MultiDict, ImmutableMultiDict, MultiDictView
|
|
|
|
|
|
class _TMulti(object):
|
|
@staticmethod
|
|
def _reduce_values(values):
|
|
return values[0]
|
|
|
|
@staticmethod
|
|
def _kconv(key):
|
|
return key.lower()
|
|
|
|
|
|
class TMultiDict(_TMulti, MultiDict):
|
|
pass
|
|
|
|
|
|
class TImmutableMultiDict(_TMulti, ImmutableMultiDict):
|
|
pass
|
|
|
|
|
|
class TestMultiDict(object):
|
|
@staticmethod
|
|
def _multi():
|
|
return TMultiDict((
|
|
("foo", "bar"),
|
|
("bar", "baz"),
|
|
("Bar", "bam")
|
|
))
|
|
|
|
def test_init(self):
|
|
md = TMultiDict()
|
|
assert len(md) == 0
|
|
|
|
md = TMultiDict([("foo", "bar")])
|
|
assert len(md) == 1
|
|
assert md.fields == (("foo", "bar"),)
|
|
|
|
def test_repr(self):
|
|
assert repr(self._multi()) == (
|
|
"TMultiDict[('foo', 'bar'), ('bar', 'baz'), ('Bar', 'bam')]"
|
|
)
|
|
|
|
def test_getitem(self):
|
|
md = TMultiDict([("foo", "bar")])
|
|
assert "foo" in md
|
|
assert "Foo" in md
|
|
assert md["foo"] == "bar"
|
|
|
|
with tutils.raises(KeyError):
|
|
_ = md["bar"]
|
|
|
|
md_multi = TMultiDict(
|
|
[("foo", "a"), ("foo", "b")]
|
|
)
|
|
assert md_multi["foo"] == "a"
|
|
|
|
def test_setitem(self):
|
|
md = TMultiDict()
|
|
md["foo"] = "bar"
|
|
assert md.fields == (("foo", "bar"),)
|
|
|
|
md["foo"] = "baz"
|
|
assert md.fields == (("foo", "baz"),)
|
|
|
|
md["bar"] = "bam"
|
|
assert md.fields == (("foo", "baz"), ("bar", "bam"))
|
|
|
|
def test_delitem(self):
|
|
md = self._multi()
|
|
del md["foo"]
|
|
assert "foo" not in md
|
|
assert "bar" in md
|
|
|
|
with tutils.raises(KeyError):
|
|
del md["foo"]
|
|
|
|
del md["bar"]
|
|
assert md.fields == ()
|
|
|
|
def test_iter(self):
|
|
md = self._multi()
|
|
assert list(md.__iter__()) == ["foo", "bar"]
|
|
|
|
def test_len(self):
|
|
md = TMultiDict()
|
|
assert len(md) == 0
|
|
|
|
md = self._multi()
|
|
assert len(md) == 2
|
|
|
|
def test_eq(self):
|
|
assert TMultiDict() == TMultiDict()
|
|
assert not (TMultiDict() == 42)
|
|
|
|
md1 = self._multi()
|
|
md2 = self._multi()
|
|
assert md1 == md2
|
|
md1.fields = md1.fields[1:] + md1.fields[:1]
|
|
assert not (md1 == md2)
|
|
|
|
def test_ne(self):
|
|
assert not TMultiDict() != TMultiDict()
|
|
assert TMultiDict() != self._multi()
|
|
assert TMultiDict() != 42
|
|
|
|
def test_get_all(self):
|
|
md = self._multi()
|
|
assert md.get_all("foo") == ["bar"]
|
|
assert md.get_all("bar") == ["baz", "bam"]
|
|
assert md.get_all("baz") == []
|
|
|
|
def test_set_all(self):
|
|
md = TMultiDict()
|
|
md.set_all("foo", ["bar", "baz"])
|
|
assert md.fields == (("foo", "bar"), ("foo", "baz"))
|
|
|
|
md = TMultiDict((
|
|
("a", "b"),
|
|
("x", "x"),
|
|
("c", "d"),
|
|
("X", "x"),
|
|
("e", "f"),
|
|
))
|
|
md.set_all("x", ["1", "2", "3"])
|
|
assert md.fields == (
|
|
("a", "b"),
|
|
("x", "1"),
|
|
("c", "d"),
|
|
("x", "2"),
|
|
("e", "f"),
|
|
("x", "3"),
|
|
)
|
|
md.set_all("x", ["4"])
|
|
assert md.fields == (
|
|
("a", "b"),
|
|
("x", "4"),
|
|
("c", "d"),
|
|
("e", "f"),
|
|
)
|
|
|
|
def test_add(self):
|
|
md = self._multi()
|
|
md.add("foo", "foo")
|
|
assert md.fields == (
|
|
("foo", "bar"),
|
|
("bar", "baz"),
|
|
("Bar", "bam"),
|
|
("foo", "foo")
|
|
)
|
|
|
|
def test_insert(self):
|
|
md = TMultiDict([("b", "b")])
|
|
md.insert(0, "a", "a")
|
|
md.insert(2, "c", "c")
|
|
assert md.fields == (("a", "a"), ("b", "b"), ("c", "c"))
|
|
|
|
def test_keys(self):
|
|
md = self._multi()
|
|
assert list(md.keys()) == ["foo", "bar"]
|
|
assert list(md.keys(multi=True)) == ["foo", "bar", "Bar"]
|
|
|
|
def test_values(self):
|
|
md = self._multi()
|
|
assert list(md.values()) == ["bar", "baz"]
|
|
assert list(md.values(multi=True)) == ["bar", "baz", "bam"]
|
|
|
|
def test_items(self):
|
|
md = self._multi()
|
|
assert list(md.items()) == [("foo", "bar"), ("bar", "baz")]
|
|
assert list(md.items(multi=True)) == [("foo", "bar"), ("bar", "baz"), ("Bar", "bam")]
|
|
|
|
def test_to_dict(self):
|
|
md = self._multi()
|
|
assert md.to_dict() == {
|
|
"foo": "bar",
|
|
"bar": ["baz", "bam"]
|
|
}
|
|
|
|
def test_state(self):
|
|
md = self._multi()
|
|
assert len(md.get_state()) == 3
|
|
assert md == TMultiDict.from_state(md.get_state())
|
|
|
|
md2 = TMultiDict()
|
|
assert md != md2
|
|
md2.set_state(md.get_state())
|
|
assert md == md2
|
|
|
|
|
|
class TestImmutableMultiDict(object):
|
|
def test_modify(self):
|
|
md = TImmutableMultiDict()
|
|
with tutils.raises(TypeError):
|
|
md["foo"] = "bar"
|
|
|
|
with tutils.raises(TypeError):
|
|
del md["foo"]
|
|
|
|
with tutils.raises(TypeError):
|
|
md.add("foo", "bar")
|
|
|
|
def test_with_delitem(self):
|
|
md = TImmutableMultiDict([("foo", "bar")])
|
|
assert md.with_delitem("foo").fields == ()
|
|
assert md.fields == (("foo", "bar"),)
|
|
|
|
def test_with_set_all(self):
|
|
md = TImmutableMultiDict()
|
|
assert md.with_set_all("foo", ["bar"]).fields == (("foo", "bar"),)
|
|
assert md.fields == ()
|
|
|
|
def test_with_insert(self):
|
|
md = TImmutableMultiDict()
|
|
assert md.with_insert(0, "foo", "bar").fields == (("foo", "bar"),)
|
|
|
|
|
|
class TParent(object):
|
|
def __init__(self):
|
|
self.vals = tuple()
|
|
|
|
def setter(self, vals):
|
|
self.vals = vals
|
|
|
|
def getter(self):
|
|
return self.vals
|
|
|
|
|
|
class TestMultiDictView(object):
|
|
def test_modify(self):
|
|
p = TParent()
|
|
tv = MultiDictView(p.getter, p.setter)
|
|
assert len(tv) == 0
|
|
tv["a"] = "b"
|
|
assert p.vals == (("a", "b"),)
|
|
tv["c"] = "b"
|
|
assert p.vals == (("a", "b"), ("c", "b"))
|
|
assert tv["a"] == "b"
|