|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +import gzip |
| 4 | +import io |
| 5 | +from typing import TYPE_CHECKING |
| 6 | + |
| 7 | +from werkzeug import Request, Response |
| 8 | + |
| 9 | +from apify_client import ApifyClient, ApifyClientAsync |
| 10 | + |
| 11 | +if TYPE_CHECKING: |
| 12 | + from pytest_httpserver import HTTPServer |
| 13 | + |
| 14 | +_MOCKED_KVS_ID = 'test_kvs_id' |
| 15 | +_RECORD_PATH = f'/v2/key-value-stores/{_MOCKED_KVS_ID}/records/f' |
| 16 | + |
| 17 | + |
| 18 | +def _decode_body(request: Request) -> bytes: |
| 19 | + raw = request.get_data() |
| 20 | + return gzip.decompress(raw) if request.headers.get('Content-Encoding') == 'gzip' else raw |
| 21 | + |
| 22 | + |
| 23 | +def test_set_record_reads_file_like_value_sync(httpserver: HTTPServer) -> None: |
| 24 | + """Regression test: a file-like value is read and its bytes are uploaded, not passed through unread.""" |
| 25 | + captured_requests: list[Request] = [] |
| 26 | + |
| 27 | + def capture_request(request: Request) -> Response: |
| 28 | + captured_requests.append(request) |
| 29 | + return Response(status=201) |
| 30 | + |
| 31 | + httpserver.expect_request(_RECORD_PATH, method='PUT').respond_with_handler(capture_request) |
| 32 | + |
| 33 | + api_url = httpserver.url_for('/').removesuffix('/') |
| 34 | + client = ApifyClient(token='test_token', api_url=api_url) |
| 35 | + |
| 36 | + client.key_value_store(_MOCKED_KVS_ID).set_record('f', io.BytesIO(b'buffer data')) |
| 37 | + |
| 38 | + assert len(captured_requests) == 1 |
| 39 | + assert _decode_body(captured_requests[0]) == b'buffer data' |
| 40 | + assert captured_requests[0].headers['content-type'] == 'application/octet-stream' |
| 41 | + |
| 42 | + |
| 43 | +async def test_set_record_reads_file_like_value_async(httpserver: HTTPServer) -> None: |
| 44 | + """Regression test: a file-like value is read and its bytes are uploaded, not passed through unread.""" |
| 45 | + captured_requests: list[Request] = [] |
| 46 | + |
| 47 | + def capture_request(request: Request) -> Response: |
| 48 | + captured_requests.append(request) |
| 49 | + return Response(status=201) |
| 50 | + |
| 51 | + httpserver.expect_request(_RECORD_PATH, method='PUT').respond_with_handler(capture_request) |
| 52 | + |
| 53 | + api_url = httpserver.url_for('/').removesuffix('/') |
| 54 | + client = ApifyClientAsync(token='test_token', api_url=api_url) |
| 55 | + |
| 56 | + await client.key_value_store(_MOCKED_KVS_ID).set_record('f', io.BytesIO(b'buffer data')) |
| 57 | + |
| 58 | + assert len(captured_requests) == 1 |
| 59 | + assert _decode_body(captured_requests[0]) == b'buffer data' |
| 60 | + assert captured_requests[0].headers['content-type'] == 'application/octet-stream' |
0 commit comments