import json import logging from itertools import chain from operator import methodcaller, itemgetter from typing import Iterable import pytest import requests from funcy import curry, rcompose, compose, lmap from test.utils.server import bytes_to_string, string_to_bytes logger = logging.getLogger("PIL.PngImagePlugin") logger.setLevel(logging.INFO) def lift(fn): return curry(map)(fn) def post_partial(url, input_data: Iterable[bytes], metadata): def pack(data: bytes): package = {"data": bytes_to_string(data), "metadata": metadata} package = json.dumps(package).encode() return package def post(data): return requests.post(url, data=data) pack_data_and_metadata_for_rest_transfer = lift(pack) send_packages_to_analyzer_and_receive_responses = lift(post) extract_data_from_responses = lift(compose(itemgetter("data"), methodcaller("json"))) flatten_buffered_payloads = chain.from_iterable interpret_payloads = lift(string_to_bytes) input_data_to_result_data = rcompose( pack_data_and_metadata_for_rest_transfer, send_packages_to_analyzer_and_receive_responses, extract_data_from_responses, flatten_buffered_payloads, interpret_payloads, ) return input_data_to_result_data((*input_data, b"")) @pytest.mark.parametrize("item_type", ["string", "image"]) def test_sending_partial_request(url, data_items, metadata, operation, server_process): expected = lmap(operation, data_items) output = list(post_partial(f"{url}/process", data_items, metadata)) assert output == expected @pytest.fixture def metadata(): return {"idx": [1, 100, 101], "path": "asd/asd"}