Skip to content

Commit e7c3a3f

Browse files
Optimize
1 parent da1f236 commit e7c3a3f

File tree

3 files changed

+50
-12
lines changed

3 files changed

+50
-12
lines changed

pytest_httpx_blockage/blockage.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,62 @@
11
from contextlib import contextmanager
2-
from typing import Any, Generator
2+
from typing import Any, Dict, Generator, Tuple
33
from unittest.mock import patch
44

5+
from httpcore import AsyncByteStream, SyncByteStream
56
from httpcore._async.connection import AsyncHTTPConnection
67
from httpcore._sync.connection import SyncHTTPConnection
7-
from httpx import URL
8+
from httpcore._types import URL, Headers
89

10+
from pytest_httpx_blockage.contextvar import is_blockage_enabled
911
from pytest_httpx_blockage.exceptions import RequestBlockageException
1012

13+
base_request_sync = SyncHTTPConnection.request
14+
base_request_async = AsyncHTTPConnection.arequest
15+
1116

1217
def side_effect(
18+
self: SyncHTTPConnection,
1319
method: bytes,
1420
url: URL,
1521
*args: Any,
1622
**kwargs: Any,
17-
) -> None:
18-
raise RequestBlockageException(f'Unmocked "{method.decode()}" request to host="{url}"')
23+
) -> Tuple[int, Headers, SyncByteStream, Dict[Any, Any]]:
24+
if is_blockage_enabled.get():
25+
raise RequestBlockageException(f'Unmocked "{method.decode()}" request to host="{url}"')
26+
else:
27+
return base_request_sync(
28+
self,
29+
method,
30+
url,
31+
*args,
32+
**kwargs,
33+
)
1934

2035

2136
async def async_side_effect(
37+
self: AsyncHTTPConnection,
2238
method: bytes,
2339
url: URL,
2440
*args: Any,
2541
**kwargs: Any,
26-
) -> None:
27-
side_effect(method=method, url=url)
42+
) -> Tuple[int, Headers, AsyncByteStream, Dict[Any, Any]]:
43+
if is_blockage_enabled.get():
44+
raise RequestBlockageException(f'Unmocked "{method.decode()}" request to host="{url}"')
45+
else:
46+
return await base_request_async(
47+
self,
48+
method,
49+
url,
50+
*args,
51+
**kwargs,
52+
)
2853

2954

3055
@contextmanager
3156
def blockage() -> Generator[None, None, None]:
32-
patch_sync = patch.object(SyncHTTPConnection, 'request')
33-
patch_async = patch.object(AsyncHTTPConnection, 'arequest')
57+
patch_sync = patch.object(SyncHTTPConnection, 'request', autospec=True)
58+
patch_async = patch.object(AsyncHTTPConnection, 'arequest', autospec=True)
59+
3460
with patch_sync as mocked_sync, patch_async as mocked_async:
3561
mocked_sync.side_effect = side_effect
3662
mocked_async.side_effect = async_side_effect

pytest_httpx_blockage/contextvar.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from contextvars import ContextVar
2+
3+
is_blockage_enabled: ContextVar[bool] = ContextVar('is_blockage_enabled', default=True)

pytest_httpx_blockage/plugin.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from _pytest.fixtures import SubRequest
66

77
from pytest_httpx_blockage.blockage import blockage
8+
from pytest_httpx_blockage.contextvar import is_blockage_enabled
89

910

1011
def pytest_addoption(parser: Parser) -> None:
@@ -34,7 +35,7 @@ def pytest_addoption(parser: Parser) -> None:
3435
)
3536

3637

37-
@pytest.fixture(autouse=True)
38+
@pytest.fixture(scope='session', autouse=True)
3839
def _blockage(request: SubRequest) -> Generator[None, None, None]:
3940
config = request.config
4041
blockage_enabled = config.getini('blockage-httpx') or config.getoption('--blockage-httpx')
@@ -43,11 +44,19 @@ def _blockage(request: SubRequest) -> Generator[None, None, None]:
4344
yield
4445
return
4546

47+
with blockage():
48+
yield
49+
50+
51+
@pytest.fixture(autouse=True)
52+
def _blockage_disable_mark(request: SubRequest) -> Generator[None, None, None]:
53+
config = request.config
4654
disable_mark_name = config.getini('disable-blockage-mark') or config.getoption('--disable-blockage-mark')
4755
mark = request.node.get_closest_marker(disable_mark_name or 'integration')
4856
if mark is not None:
49-
yield
50-
return
57+
is_blockage_enabled.set(False)
5158

52-
with blockage():
59+
try:
5360
yield
61+
finally:
62+
is_blockage_enabled.set(True)

0 commit comments

Comments
 (0)