Skip to content

Commit 209e4e1

Browse files
authored
Core: Allow replace/remove of mocked responses (#8499)
1 parent a3472d3 commit 209e4e1

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

moto/core/responses_custom_registry.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,23 @@ def add(self, response: responses.BaseResponse) -> responses.BaseResponse:
3232
self._registered[response.method].append(response)
3333
return response
3434

35+
def replace(self, response: responses.BaseResponse) -> responses.BaseResponse:
36+
registered = self._registered[response.method]
37+
try:
38+
index = registered.index(response)
39+
except ValueError:
40+
raise ValueError(f"Response is not registered for URL {response.url}")
41+
registered[index] = response
42+
return response
43+
44+
def remove(self, response: responses.BaseResponse) -> List[responses.BaseResponse]:
45+
removed_responses = []
46+
registered = self._registered[response.method]
47+
while response in registered:
48+
registered.remove(response)
49+
removed_responses.append(response)
50+
return removed_responses
51+
3552
def reset(self) -> None:
3653
self._registered.clear()
3754

tests/test_core/test_request_mocking.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
from unittest import SkipTest
2+
13
import boto3
24
import pytest
35
import requests
6+
from responses import Response
47

58
from moto import mock_aws, settings
9+
from moto.core.models import responses_mock
610

711

812
@mock_aws
@@ -48,3 +52,20 @@ def test_decorator_ordering() -> None:
4852

4953
resp = requests.get(presigned_url)
5054
assert resp.status_code == 200
55+
56+
57+
@mock_aws()
58+
def test_replace_and_remove_mock() -> None:
59+
if not settings.TEST_DECORATOR_MODE:
60+
raise SkipTest("Only need to test responses mock in decorator mode")
61+
rsp1 = Response(method="GET", url="http://example.com", body="test")
62+
responses_mock.add(rsp1)
63+
64+
assert requests.get("http://example.com/").text == "test"
65+
66+
rsp2 = Response(method="GET", url="http://example.com", body="test2")
67+
responses_mock.replace(rsp2)
68+
69+
assert requests.get("http://example.com/").text == "test2"
70+
71+
responses_mock.remove("GET", "https://example.com/")

0 commit comments

Comments
 (0)