|
4 | 4 | # Copyright (c) 2021 Ingram Micro. All Rights Reserved. |
5 | 5 | # |
6 | 6 | import json |
| 7 | +import re |
7 | 8 |
|
8 | 9 | import httpx |
9 | 10 | import responses |
@@ -36,8 +37,13 @@ def match(request): |
36 | 37 |
|
37 | 38 |
|
38 | 39 | class ConnectClientMocker(_ConnectClientBase): |
39 | | - def __init__(self, base_url): |
| 40 | + def __init__(self, base_url, exclude=None): |
40 | 41 | super().__init__('api_key', endpoint=base_url) |
| 42 | + if exclude: |
| 43 | + if not isinstance(exclude, (list, tuple, set)): |
| 44 | + exclude = [exclude] |
| 45 | + for item in exclude: |
| 46 | + _mocker.add_passthru(item) |
41 | 47 |
|
42 | 48 | def get( |
43 | 49 | self, |
@@ -169,14 +175,27 @@ def _get_namespace_class(self): |
169 | 175 |
|
170 | 176 |
|
171 | 177 | class AsyncConnectClientMocker(ConnectClientMocker): |
172 | | - def __init__(self, base_url): |
| 178 | + def __init__(self, base_url, exclude=None): |
173 | 179 | super().__init__(base_url) |
| 180 | + self.exclude = exclude or [] |
174 | 181 |
|
175 | 182 | def start(self): |
| 183 | + patterns = self.exclude if isinstance(self.exclude, (list, tuple, set)) else [self.exclude] |
| 184 | + real_async_transport = httpx.AsyncClient._transport_for_url |
| 185 | + |
| 186 | + def transport_for_url(self, url): |
| 187 | + for pattern in patterns: |
| 188 | + if ( |
| 189 | + (isinstance(pattern, re.Pattern) and pattern.match(str(url))) |
| 190 | + or (isinstance(pattern, str) and str(url).startswith(pattern)) |
| 191 | + ): |
| 192 | + return real_async_transport(self, url) |
| 193 | + return _PytestAsyncTransport(_async_mocker) |
| 194 | + |
176 | 195 | _monkeypatch.setattr( |
177 | 196 | httpx.AsyncClient, |
178 | 197 | '_transport_for_url', |
179 | | - lambda self, url: _PytestAsyncTransport(_async_mocker), |
| 198 | + transport_for_url, |
180 | 199 | ) |
181 | 200 |
|
182 | 201 | def reset(self, success=True): |
|
0 commit comments