diff --git a/respx/patterns.py b/respx/patterns.py index d8b00b5..8d80148 100644 --- a/respx/patterns.py +++ b/respx/patterns.py @@ -548,7 +548,9 @@ class Data(MultiItemsMixin, Pattern): value: MultiItems def clean(self, value: Dict) -> MultiItems: - return MultiItems(value) + return MultiItems( + (key, "" if value is None else str(value)) for key, value in value.items() + ) def parse(self, request: httpx.Request) -> Any: data, _ = decode_data(request) diff --git a/respx/utils.py b/respx/utils.py index 5a6ce3a..5eb4715 100644 --- a/respx/utils.py +++ b/respx/utils.py @@ -1,7 +1,18 @@ import email from datetime import datetime from email.message import Message -from typing import Dict, List, NamedTuple, Optional, Tuple, Type, TypeVar, Union, cast +from typing import ( + Any, + Dict, + List, + NamedTuple, + Optional, + Tuple, + Type, + TypeVar, + Union, + cast, +) from urllib.parse import parse_qsl try: @@ -13,13 +24,13 @@ class MultiItems(dict): - def get_list(self, key: str) -> List[str]: + def get_list(self, key: str) -> List[Any]: try: return [self[key]] except KeyError: # pragma: no cover return [] - def multi_items(self) -> List[Tuple[str, str]]: + def multi_items(self) -> List[Tuple[str, Any]]: return list(self.items()) diff --git a/tests/test_patterns.py b/tests/test_patterns.py index dda7914..4b119aa 100644 --- a/tests/test_patterns.py +++ b/tests/test_patterns.py @@ -350,6 +350,18 @@ def test_content_pattern(lookup, content, expected): None, True, ), + ( + Lookup.EQUAL, + {"none_value": None}, + None, + True, + ), + ( + Lookup.EQUAL, + {"non_str": 123}, + None, + True, + ), ( Lookup.EQUAL, {"x": "a"},