#!/usr/bin/env bash set -euo pipefail MOCK_PORT="" MOCK_PID="" MOCK_REQUEST_FILE="" MOCK_RESPONSE_CODE=201 MOCK_STATE_FILE="/tmp/mock_api_state" MOCK_SEQUENCE_FILE="" MOCK_CONFIG_FILE="" _free_port() { python3 -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()" } _wait_port_ready() { local i=0 while [ $i -lt 30 ]; do if nc -z localhost "$MOCK_PORT" 2>/dev/null; then return 0 fi sleep 0.1 i=$((i + 1)) done return 1 } 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_PORT=$(_free_port) export MOCK_PORT MOCK_URL="http://localhost:${MOCK_PORT}" export SERVER_URL="$MOCK_URL" export GITEA_API_URL="$MOCK_URL" 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 nohup python3 "$(dirname "${BASH_SOURCE[0]}")/mock-server.py" "$MOCK_PORT" "$MOCK_CONFIG_FILE" "$MOCK_REQUEST_FILE" \ /dev/null 2>&1 & disown MOCK_PID=$! _wait_port_ready } mock_stop() { [ -n "${MOCK_PID:-}" ] && kill -9 "$MOCK_PID" 2>/dev/null || true [ -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 }