diff --git a/respx/models.py b/respx/models.py index 9690324..2f12caa 100644 --- a/respx/models.py +++ b/respx/models.py @@ -327,14 +327,18 @@ def _next_side_effect( return effect def _call_side_effect( - self, effect: CallableSideEffect, request: httpx.Request, **kwargs: Any + self, effect: CallableSideEffect, request: httpx.Request, /, is_async: bool, **kwargs: Any ) -> RouteResultTypes: # Add route kwarg if the side effect wants it argspec = inspect.getfullargspec(effect) if "route" in kwargs: warn(f"Matched context contains reserved word `route`: {self.pattern!r}") + if "is_async" in kwargs: + warn(f"Matched context contains reserved word `is_async`: {self.pattern!r}") if "route" in argspec.args: kwargs["route"] = self + if "is_async" in argspec.args: + kwargs["is_async"] = is_async try: # Call side effect @@ -357,7 +361,7 @@ def _call_side_effect( return result def _resolve_side_effect( - self, request: httpx.Request, **kwargs: Any + self, request: httpx.Request, /, is_async: bool, **kwargs: Any ) -> RouteResultTypes: effect = self._next_side_effect() @@ -379,17 +383,17 @@ def _resolve_side_effect( # Handle `Callable` side effect elif callable(effect): - result = self._call_side_effect(effect, request, **kwargs) + result = self._call_side_effect(effect, request, is_async, **kwargs) return result # Resolved effect is a mocked response return effect - def resolve(self, request: httpx.Request, **kwargs: Any) -> RouteResultTypes: + def resolve(self, request: httpx.Request, /, is_async: bool, **kwargs: Any) -> RouteResultTypes: result: RouteResultTypes = None if self._side_effect: - result = self._resolve_side_effect(request, **kwargs) + result = self._resolve_side_effect(request, is_async, **kwargs) if result is None: return None # Side effect resolved as a non-matching route @@ -406,7 +410,7 @@ def resolve(self, request: httpx.Request, **kwargs: Any) -> RouteResultTypes: return result - def match(self, request: httpx.Request) -> RouteResultTypes: + def match(self, request: httpx.Request, /, is_async: bool) -> RouteResultTypes: """ Matches and resolves request with given patterns and optional side effect. @@ -424,7 +428,7 @@ def match(self, request: httpx.Request) -> RouteResultTypes: if self._pass_through: return request - result = self.resolve(request, **context) + result = self.resolve(request, is_async, **context) return result diff --git a/respx/router.py b/respx/router.py index 449a5a4..8fa49d6 100644 --- a/respx/router.py +++ b/respx/router.py @@ -276,7 +276,7 @@ def resolver(self, request: httpx.Request) -> Generator[ResolvedRoute, None, Non def resolve(self, request: httpx.Request) -> ResolvedRoute: with self.resolver(request) as resolved: for route in self.routes: - prospect = route.match(request) + prospect = route.match(request, False) if prospect is not None: resolved.route = route resolved.response = cast(ResolvedResponseTypes, prospect) @@ -290,7 +290,7 @@ def resolve(self, request: httpx.Request) -> ResolvedRoute: async def aresolve(self, request: httpx.Request) -> ResolvedRoute: with self.resolver(request) as resolved: for route in self.routes: - prospect: RouteResultTypes = route.match(request) + prospect: RouteResultTypes = route.match(request, True) # Await async side effect and wrap any exception if inspect.isawaitable(prospect):