#!/usr/bin/env bash set -euo pipefail MOCK_PORT=18080 MOCK_PID="" MOCK_REQUEST_FILE="" MOCK_RESPONSE_CODE=201 MOCK_STATE_FILE="/tmp/mock_api_state" MOCK_SEQUENCE_FILE="" MOCK_CONFIG_FILE="" _kill_port() { local pids pids=$(lsof -ti ":$MOCK_PORT" 2>/dev/null) || true [ -n "$pids" ] && kill -9 $pids 2>/dev/null || true sleep 0.3 } _wait_port_free() { local i=0 while lsof -ti ":$MOCK_PORT" >/dev/null 2>&1 && [ $i -lt 30 ]; do sleep 0.1 i=$((i + 1)) done } mock_set_sequence() { MOCK_SEQUENCE_FILE=$(mktemp) echo "$1" | jq -c '.' > "$MOCK_SEQUENCE_FILE" echo "0" > "${MOCK_SEQUENCE_FILE}.idx" } mock_clear_sequence() { MOCK_SEQUENCE_FILE="" } mock_start() { MOCK_RESPONSE_CODE="${MOCK_RESPONSE_CODE:-201}" MOCK_REQUEST_FILE=$(mktemp) echo "$MOCK_REQUEST_FILE" > "$MOCK_STATE_FILE" MOCK_CONFIG_FILE=$(mktemp) if [ -n "${MOCK_SEQUENCE_FILE:-}" ] && [ -f "$MOCK_SEQUENCE_FILE" ]; then echo "SEQUENCE" > "$MOCK_CONFIG_FILE" cat "$MOCK_SEQUENCE_FILE" >> "$MOCK_CONFIG_FILE" printf '%s' "${MOCK_SEQUENCE_FILE}.idx" >> "$MOCK_CONFIG_FILE" else echo "SINGLE" > "$MOCK_CONFIG_FILE" echo "$MOCK_RESPONSE_CODE" >> "$MOCK_CONFIG_FILE" fi _kill_port _wait_port_free nohup python3 "$(dirname "${BASH_SOURCE[0]}")/mock-server.py" "$MOCK_PORT" "$MOCK_CONFIG_FILE" "$MOCK_REQUEST_FILE" \ /dev/null 2>&1 & MOCK_PID=$! sleep 0.5 } mock_stop() { [ -n "${MOCK_PID:-}" ] && kill -9 "$MOCK_PID" 2>/dev/null || true _kill_port _wait_port_free [ -n "${MOCK_REQUEST_FILE:-}" ] && rm -f "${MOCK_REQUEST_FILE}" 2>/dev/null || true [ -n "${MOCK_SEQUENCE_FILE:-}" ] && rm -f "${MOCK_SEQUENCE_FILE}" 2>/dev/null || true [ -n "${MOCK_SEQUENCE_FILE:-}" ] && rm -f "${MOCK_SEQUENCE_FILE}.idx" 2>/dev/null || true [ -n "${MOCK_CONFIG_FILE:-}" ] && rm -f "${MOCK_CONFIG_FILE}" 2>/dev/null || true rm -f "$MOCK_STATE_FILE" MOCK_PID="" MOCK_SEQUENCE_FILE="" MOCK_CONFIG_FILE="" } mock_set_response() { MOCK_RESPONSE_CODE="${1:-201}" } _get_request_file() { if [ -f "$MOCK_STATE_FILE" ]; then cat "$MOCK_STATE_FILE" elif [ -n "${MOCK_REQUEST_FILE:-}" ]; then echo "$MOCK_REQUEST_FILE" else echo "/dev/null" fi } mock_get_request_body() { local rf rf=$(_get_request_file) [ -f "$rf" ] && tail -1 "$rf" 2>/dev/null || true } mock_get_request_path() { local rf rf=$(_get_request_file) [ -f "$rf" ] && tail -2 "$rf" 2>/dev/null | head -1 | awk '{print $2}' || true } mock_get_first_request_path() { local rf rf=$(_get_request_file) [ -f "$rf" ] && head -1 "$rf" 2>/dev/null | awk '{print $2}' || true } mock_get_first_request_method() { local rf rf=$(_get_request_file) [ -f "$rf" ] && head -1 "$rf" 2>/dev/null | awk '{print $1}' || true } mock_get_first_request_body() { local rf rf=$(_get_request_file) [ -f "$rf" ] && sed -n '2p' "$rf" 2>/dev/null || true } mock_get_request_method() { local rf rf=$(_get_request_file) [ -f "$rf" ] && tail -2 "$rf" 2>/dev/null | head -1 | awk '{print $1}' || true }