From 33438de1a0e713cf05ab2e40d2ec94ce16daaafc Mon Sep 17 00:00:00 2001 From: Rutger Prins Date: Fri, 7 Jul 2023 16:53:43 +0200 Subject: [PATCH] Enable content__contains pattern (#236) Co-authored-by: Jonas Lundberg --- docs/api.md | 3 ++- respx/patterns.py | 5 ++++- tests/test_patterns.py | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/api.md b/docs/api.md index 4c8686f..7432767 100644 --- a/docs/api.md +++ b/docs/api.md @@ -301,10 +301,11 @@ respx.get("all://*.example.org/foo/") ### Content Matches request raw *content*, using [eq](#eq) as default lookup. > Key: `content` -> Lookups: [eq](#eq) +> Lookups: [eq](#eq), [contains](#contains) ``` python respx.post("https://example.org/", content="foobar") respx.post("https://example.org/", content=b"foobar") +respx.post("https://example.org/", content__contains="bar") ``` ### Data diff --git a/respx/patterns.py b/respx/patterns.py index 24316cc..ed4c51d 100644 --- a/respx/patterns.py +++ b/respx/patterns.py @@ -483,7 +483,7 @@ def parse(self, request: httpx.Request) -> Any: class Content(ContentMixin, Pattern): - lookups = (Lookup.EQUAL,) + lookups = (Lookup.EQUAL, Lookup.CONTAINS) key = "content" value: bytes @@ -492,6 +492,9 @@ def clean(self, value: Union[bytes, str]) -> bytes: return value.encode() return value + def _contains(self, value: Union[bytes, str]) -> Match: + return Match(self.value in value) + class JSON(ContentMixin, PathPattern): lookups = (Lookup.EQUAL,) diff --git a/tests/test_patterns.py b/tests/test_patterns.py index ed44f77..e704b40 100644 --- a/tests/test_patterns.py +++ b/tests/test_patterns.py @@ -311,6 +311,9 @@ def test_url_pattern_hash(): [ (Lookup.EQUAL, b"foobar", True), (Lookup.EQUAL, "foobar", True), + (Lookup.CONTAINS, b"bar", True), + (Lookup.CONTAINS, "bar", True), + (Lookup.CONTAINS, "baz", False), ], ) def test_content_pattern(lookup, content, expected):