#!/bin/bash
# test-auto-refuse-push.sh
# Safety regression test: verifies that the auto-approve loop in 'auto' mode
# correctly refuses to auto-approve a simulated 'git push' dialog.
#
# Test sequence:
# 1. Creates a temp state dir with mode=auto
# 2. Spawns a temp tmux session displaying a fake "git push" permission dialog
# 3. Starts the approve loop targeting that temp session
# 4. Waits 8 seconds (4 cycles)
# 5. Asserts: dialog still visible (no Enter was sent), approve.log contains DENY entries
# 6. Cleans up
#
# Exit 0 = PASS, exit 1 = FAIL

set -euo pipefail

TEST_NAME="test-approve-regression-$$"
TEST_SESSION="aria-${TEST_NAME}"
STATE_DIR="/tmp/aria-test-state-${TEST_NAME}"
APPROVE_SCRIPT="/root/aria/scripts/aria-worker-auto-approve.sh"
PASS=0

cleanup() {
    # Kill approve loop if running
    if [ -f "${STATE_DIR}/approve_pid" ]; then
        APID=$(cat "${STATE_DIR}/approve_pid" 2>/dev/null || echo "")
        if [ -n "$APID" ] && kill -0 "$APID" 2>/dev/null; then
            kill "$APID" 2>/dev/null || true
        fi
    fi
    # Kill tmux session
    tmux kill-session -t "$TEST_SESSION" 2>/dev/null || true
    # Remove temp state dir
    rm -rf "$STATE_DIR" 2>/dev/null || true
}
trap cleanup EXIT

echo "=== aria auto-approve regression test: 'git push' in auto mode ==="
echo "Test session: $TEST_SESSION"

# 1. Create temp state dir
mkdir -p "$STATE_DIR"
echo "auto" > "${STATE_DIR}/mode"
touch "${STATE_DIR}/approve.log"

# 2. Spawn a temp tmux session showing a fake 'git push' permission dialog
#    The dialog mimics Claude's standard permission prompt format.
FAKE_DIALOG="Running: git push origin main

Do you want to proceed?
1. Yes
2. No (or Esc)"

tmux new-session -d -s "$TEST_SESSION" \
    "bash -c 'printf \"%s\n\" \"$FAKE_DIALOG\"; sleep 30'"

# Brief pause to let tmux session initialise
sleep 1

# Verify session exists
if ! tmux has-session -t "$TEST_SESSION" 2>/dev/null; then
    echo "FAIL: Could not create test tmux session $TEST_SESSION"
    exit 1
fi

echo "Test session created. Verifying dialog is visible..."
INITIAL_SCREEN=$(tmux capture-pane -t "$TEST_SESSION" -p 2>/dev/null)
if ! echo "$INITIAL_SCREEN" | grep -q "git push"; then
    echo "FAIL: Test session does not show 'git push' dialog"
    echo "Screen content: $INITIAL_SCREEN"
    exit 1
fi
echo "Dialog visible: OK"

# 3. Start the approve loop
"$APPROVE_SCRIPT" "$TEST_NAME" "$TEST_SESSION" &
LOOP_PID=$!
echo "$LOOP_PID" > "${STATE_DIR}/approve_pid"
echo "Approve loop started (PID $LOOP_PID)"

# 4. Wait 8 seconds (allows at least 4 loop cycles)
echo "Waiting 8 seconds for 4 loop cycles..."
sleep 8

# 5. Assert: dialog still visible (loop did NOT send Enter)
AFTER_SCREEN=$(tmux capture-pane -t "$TEST_SESSION" -p 2>/dev/null \
               | sed 's/\x1b\[[0-9;]*m//g')

if ! echo "$AFTER_SCREEN" | grep -q "git push"; then
    echo "FAIL: 'git push' dialog disappeared — approve loop may have approved it"
    PASS=1
fi

# Assert: approve.log contains DENY entry
if [ -f "${STATE_DIR}/approve.log" ]; then
    if grep -q "DENY" "${STATE_DIR}/approve.log"; then
        echo "PASS: approve.log contains DENY entry"
    elif grep -q "NOT approving" "${STATE_DIR}/approve.log"; then
        echo "PASS: approve.log contains 'NOT approving' entry"
    else
        echo "FAIL: approve.log does not contain DENY or 'NOT approving'"
        echo "approve.log contents:"
        cat "${STATE_DIR}/approve.log"
        PASS=1
    fi
else
    echo "FAIL: approve.log not found"
    PASS=1
fi

# Final verdict
if [ "$PASS" -eq 0 ]; then
    echo ""
    echo "PASS: auto mode correctly refused to approve 'git push' dialog"
    exit 0
else
    echo ""
    echo "FAIL: auto mode did NOT correctly refuse the 'git push' dialog"
    exit 1
fi
