From 72c67ba8271dd7b8bc8a8986011140c4a56ec7cb Mon Sep 17 00:00:00 2001 From: Maksim Beliaev Date: Mon, 27 Jun 2022 23:31:27 +0200 Subject: [PATCH] Fix registries from being re-used instead of the default registry * fix registry #563 * add async test --- CHANGES | 1 + responses/__init__.py | 9 ++++--- responses/tests/test_registries.py | 38 ++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index bcd26b59..d0880931 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ ------ * Add `passthrough` argument to `BaseResponse` object. See #557 +* Fix `registries` leak. See #563 0.21.0 ------ diff --git a/responses/__init__.py b/responses/__init__.py index 30b9597c..1a6bd2e9 100644 --- a/responses/__init__.py +++ b/responses/__init__.py @@ -181,9 +181,6 @@ def get_wrapped( Wrapped function """ - if registry is not None: - responses._set_registry(registry) - assert_mock = std_mock.patch.object( target=responses, attribute="assert_all_requests_are_fired", @@ -195,6 +192,9 @@ def get_wrapped( @wraps(func) async def wrapper(*args: Any, **kwargs: Any) -> Any: # type: ignore[misc] + if registry is not None: + responses._set_registry(registry) + with assert_mock, responses: return await func(*args, **kwargs) @@ -203,6 +203,9 @@ async def wrapper(*args: Any, **kwargs: Any) -> Any: # type: ignore[misc] @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> Any: # type: ignore[misc] + if registry is not None: + responses._set_registry(registry) + with assert_mock, responses: # set 'assert_all_requests_are_fired' temporarily for a single run. # Mock automatically unsets to avoid leakage to another decorated diff --git a/responses/tests/test_registries.py b/responses/tests/test_registries.py index 4dd57652..2ab035b1 100644 --- a/responses/tests/test_registries.py +++ b/responses/tests/test_registries.py @@ -43,6 +43,44 @@ def run(): assert_reset() +def test_set_registry_reversed(): + """See https://github.com/getsentry/responses/issues/563""" + + class CustomRegistry(registries.FirstMatchRegistry): + pass + + @responses.activate + def run(): + # test that registry does not leak to another test + assert type(responses.mock.get_registry()) == registries.FirstMatchRegistry + + @responses.activate(registry=CustomRegistry) + def run_with_registry(): + assert type(responses.mock.get_registry()) == CustomRegistry + + run() + run_with_registry() + assert_reset() + + +async def test_registry_async(): + class CustomRegistry(registries.FirstMatchRegistry): + pass + + @responses.activate + async def run(): + # test that registry does not leak to another test + assert type(responses.mock.get_registry()) == registries.FirstMatchRegistry + + @responses.activate(registry=CustomRegistry) + async def run_with_registry(): + assert type(responses.mock.get_registry()) == CustomRegistry + + await run() + await run_with_registry() + assert_reset() + + def test_set_registry_context_manager(): def run(): class CustomRegistry(registries.FirstMatchRegistry):