# Created by AG on 23-12-2025
from __future__ import annotations
import time
import requests
from typing import Any, Dict, Tuple
from dataclasses import dataclass
@dataclass
class Record:
id: str
is_valid: bool
expected: str
status_code: int | None
elapsed_time_ms: float
error: str | None
response: str | None
def runner(
url: str,
http_method: str,
payload: Dict[str, Any],
headers: Dict[str, str] | None = None,
timeout: float = 10.0
) -> tuple[int | None, float, str | None, str | None]:
header = {
"Content-Type": "application/json"
}
if headers:
header.update(headers)
start_time = time.perf_counter()
try:
response = requests.request(
method=http_method.upper(),
url=url,
headers=header,
json=payload,
timeout=timeout
)
elapsed_time = (time.perf_counter() - start_time) * 1000.0
response_block = (response.text or "")[:500]
return response.status_code, elapsed_time, None, response_block
except Exception as err:
elapsed_time = (time.perf_counter() - start_time) * 1000.0
return None, elapsed_time, str(err), None
# def parse_runner_response(
# is_valid: bool,
# status_code: int | None,
# *,
# expect_2xx_for_valid: bool = True
# ) -> tuple[str, bool]:
# if status_code is None:
# expected = "pass" if is_valid else "fail"
# return expected, False
#
# if is_valid:
# expected = "pass" if is_valid else "fail"
# ok = (200 <= status_code < 300) if expect_2xx_for_valid else (status_code < 400)
# return expected, ok
#
# expected = "fail"
# ok = 400 <= status_code < 500
# return expected, ok
def parse_runner_response(
is_valid: bool,
status_code: int | None,
*,
expect_2xx_for_valid: bool = True,
) -> Tuple[str, bool]:
if status_code is None:
expected = "pass" if is_valid else "fail"
return expected, False
if is_valid:
expected = "pass"
if expect_2xx_for_valid:
return expected, 200 <= status_code < 300
return expected, status_code < 400
expected = "fail"
return expected, 400 <= status_code < 500