Skip to content

Commit

Permalink
Add router.replace and route.name setter to prevent change
Browse files Browse the repository at this point in the history
  • Loading branch information
lundberg committed Nov 11, 2020
1 parent 47d11ed commit 2fb2206
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 11 deletions.
18 changes: 16 additions & 2 deletions respx/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ def __init__(
**lookups: Any,
) -> None:
self.pattern = M(*patterns, **lookups)
self.name: Optional[str] = None # TODO: Add setter to prevent change
self.calls = CallList()
self._return_value: Optional[httpx.Response] = None
self._side_effect: Optional[SideEffectTypes] = None
self._pass_through: bool = False
self._name: Optional[str] = None
self.snapshot()

def __hash__(self):
Expand Down Expand Up @@ -139,6 +139,21 @@ def __mod__(self, response: Union[int, Dict[str, Any]]) -> "Route":

return self

@property
def id(self):
return self._name or hash(self)

@property
def name(self) -> Optional[str]:
return self._name

@name.setter
def name(self, name: str) -> None:
if self._name is None:
self._name = name
else:
raise NotImplementedError("Can't change name on route, use pop + add")

@property
def return_value(self) -> Optional[httpx.Response]:
return self._return_value
Expand Down Expand Up @@ -305,7 +320,6 @@ def resolve(
elif self._return_value:
result = self._return_value

# if result is None:
else:
# Auto mock a new response
result = httpx.Response(200, request=request)
Expand Down
22 changes: 13 additions & 9 deletions respx/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,19 +114,23 @@ def add(self, route: Route, *, name: Optional[str] = None) -> Route:
route.pattern = merge_patterns(route.pattern, **self._bases)
route.name = name

route_id = route.name or hash(route)
if route_id in self.routes:
# Identical route already exists, swap with new one
existing_route = self.routes[route_id]
existing_route.return_value = route.return_value
existing_route.side_effect = route.side_effect
existing_route._pass_through = route._pass_through
route = existing_route
if route.id in self.routes:
route = self.replace(route)
else:
self.routes[route_id] = route
self.routes[route.id] = route

return route

def replace(self, route: Route) -> Route:
"""
Replace existing route with same pattern, in same place (order).
"""
existing_route = self.routes[route.id]
existing_route.return_value = route.return_value
existing_route.side_effect = route.side_effect
existing_route.pass_through(route.is_pass_through)
return existing_route

def get(
self,
url: Optional[URLPatternTypes] = None,
Expand Down
3 changes: 3 additions & 0 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,9 @@ def test_add():
with pytest.raises(ValueError):
respx.add("GET") # pragma: nocover

with pytest.raises(NotImplementedError):
route.name = "spam"


def test_respond():
with respx.mock:
Expand Down

0 comments on commit 2fb2206

Please sign in to comment.