summaryrefslogtreecommitdiffstats
path: root/contrib/python/multidict/tests
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-07-09 10:22:03 +0300
committerrobot-piglet <[email protected]>2025-07-09 10:41:10 +0300
commitf91edcd669b2b4e97378bae7b57f6589e68a538f (patch)
treec76a2875faa0ec6ab7d4cfe245ba138114447041 /contrib/python/multidict/tests
parentf979375c0346ff1acee7005d4c0d22d954d4dfa3 (diff)
Intermediate changes
commit_hash:d8fa10d7fba592f861e1470374c72cf22f0d5a2b
Diffstat (limited to 'contrib/python/multidict/tests')
-rw-r--r--contrib/python/multidict/tests/cimultidict-c.pickle.0 (renamed from contrib/python/multidict/tests/cimultidict-c-extension.pickle.0)0
-rw-r--r--contrib/python/multidict/tests/cimultidict-c.pickle.1 (renamed from contrib/python/multidict/tests/cimultidict-c-extension.pickle.1)bin71 -> 71 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-c.pickle.2 (renamed from contrib/python/multidict/tests/cimultidict-c-extension.pickle.2)bin70 -> 70 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-c.pickle.3 (renamed from contrib/python/multidict/tests/cimultidict-c-extension.pickle.3)bin70 -> 70 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-c.pickle.4 (renamed from contrib/python/multidict/tests/cimultidict-c-extension.pickle.4)bin73 -> 73 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-c.pickle.5 (renamed from contrib/python/multidict/tests/cimultidict-c-extension.pickle.5)bin73 -> 73 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-py.pickle.0 (renamed from contrib/python/multidict/tests/cimultidict-pure-python.pickle.0)0
-rw-r--r--contrib/python/multidict/tests/cimultidict-py.pickle.1 (renamed from contrib/python/multidict/tests/cimultidict-pure-python.pickle.1)bin74 -> 74 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-py.pickle.2 (renamed from contrib/python/multidict/tests/cimultidict-pure-python.pickle.2)bin73 -> 73 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-py.pickle.3 (renamed from contrib/python/multidict/tests/cimultidict-pure-python.pickle.3)bin73 -> 73 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-py.pickle.4 (renamed from contrib/python/multidict/tests/cimultidict-pure-python.pickle.4)bin76 -> 76 bytes
-rw-r--r--contrib/python/multidict/tests/cimultidict-py.pickle.5 (renamed from contrib/python/multidict/tests/cimultidict-pure-python.pickle.5)bin76 -> 76 bytes
-rw-r--r--contrib/python/multidict/tests/conftest.py6
-rw-r--r--contrib/python/multidict/tests/istr-c.pickle.0 (renamed from contrib/python/multidict/tests/istr-c-extension.pickle.0)0
-rw-r--r--contrib/python/multidict/tests/istr-c.pickle.1 (renamed from contrib/python/multidict/tests/istr-c-extension.pickle.1)bin47 -> 47 bytes
-rw-r--r--contrib/python/multidict/tests/istr-c.pickle.2 (renamed from contrib/python/multidict/tests/istr-c-extension.pickle.2)bin48 -> 48 bytes
-rw-r--r--contrib/python/multidict/tests/istr-c.pickle.3 (renamed from contrib/python/multidict/tests/istr-c-extension.pickle.3)bin48 -> 48 bytes
-rw-r--r--contrib/python/multidict/tests/istr-c.pickle.4 (renamed from contrib/python/multidict/tests/istr-c-extension.pickle.4)bin54 -> 54 bytes
-rw-r--r--contrib/python/multidict/tests/istr-c.pickle.5 (renamed from contrib/python/multidict/tests/istr-c-extension.pickle.5)bin54 -> 54 bytes
-rw-r--r--contrib/python/multidict/tests/istr-py.pickle.0 (renamed from contrib/python/multidict/tests/istr-pure-python.pickle.0)0
-rw-r--r--contrib/python/multidict/tests/istr-py.pickle.1 (renamed from contrib/python/multidict/tests/istr-pure-python.pickle.1)bin100 -> 100 bytes
-rw-r--r--contrib/python/multidict/tests/istr-py.pickle.2 (renamed from contrib/python/multidict/tests/istr-pure-python.pickle.2)bin51 -> 51 bytes
-rw-r--r--contrib/python/multidict/tests/istr-py.pickle.3 (renamed from contrib/python/multidict/tests/istr-pure-python.pickle.3)bin51 -> 51 bytes
-rw-r--r--contrib/python/multidict/tests/istr-py.pickle.4 (renamed from contrib/python/multidict/tests/istr-pure-python.pickle.4)bin57 -> 57 bytes
-rw-r--r--contrib/python/multidict/tests/istr-py.pickle.5 (renamed from contrib/python/multidict/tests/istr-pure-python.pickle.5)bin57 -> 57 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-c.pickle.0 (renamed from contrib/python/multidict/tests/multidict-c-extension.pickle.0)0
-rw-r--r--contrib/python/multidict/tests/multidict-c.pickle.1 (renamed from contrib/python/multidict/tests/multidict-c-extension.pickle.1)bin69 -> 69 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-c.pickle.2 (renamed from contrib/python/multidict/tests/multidict-c-extension.pickle.2)bin68 -> 68 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-c.pickle.3 (renamed from contrib/python/multidict/tests/multidict-c-extension.pickle.3)bin68 -> 68 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-c.pickle.4 (renamed from contrib/python/multidict/tests/multidict-c-extension.pickle.4)bin71 -> 71 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-c.pickle.5 (renamed from contrib/python/multidict/tests/multidict-c-extension.pickle.5)bin71 -> 71 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-py.pickle.0 (renamed from contrib/python/multidict/tests/multidict-pure-python.pickle.0)0
-rw-r--r--contrib/python/multidict/tests/multidict-py.pickle.1 (renamed from contrib/python/multidict/tests/multidict-pure-python.pickle.1)bin72 -> 72 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-py.pickle.2 (renamed from contrib/python/multidict/tests/multidict-pure-python.pickle.2)bin71 -> 71 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-py.pickle.3 (renamed from contrib/python/multidict/tests/multidict-pure-python.pickle.3)bin71 -> 71 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-py.pickle.4 (renamed from contrib/python/multidict/tests/multidict-pure-python.pickle.4)bin74 -> 74 bytes
-rw-r--r--contrib/python/multidict/tests/multidict-py.pickle.5 (renamed from contrib/python/multidict/tests/multidict-pure-python.pickle.5)bin74 -> 74 bytes
-rw-r--r--contrib/python/multidict/tests/test_circular_imports.py12
-rw-r--r--contrib/python/multidict/tests/test_multidict.py24
-rw-r--r--contrib/python/multidict/tests/test_multidict_benchmarks.py12
-rw-r--r--contrib/python/multidict/tests/test_mutable_multidict.py91
-rw-r--r--contrib/python/multidict/tests/test_types.py3
-rw-r--r--contrib/python/multidict/tests/test_update.py29
43 files changed, 152 insertions, 25 deletions
diff --git a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.0 b/contrib/python/multidict/tests/cimultidict-c.pickle.0
index 7b2ed008451..7b2ed008451 100644
--- a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.0
+++ b/contrib/python/multidict/tests/cimultidict-c.pickle.0
diff --git a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.1 b/contrib/python/multidict/tests/cimultidict-c.pickle.1
index 225458ba299..225458ba299 100644
--- a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.1
+++ b/contrib/python/multidict/tests/cimultidict-c.pickle.1
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.2 b/contrib/python/multidict/tests/cimultidict-c.pickle.2
index d33600e615a..d33600e615a 100644
--- a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.2
+++ b/contrib/python/multidict/tests/cimultidict-c.pickle.2
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.3 b/contrib/python/multidict/tests/cimultidict-c.pickle.3
index cbb8624db07..cbb8624db07 100644
--- a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.3
+++ b/contrib/python/multidict/tests/cimultidict-c.pickle.3
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.4 b/contrib/python/multidict/tests/cimultidict-c.pickle.4
index 1f5164ca37b..1f5164ca37b 100644
--- a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.4
+++ b/contrib/python/multidict/tests/cimultidict-c.pickle.4
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.5 b/contrib/python/multidict/tests/cimultidict-c.pickle.5
index 11bf552c436..11bf552c436 100644
--- a/contrib/python/multidict/tests/cimultidict-c-extension.pickle.5
+++ b/contrib/python/multidict/tests/cimultidict-c.pickle.5
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.0 b/contrib/python/multidict/tests/cimultidict-py.pickle.0
index bd39b6db202..bd39b6db202 100644
--- a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.0
+++ b/contrib/python/multidict/tests/cimultidict-py.pickle.0
diff --git a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.1 b/contrib/python/multidict/tests/cimultidict-py.pickle.1
index 866003d26ca..866003d26ca 100644
--- a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.1
+++ b/contrib/python/multidict/tests/cimultidict-py.pickle.1
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.2 b/contrib/python/multidict/tests/cimultidict-py.pickle.2
index c9e43fef9c9..c9e43fef9c9 100644
--- a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.2
+++ b/contrib/python/multidict/tests/cimultidict-py.pickle.2
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.3 b/contrib/python/multidict/tests/cimultidict-py.pickle.3
index 821659fe0c5..821659fe0c5 100644
--- a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.3
+++ b/contrib/python/multidict/tests/cimultidict-py.pickle.3
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.4 b/contrib/python/multidict/tests/cimultidict-py.pickle.4
index a17c6e9b731..a17c6e9b731 100644
--- a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.4
+++ b/contrib/python/multidict/tests/cimultidict-py.pickle.4
Binary files differ
diff --git a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.5 b/contrib/python/multidict/tests/cimultidict-py.pickle.5
index 479bfe3a5d3..479bfe3a5d3 100644
--- a/contrib/python/multidict/tests/cimultidict-pure-python.pickle.5
+++ b/contrib/python/multidict/tests/cimultidict-py.pickle.5
Binary files differ
diff --git a/contrib/python/multidict/tests/conftest.py b/contrib/python/multidict/tests/conftest.py
index a37f58f2d1f..dfc1a6703cd 100644
--- a/contrib/python/multidict/tests/conftest.py
+++ b/contrib/python/multidict/tests/conftest.py
@@ -39,7 +39,7 @@ class MultidictImplementation:
@cached_property
def tag(self) -> str:
"""Return a text representation of the pure-python attribute."""
- return "pure-python" if self.is_pure_python else "c-extension"
+ return "py" if self.is_pure_python else "c"
@cached_property
def imported_module(self) -> ModuleType:
@@ -49,7 +49,7 @@ class MultidictImplementation:
def __str__(self) -> str:
"""Render the implementation facade instance as a string."""
- return f"{self.tag}-module"
+ return self.tag
@pytest.fixture(
@@ -79,7 +79,7 @@ def multidict_module(
@pytest.fixture(
scope="session",
params=("MultiDict", "CIMultiDict"),
- ids=("case-sensitive", "case-insensitive"),
+ ids=("cs", "ci"),
)
def any_multidict_class_name(request: pytest.FixtureRequest) -> str:
"""Return a class name of a mutable multidict implementation."""
diff --git a/contrib/python/multidict/tests/istr-c-extension.pickle.0 b/contrib/python/multidict/tests/istr-c.pickle.0
index 2be573802a5..2be573802a5 100644
--- a/contrib/python/multidict/tests/istr-c-extension.pickle.0
+++ b/contrib/python/multidict/tests/istr-c.pickle.0
diff --git a/contrib/python/multidict/tests/istr-c-extension.pickle.1 b/contrib/python/multidict/tests/istr-c.pickle.1
index 206775444b5..206775444b5 100644
--- a/contrib/python/multidict/tests/istr-c-extension.pickle.1
+++ b/contrib/python/multidict/tests/istr-c.pickle.1
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-c-extension.pickle.2 b/contrib/python/multidict/tests/istr-c.pickle.2
index 5c038d23faf..5c038d23faf 100644
--- a/contrib/python/multidict/tests/istr-c-extension.pickle.2
+++ b/contrib/python/multidict/tests/istr-c.pickle.2
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-c-extension.pickle.3 b/contrib/python/multidict/tests/istr-c.pickle.3
index a9184bb4c32..a9184bb4c32 100644
--- a/contrib/python/multidict/tests/istr-c-extension.pickle.3
+++ b/contrib/python/multidict/tests/istr-c.pickle.3
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-c-extension.pickle.4 b/contrib/python/multidict/tests/istr-c.pickle.4
index d6c52d24491..d6c52d24491 100644
--- a/contrib/python/multidict/tests/istr-c-extension.pickle.4
+++ b/contrib/python/multidict/tests/istr-c.pickle.4
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-c-extension.pickle.5 b/contrib/python/multidict/tests/istr-c.pickle.5
index fce4bc01efc..fce4bc01efc 100644
--- a/contrib/python/multidict/tests/istr-c-extension.pickle.5
+++ b/contrib/python/multidict/tests/istr-c.pickle.5
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-pure-python.pickle.0 b/contrib/python/multidict/tests/istr-py.pickle.0
index 9e3f0a2a6b7..9e3f0a2a6b7 100644
--- a/contrib/python/multidict/tests/istr-pure-python.pickle.0
+++ b/contrib/python/multidict/tests/istr-py.pickle.0
diff --git a/contrib/python/multidict/tests/istr-pure-python.pickle.1 b/contrib/python/multidict/tests/istr-py.pickle.1
index 88b7a9d434a..88b7a9d434a 100644
--- a/contrib/python/multidict/tests/istr-pure-python.pickle.1
+++ b/contrib/python/multidict/tests/istr-py.pickle.1
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-pure-python.pickle.2 b/contrib/python/multidict/tests/istr-py.pickle.2
index 9f17e5997e7..9f17e5997e7 100644
--- a/contrib/python/multidict/tests/istr-pure-python.pickle.2
+++ b/contrib/python/multidict/tests/istr-py.pickle.2
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-pure-python.pickle.3 b/contrib/python/multidict/tests/istr-py.pickle.3
index 09f70c0ae81..09f70c0ae81 100644
--- a/contrib/python/multidict/tests/istr-pure-python.pickle.3
+++ b/contrib/python/multidict/tests/istr-py.pickle.3
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-pure-python.pickle.4 b/contrib/python/multidict/tests/istr-py.pickle.4
index d092a4eb550..d092a4eb550 100644
--- a/contrib/python/multidict/tests/istr-pure-python.pickle.4
+++ b/contrib/python/multidict/tests/istr-py.pickle.4
Binary files differ
diff --git a/contrib/python/multidict/tests/istr-pure-python.pickle.5 b/contrib/python/multidict/tests/istr-py.pickle.5
index b8f03af6562..b8f03af6562 100644
--- a/contrib/python/multidict/tests/istr-pure-python.pickle.5
+++ b/contrib/python/multidict/tests/istr-py.pickle.5
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-c-extension.pickle.0 b/contrib/python/multidict/tests/multidict-c.pickle.0
index eb979fcf725..eb979fcf725 100644
--- a/contrib/python/multidict/tests/multidict-c-extension.pickle.0
+++ b/contrib/python/multidict/tests/multidict-c.pickle.0
diff --git a/contrib/python/multidict/tests/multidict-c-extension.pickle.1 b/contrib/python/multidict/tests/multidict-c.pickle.1
index a4f211d7b1b..a4f211d7b1b 100644
--- a/contrib/python/multidict/tests/multidict-c-extension.pickle.1
+++ b/contrib/python/multidict/tests/multidict-c.pickle.1
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-c-extension.pickle.2 b/contrib/python/multidict/tests/multidict-c.pickle.2
index b4563f879d0..b4563f879d0 100644
--- a/contrib/python/multidict/tests/multidict-c-extension.pickle.2
+++ b/contrib/python/multidict/tests/multidict-c.pickle.2
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-c-extension.pickle.3 b/contrib/python/multidict/tests/multidict-c.pickle.3
index 415960a3eed..415960a3eed 100644
--- a/contrib/python/multidict/tests/multidict-c-extension.pickle.3
+++ b/contrib/python/multidict/tests/multidict-c.pickle.3
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-c-extension.pickle.4 b/contrib/python/multidict/tests/multidict-c.pickle.4
index 00ef17c3f7f..00ef17c3f7f 100644
--- a/contrib/python/multidict/tests/multidict-c-extension.pickle.4
+++ b/contrib/python/multidict/tests/multidict-c.pickle.4
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-c-extension.pickle.5 b/contrib/python/multidict/tests/multidict-c.pickle.5
index 2c4ae0a0d38..2c4ae0a0d38 100644
--- a/contrib/python/multidict/tests/multidict-c-extension.pickle.5
+++ b/contrib/python/multidict/tests/multidict-c.pickle.5
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-pure-python.pickle.0 b/contrib/python/multidict/tests/multidict-py.pickle.0
index e91023ecf97..e91023ecf97 100644
--- a/contrib/python/multidict/tests/multidict-pure-python.pickle.0
+++ b/contrib/python/multidict/tests/multidict-py.pickle.0
diff --git a/contrib/python/multidict/tests/multidict-pure-python.pickle.1 b/contrib/python/multidict/tests/multidict-py.pickle.1
index acce9bf7939..acce9bf7939 100644
--- a/contrib/python/multidict/tests/multidict-pure-python.pickle.1
+++ b/contrib/python/multidict/tests/multidict-py.pickle.1
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-pure-python.pickle.2 b/contrib/python/multidict/tests/multidict-py.pickle.2
index 900446ad8da..900446ad8da 100644
--- a/contrib/python/multidict/tests/multidict-pure-python.pickle.2
+++ b/contrib/python/multidict/tests/multidict-py.pickle.2
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-pure-python.pickle.3 b/contrib/python/multidict/tests/multidict-py.pickle.3
index 9b9073515a7..9b9073515a7 100644
--- a/contrib/python/multidict/tests/multidict-pure-python.pickle.3
+++ b/contrib/python/multidict/tests/multidict-py.pickle.3
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-pure-python.pickle.4 b/contrib/python/multidict/tests/multidict-py.pickle.4
index db363f8d3c3..db363f8d3c3 100644
--- a/contrib/python/multidict/tests/multidict-pure-python.pickle.4
+++ b/contrib/python/multidict/tests/multidict-py.pickle.4
Binary files differ
diff --git a/contrib/python/multidict/tests/multidict-pure-python.pickle.5 b/contrib/python/multidict/tests/multidict-py.pickle.5
index 7dc772d58fb..7dc772d58fb 100644
--- a/contrib/python/multidict/tests/multidict-pure-python.pickle.5
+++ b/contrib/python/multidict/tests/multidict-py.pickle.5
Binary files differ
diff --git a/contrib/python/multidict/tests/test_circular_imports.py b/contrib/python/multidict/tests/test_circular_imports.py
index f6ea323ee22..75741388b0b 100644
--- a/contrib/python/multidict/tests/test_circular_imports.py
+++ b/contrib/python/multidict/tests/test_circular_imports.py
@@ -82,8 +82,10 @@ def test_no_warnings(import_path: str) -> None:
# fmt: off
sys.executable,
"-I",
- "-W", "error",
- "-c", f"import {import_path!s}",
+ "-W",
+ "error",
+ "-c",
+ f"import {import_path!s}",
# fmt: on
)
@@ -99,8 +101,10 @@ def test_c_extension_preferred_by_default(monkeypatch: pytest.MonkeyPatch) -> No
# fmt: off
sys.executable,
"-I",
- "-W", "error",
- "-c", "import multidict; raise SystemExit(int("
+ "-W",
+ "error",
+ "-c",
+ "import multidict; raise SystemExit(int("
"multidict.istr.__module__ != 'multidict._multidict' "
"or multidict.USE_EXTENSIONS is not True))",
# fmt: on
diff --git a/contrib/python/multidict/tests/test_multidict.py b/contrib/python/multidict/tests/test_multidict.py
index d1539fb45d2..eec0b862cd6 100644
--- a/contrib/python/multidict/tests/test_multidict.py
+++ b/contrib/python/multidict/tests/test_multidict.py
@@ -58,7 +58,7 @@ def chained_callable(
@pytest.fixture
-def cls( # type: ignore[misc]
+def cls(
request: pytest.FixtureRequest,
multidict_module: ModuleType,
) -> Callable[..., MultiMapping[int | str] | MutableMultiMapping[int | str]]:
@@ -708,7 +708,7 @@ class TestMultiDict(BaseMultiDictTest):
("MultiDict", "MultiDictProxy"),
],
)
- def cls( # type: ignore[misc]
+ def cls(
self,
request: pytest.FixtureRequest,
multidict_module: ModuleType,
@@ -800,7 +800,7 @@ class TestCIMultiDict(BaseMultiDictTest):
("CIMultiDict", "CIMultiDictProxy"),
],
)
- def cls( # type: ignore[misc]
+ def cls(
self,
request: pytest.FixtureRequest,
multidict_module: ModuleType,
@@ -1093,17 +1093,19 @@ class TestCIMultiDict(BaseMultiDictTest):
assert arg & d.items() == expected
def test_items_case_insensitive_or(self, cls: type[CIMultiDict[str]]) -> None:
- d = cls([("KEY", "one")])
+ d = cls([("K", "v"), ("KEY", "one")])
assert d.items() | {("key", "one"), ("other", "two")} == {
+ ("K", "v"),
("KEY", "one"),
("other", "two"),
}
def test_items_case_insensitive_ror(self, cls: type[CIMultiDict[str]]) -> None:
- d = cls([("KEY", "one"), ("KEY2", "three")])
+ d = cls([("K", "v"), ("KEY", "one"), ("KEY2", "three")])
assert [("key", "one"), ("other", "two")] | d.items() == {
+ ("K", "v"),
("key", "one"),
("other", "two"),
("KEY2", "three"),
@@ -1333,13 +1335,19 @@ def test_view_direct_instantiation_segfault() -> None:
This test only applies to the C extension implementation.
"""
# Test that _ItemsView cannot be instantiated directly
- with pytest.raises(TypeError, match="cannot create '.*_ItemsView' instances directly"):
+ with pytest.raises(
+ TypeError, match="cannot create '.*_ItemsView' instances directly"
+ ):
multidict._ItemsView() # type: ignore[attr-defined]
# Test that _KeysView cannot be instantiated directly
- with pytest.raises(TypeError, match="cannot create '.*_KeysView' instances directly"):
+ with pytest.raises(
+ TypeError, match="cannot create '.*_KeysView' instances directly"
+ ):
multidict._KeysView() # type: ignore[attr-defined]
# Test that _ValuesView cannot be instantiated directly
- with pytest.raises(TypeError, match="cannot create '.*_ValuesView' instances directly"):
+ with pytest.raises(
+ TypeError, match="cannot create '.*_ValuesView' instances directly"
+ ):
multidict._ValuesView() # type: ignore[attr-defined]
diff --git a/contrib/python/multidict/tests/test_multidict_benchmarks.py b/contrib/python/multidict/tests/test_multidict_benchmarks.py
index b5cc193c6af..b27041493ba 100644
--- a/contrib/python/multidict/tests/test_multidict_benchmarks.py
+++ b/contrib/python/multidict/tests/test_multidict_benchmarks.py
@@ -261,7 +261,8 @@ def test_multidict_getall_str_hit(
@benchmark
def _run() -> None:
- md.getall("key3")
+ for i in range(30):
+ md.getall("key3")
def test_multidict_getall_str_miss(
@@ -273,7 +274,8 @@ def test_multidict_getall_str_miss(
@benchmark
def _run() -> None:
- md.getall("miss", ())
+ for i in range(30):
+ md.getall("miss", ())
def test_cimultidict_getall_istr_hit(
@@ -287,7 +289,8 @@ def test_cimultidict_getall_istr_hit(
@benchmark
def _run() -> None:
- md.getall(all_istr)
+ for i in range(30):
+ md.getall(all_istr)
def test_cimultidict_getall_istr_miss(
@@ -301,7 +304,8 @@ def test_cimultidict_getall_istr_miss(
@benchmark
def _run() -> None:
- md.getall(miss_istr, ())
+ for i in range(30):
+ md.getall(miss_istr, ())
def test_multidict_fetch(
diff --git a/contrib/python/multidict/tests/test_mutable_multidict.py b/contrib/python/multidict/tests/test_mutable_multidict.py
index 74bbd697fee..d6fe42fc255 100644
--- a/contrib/python/multidict/tests/test_mutable_multidict.py
+++ b/contrib/python/multidict/tests/test_mutable_multidict.py
@@ -34,8 +34,7 @@ class TestMutableMultiDict:
d = case_sensitive_multidict_class([("key", "one"), ("key", "two")])
expected = (
- f"<{case_sensitive_multidict_class.__name__}"
- "('key': 'one', 'key': 'two')>"
+ f"<{case_sensitive_multidict_class.__name__}('key': 'one', 'key': 'two')>"
)
assert str(d) == expected
@@ -174,6 +173,21 @@ class TestMutableMultiDict:
d.add("key", "val2")
assert ("key", "val2") == d.popitem()
+ assert len(d) == 1
+ assert [("key", "val1")] == list(d.items())
+
+ def test_popitem2(
+ self,
+ case_sensitive_multidict_class: type[CIMultiDict[str]],
+ ) -> None:
+ d = case_sensitive_multidict_class()
+ d.add("key", "val1")
+ d.add("key", "val2")
+ d.add("key2", "val3")
+
+ del d["key2"] # make dummy at the end
+
+ assert ("key", "val2") == d.popitem()
assert [("key", "val1")] == list(d.items())
def test_popitem_empty_multidict(
@@ -365,6 +379,56 @@ class TestMutableMultiDict:
with pytest.raises(TypeError):
d.update("foo", "bar") # type: ignore[arg-type, call-arg]
+ def test_repr_with_dummy(
+ self, case_sensitive_multidict_class: type[MultiDict[int]]
+ ) -> None:
+ d = case_sensitive_multidict_class({"a": 1, "b": 2, "c": 3})
+ cls = d.__class__.__name__
+ del d["b"] # make a dummy entry
+ assert repr(d) == f"<{cls}('a': 1, 'c': 3)>"
+
+ def test_items_repr_with_dummy(
+ self, case_sensitive_multidict_class: type[MultiDict[int]]
+ ) -> None:
+ d = case_sensitive_multidict_class({"a": 1, "b": 2, "c": 3})
+ del d["b"] # make a dummy entry
+ cls = d.items().__class__.__name__
+ assert repr(d.items()) == f"<{cls}('a': 1, 'c': 3)>"
+
+ def test_keys_repr_with_dummy(
+ self, case_sensitive_multidict_class: type[MultiDict[int]]
+ ) -> None:
+ d = case_sensitive_multidict_class({"a": 1, "b": 2, "c": 3})
+ del d["b"] # make a dummy entry
+ cls = d.keys().__class__.__name__
+ assert repr(d.keys()) == f"<{cls}('a', 'c')>"
+
+ def test_values_repr_with_dummy(
+ self, case_sensitive_multidict_class: type[MultiDict[int]]
+ ) -> None:
+ d = case_sensitive_multidict_class({"a": 1, "b": 2, "c": 3})
+ del d["b"] # make a dummy entry
+ cls = d.values().__class__.__name__
+ assert repr(d.values()) == f"<{cls}(1, 3)>"
+
+ def test_huge_md(
+ self,
+ case_sensitive_multidict_class: type[MultiDict[int]],
+ ) -> None:
+ size = 1 << 16
+ d = case_sensitive_multidict_class((str(i), i) for i in range(size))
+ assert d[str(size // 2)] == size // 2
+
+ def test_create_from_proxy(
+ self,
+ case_sensitive_multidict_class: type[MultiDict[int]],
+ case_sensitive_multidict_proxy_class: type[MultiDictProxy[int]],
+ ) -> None:
+ d = case_sensitive_multidict_class({"a": 1, "b": 2, "c": 3})
+ p = case_sensitive_multidict_proxy_class(d)
+ d2 = case_sensitive_multidict_class(p)
+ assert d2 == d
+
class TestCIMutableMultiDict:
def test_getall(
@@ -429,8 +493,7 @@ class TestCIMutableMultiDict:
d = case_insensitive_multidict_class([("KEY", "one"), ("KEY", "two")])
expected = (
- f"<{case_insensitive_multidict_class.__name__}"
- "('KEY': 'one', 'KEY': 'two')>"
+ f"<{case_insensitive_multidict_class.__name__}('KEY': 'one', 'KEY': 'two')>"
)
assert str(d) == expected
@@ -730,3 +793,23 @@ class TestCIMutableMultiDict:
k, v = d.popitem()
assert type(k) is case_insensitive_str_class
+
+ def test_issue_1195(
+ self, case_insensitive_multidict_class: type[CIMultiDict[bytes]]
+ ) -> None:
+ md = case_insensitive_multidict_class(
+ {
+ "User-Agent": b"Bacon/1.0",
+ "Cookie": b"valued-visitor=yes;foo=bar",
+ "X-Bar": b"Foo",
+ "X-Foo": b"Bar",
+ "Referer": b"https://httpie.org/",
+ }
+ )
+
+ md2 = md.copy()
+
+ md.popone("User-Agent")
+ assert md.keys() == md2.keys() - {"User-Agent"}
+ md.update([("User-Agent", b"Bacon/1.0")])
+ assert md.keys() == md2.keys()
diff --git a/contrib/python/multidict/tests/test_types.py b/contrib/python/multidict/tests/test_types.py
index 6339006b68f..65f83f66a2a 100644
--- a/contrib/python/multidict/tests/test_types.py
+++ b/contrib/python/multidict/tests/test_types.py
@@ -75,8 +75,7 @@ def test_create_cimultidict_proxy_from_nonmultidict(
with pytest.raises(
TypeError,
match=(
- "ctor requires CIMultiDict or CIMultiDictProxy instance, "
- "not <class 'dict'>"
+ "ctor requires CIMultiDict or CIMultiDictProxy instance, not <class 'dict'>"
),
):
multidict_module.CIMultiDictProxy({})
diff --git a/contrib/python/multidict/tests/test_update.py b/contrib/python/multidict/tests/test_update.py
index 46ab30a08bd..a1d8814a3b2 100644
--- a/contrib/python/multidict/tests/test_update.py
+++ b/contrib/python/multidict/tests/test_update.py
@@ -119,3 +119,32 @@ def test_update_deque_arg_and_kwds(any_multidict_class: _MD_Classes) -> None:
obj.update(arg, b=2)
assert list(obj.items()) == [("a", 1), ("b", 2)]
assert arg == deque([("a", 1)])
+
+
+def test_update_with_second_md(any_multidict_class: _MD_Classes) -> None:
+ obj1 = any_multidict_class()
+ obj2 = any_multidict_class([("a", 2)])
+ obj1.update(obj2)
+ assert obj1 == obj2
+
+
+def test_compact_after_deletion(any_multidict_class: _MD_Classes) -> None:
+ # multidict is resized when it is filled up to 2/3 of the index table size
+ NUM = 16 * 2 // 3
+ obj = any_multidict_class((str(i), i) for i in range(NUM - 1))
+ # keys.usable == 0
+ # delete items, it adds empty entries but not reduce keys.usable
+ for i in range(5):
+ del obj[str(i)]
+ # adding an entry requres keys resizing to remove empty entries
+ dct = {str(i): i for i in range(100, 105)}
+ obj.extend(dct)
+ assert obj == {str(i): i for i in range(5, NUM - 1)} | dct
+
+
+def test_update_with_empty_slots(any_multidict_class: _MD_Classes) -> None:
+ # multidict is resized when it is filled up to 2/3 of the index table size
+ obj = any_multidict_class([("0", 0), ("1", 1), ("1", 2)])
+ del obj["0"]
+ obj.update({"1": 100})
+ assert obj == {"1": 100}