|
| 1 | +from typing import Any, Dict, Optional, Union |
| 2 | + |
| 3 | +from requests import PreparedRequest, Request, Response, Session |
| 4 | +from requests.structures import CaseInsensitiveDict |
| 5 | + |
| 6 | +from algoliasearch.http.base_config import BaseConfig |
| 7 | +from algoliasearch.http.hosts import CallType, Host, HostsCollection |
| 8 | +from algoliasearch.http.request_options import RequestOptions |
| 9 | +from algoliasearch.http.transporter_sync import TransporterSync |
| 10 | +from algoliasearch.http.verb import Verb |
| 11 | + |
| 12 | + |
| 13 | +class FakeResponse(Response): |
| 14 | + def __init__(self, body_text: str) -> None: |
| 15 | + super().__init__() |
| 16 | + self.status_code = 200 |
| 17 | + self.headers = CaseInsensitiveDict() |
| 18 | + self.reason = "OK" |
| 19 | + self._body_text = body_text |
| 20 | + |
| 21 | + @property |
| 22 | + def text(self) -> str: |
| 23 | + return self._body_text |
| 24 | + |
| 25 | + |
| 26 | +class FakeSession(Session): |
| 27 | + def __init__(self, response: FakeResponse) -> None: |
| 28 | + super().__init__() |
| 29 | + self._response = response |
| 30 | + self.prepare_request_calls = 0 |
| 31 | + self.prepared_input: Optional[Request] = None |
| 32 | + self.prepared_request = PreparedRequest() |
| 33 | + self.send_input: Optional[PreparedRequest] = None |
| 34 | + |
| 35 | + def prepare_request(self, request: Request) -> PreparedRequest: |
| 36 | + self.prepare_request_calls += 1 |
| 37 | + self.prepared_input = request |
| 38 | + self.prepared_request = super().prepare_request(request) |
| 39 | + return self.prepared_request |
| 40 | + |
| 41 | + def send( |
| 42 | + self, |
| 43 | + request: PreparedRequest, |
| 44 | + verify: Union[bool, str] = True, |
| 45 | + stream: bool = False, |
| 46 | + cert: Optional[Union[str, tuple]] = None, |
| 47 | + proxies: Optional[Dict[str, str]] = None, |
| 48 | + timeout: Optional[Union[float, tuple]] = None, |
| 49 | + allow_redirects: bool = True, |
| 50 | + **kwargs: Any, |
| 51 | + ) -> Response: |
| 52 | + _ = stream |
| 53 | + _ = timeout |
| 54 | + _ = verify |
| 55 | + _ = cert |
| 56 | + _ = proxies |
| 57 | + _ = allow_redirects |
| 58 | + _ = kwargs |
| 59 | + self.send_input = request |
| 60 | + return self._response |
| 61 | + |
| 62 | + |
| 63 | +def create_config() -> BaseConfig: |
| 64 | + config = BaseConfig("test-app", "test-key") |
| 65 | + config.hosts = HostsCollection( |
| 66 | + [Host("localhost", accept=CallType.READ | CallType.WRITE)] |
| 67 | + ) |
| 68 | + return config |
| 69 | + |
| 70 | + |
| 71 | +def test_sync_transporter_uses_session_prepare_request_and_sends_gzip() -> None: |
| 72 | + config = create_config() |
| 73 | + transporter = TransporterSync(config) |
| 74 | + fake_response = FakeResponse('{"ok":true}') |
| 75 | + fake_session = FakeSession(fake_response) |
| 76 | + transporter._session = fake_session |
| 77 | + |
| 78 | + response = transporter.request( |
| 79 | + verb=Verb.GET, |
| 80 | + path="/test", |
| 81 | + request_options=RequestOptions(config).merge(), |
| 82 | + use_read_transporter=True, |
| 83 | + ) |
| 84 | + |
| 85 | + assert fake_session.prepare_request_calls == 1 |
| 86 | + assert isinstance(fake_session.prepared_input, Request) |
| 87 | + assert fake_session.prepared_input.method in (Verb.GET, "GET") |
| 88 | + assert fake_session.send_input is fake_session.prepared_request |
| 89 | + assert fake_session.send_input is not None |
| 90 | + accept_encoding = fake_session.send_input.headers.get("Accept-Encoding") |
| 91 | + assert accept_encoding is not None |
| 92 | + assert "gzip" in accept_encoding.lower() |
| 93 | + assert response.status_code == 200 |
0 commit comments