Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prevent method and url as lookups in HTTP method helpers #183

Merged
merged 3 commits into from
Nov 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 15 additions & 7 deletions respx/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,14 @@ def request(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
if lookups:
# Validate that lookups doesn't contain method or url
pattern_keys = {p.split("__", 1)[0] for p in lookups.keys()}
if "method" in pattern_keys:
raise TypeError("Got multiple values for pattern 'method'")
elif url and "url" in pattern_keys:
raise TypeError("Got multiple values for pattern 'url'")

return self.route(method=method, url=url, name=name, **lookups)

def get(
Expand All @@ -163,7 +171,7 @@ def get(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
return self.route(method="GET", url=url, name=name, **lookups)
return self.request(method="GET", url=url, name=name, **lookups)

def post(
self,
Expand All @@ -172,7 +180,7 @@ def post(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
return self.route(method="POST", url=url, name=name, **lookups)
return self.request(method="POST", url=url, name=name, **lookups)

def put(
self,
Expand All @@ -181,7 +189,7 @@ def put(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
return self.route(method="PUT", url=url, name=name, **lookups)
return self.request(method="PUT", url=url, name=name, **lookups)

def patch(
self,
Expand All @@ -190,7 +198,7 @@ def patch(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
return self.route(method="PATCH", url=url, name=name, **lookups)
return self.request(method="PATCH", url=url, name=name, **lookups)

def delete(
self,
Expand All @@ -199,7 +207,7 @@ def delete(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
return self.route(method="DELETE", url=url, name=name, **lookups)
return self.request(method="DELETE", url=url, name=name, **lookups)

def head(
self,
Expand All @@ -208,7 +216,7 @@ def head(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
return self.route(method="HEAD", url=url, name=name, **lookups)
return self.request(method="HEAD", url=url, name=name, **lookups)

def options(
self,
Expand All @@ -217,7 +225,7 @@ def options(
name: Optional[str] = None,
**lookups: Any,
) -> Route:
return self.route(method="OPTIONS", url=url, name=name, **lookups)
return self.request(method="OPTIONS", url=url, name=name, **lookups)

def record(
self,
Expand Down
8 changes: 8 additions & 0 deletions tests/test_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,14 @@ def test_rollback():
assert route.return_value is None


def test_multiple_pattern_values_type_error():
router = Router()
with pytest.raises(TypeError, match="Got multiple values for pattern 'method'"):
router.post(method__in=("PUT", "PATCH"))
with pytest.raises(TypeError, match="Got multiple values for pattern 'url'"):
router.get("https://foo.bar", url__regex=r"https://example.org$")


def test_routelist__add():
routes = RouteList()

Expand Down