runner.py

← Back to explorer
core/runner.py
# 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