OpenWriterControle/scripts/tests/test-non-interactive.sh
Liang Xiao 70b7d362dc
fix(install): include agent metadata config in profile installs (#280)
Co-authored-by: Leslie <leslie@Mac-mini.local>
2026-03-24 22:15:33 +00:00

271 lines
9.5 KiB
Bash
Executable file

#!/usr/bin/env bash
#############################################################################
# Non-Interactive Mode Test Script
# Tests the installer behavior when run via pipe (curl | bash)
#
# This test catches bugs like: https://github.com/darrenhinde/OpenAgentsControl/issues/XX
# where interactive prompts fail silently in piped execution.
#############################################################################
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
TEST_DIR="/tmp/opencode-noninteractive-test-$$"
PASSED=0
FAILED=0
pass() {
echo -e "${GREEN}✓${NC} $1"
PASSED=$((PASSED + 1))
}
fail() {
echo -e "${RED}✗${NC} $1"
FAILED=$((FAILED + 1))
}
warn() {
echo -e "${YELLOW}⚠${NC} $1"
}
setup() {
rm -rf "$TEST_DIR"
mkdir -p "$TEST_DIR"
}
# shellcheck disable=SC2329
cleanup() {
rm -rf "$TEST_DIR"
}
trap cleanup EXIT
print_header() {
echo -e "${CYAN}${BOLD}"
echo "╔════════════════════════════════════════════════════════════════╗"
echo "║ Non-Interactive Mode Test Suite ║"
echo "╚════════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
}
run_with_timeout() {
local duration=$1
shift
if command -v timeout &> /dev/null; then
timeout "$duration" "$@"
elif command -v gtimeout &> /dev/null; then
gtimeout "$duration" "$@"
else
# Fallback: run without timeout
"$@"
fi
}
#############################################################################
# Test 1: Fresh install with piped input (simulates curl | bash)
#############################################################################
test_fresh_install_piped() {
echo -e "\n${BOLD}Test 1: Fresh Install via Pipe${NC}"
local install_dir="$TEST_DIR/fresh-install/.opencode"
if echo "" | bash "$REPO_ROOT/install.sh" essential --install-dir="$install_dir" 2>&1 | grep -q "Installation complete"; then
if [ -d "$install_dir" ]; then
pass "Fresh install completed successfully via pipe"
if [ -f "$install_dir/config/agent-metadata.json" ]; then
pass "Fresh piped install included agent metadata config"
else
fail "Fresh piped install missing agent metadata config"
fi
else
fail "Install reported success but directory not created"
fi
else
fail "Fresh install via pipe failed"
fi
}
#############################################################################
# Test 2: Install with existing files (collision scenario)
#############################################################################
test_collision_non_interactive() {
echo -e "\n${BOLD}Test 2: Collision Handling in Non-Interactive Mode${NC}"
local install_dir="$TEST_DIR/collision-test/.opencode"
mkdir -p "$install_dir/agent/core"
echo "existing content" > "$install_dir/agent/core/openagent.md"
local output
output=$(echo "" | bash "$REPO_ROOT/install.sh" essential --install-dir="$install_dir" 2>&1)
if echo "$output" | grep -q "Installation cancelled by user"; then
fail "BUG DETECTED: Non-interactive mode cancelled due to collision prompt"
echo " This is the exact bug we're testing for!"
return 1
fi
if echo "$output" | grep -q "skip.*strategy\|Skipped existing"; then
pass "Collision handled correctly - used skip strategy"
elif echo "$output" | grep -q "Installation complete"; then
pass "Installation completed (no collision or handled silently)"
else
fail "Unexpected behavior during collision handling"
echo " Output: $output"
fi
local original_content
original_content=$(cat "$install_dir/agent/core/openagent.md" 2>/dev/null || echo "")
if [ "$original_content" = "existing content" ]; then
pass "Existing file preserved (skip strategy worked)"
else
warn "Existing file was overwritten (may be intentional in some modes)"
fi
}
#############################################################################
# Test 3: Essential profile in non-interactive mode (CI tests all profiles)
#############################################################################
test_profile_non_interactive() {
echo -e "\n${BOLD}Test 3: Essential Profile Non-Interactive${NC}"
local install_dir="$TEST_DIR/profile-essential/.opencode"
local output
output=$(echo "" | run_with_timeout 60 bash "$REPO_ROOT/install.sh" essential --install-dir="$install_dir" 2>&1) || true
if echo "$output" | grep -q "Installation complete"; then
pass "Profile 'essential' installed successfully"
elif echo "$output" | grep -q "Installation cancelled"; then
fail "Profile 'essential' failed - cancelled unexpectedly"
else
fail "Profile 'essential' had unexpected output"
fi
}
#############################################################################
# Test 4: Simulated curl | bash execution
#############################################################################
test_simulated_curl_pipe() {
echo -e "\n${BOLD}Test 4: Simulated curl | bash Execution${NC}"
local install_dir="$TEST_DIR/curl-sim/.opencode"
cat "$REPO_ROOT/install.sh" | bash -s essential --install-dir="$install_dir" > "$TEST_DIR/curl-output.txt" 2>&1
if grep -q "Installation complete\|Installed:" "$TEST_DIR/curl-output.txt"; then
pass "Simulated 'curl | bash -s essential' worked"
elif grep -q "cancelled" "$TEST_DIR/curl-output.txt"; then
fail "Simulated curl pipe was cancelled unexpectedly"
else
fail "Simulated curl pipe had unexpected result"
cat "$TEST_DIR/curl-output.txt"
fi
}
#############################################################################
# Test 5: stdin detection
#############################################################################
test_stdin_detection() {
echo -e "\n${BOLD}Test 5: stdin Detection${NC}"
if [ -t 0 ]; then
pass "Running in terminal (stdin is TTY)"
else
warn "Running in non-interactive mode (stdin is not TTY)"
fi
local in_pipe
in_pipe=$(echo "" | bash -c '[ -t 0 ] && echo "tty" || echo "pipe"')
if [ "$in_pipe" = "pipe" ]; then
pass "Pipe detection works correctly"
else
fail "Pipe detection failed"
fi
}
#############################################################################
# Test 6: NON_INTERACTIVE flag is set correctly
#############################################################################
test_non_interactive_flag() {
echo -e "\n${BOLD}Test 6: NON_INTERACTIVE Flag Detection${NC}"
local output
output=$(bash "$REPO_ROOT/install.sh" essential --help 2>&1 | head -20)
if echo "$output" | grep -q "Usage:"; then
pass "Script executes and shows help"
else
fail "Script failed to show help"
fi
output=$(echo "" | bash "$REPO_ROOT/install.sh" essential --install-dir="$TEST_DIR/flag-test" 2>&1)
if echo "$output" | grep -q "non-interactive\|automatically"; then
pass "Non-interactive mode detected and reported"
else
pass "Installation proceeded (flag working silently)"
fi
}
#############################################################################
# Test 7: Error handling in non-interactive mode
#############################################################################
test_error_handling_non_interactive() {
echo -e "\n${BOLD}Test 7: Error Handling in Non-Interactive Mode${NC}"
local output
output=$(echo "" | bash "$REPO_ROOT/install.sh" invalid_profile 2>&1) || true
if echo "$output" | grep -q "Unknown option\|Invalid\|Error"; then
pass "Invalid profile rejected with clear error"
else
fail "Invalid profile should produce error message"
fi
}
#############################################################################
# Main
#############################################################################
main() {
print_header
echo "Repository: $REPO_ROOT"
echo "Test directory: $TEST_DIR"
echo ""
setup
test_fresh_install_piped
test_collision_non_interactive
test_profile_non_interactive
test_simulated_curl_pipe
test_stdin_detection
test_non_interactive_flag
test_error_handling_non_interactive
echo ""
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
echo -e "${BOLD}Test Summary${NC}"
echo -e " ${GREEN}Passed: $PASSED${NC}"
echo -e " ${RED}Failed: $FAILED${NC}"
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
if [ $FAILED -gt 0 ]; then
echo -e "\n${RED}Some tests failed!${NC}"
exit 1
else
echo -e "\n${GREEN}All tests passed!${NC}"
exit 0
fi
}
main "$@"