Files
super-man/tests/test-interactive-mode.sh
T
leetcrypt 2fb20b0682 refactor: rebrand bash-helper to super-man + ESC returns straight to menu
Rename bash-helper.sh -> super-man.sh and update all docs/tests to the
super-man name and alias. In interactive mode, pressing Esc in the flag
browser now returns directly to the home menu, removing the intermediary
"Press Enter to search another command" prompt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-05 20:52:18 -07:00

323 lines
8.5 KiB
Bash
Executable File

#!/bin/bash
# Interactive mode testing for Super Man
# Tests fzf-based interactive mode with automation
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
# Source test framework
source "$SCRIPT_DIR/test-framework.sh"
# Set script path
SCRIPT_PATH="$PROJECT_DIR/super-man.sh"
print_header
echo "Testing Interactive Mode"
echo "Script: $SCRIPT_PATH"
echo ""
# ============================================================================
# INTERACTIVE MODE TESTS
# ============================================================================
print_section "Interactive Mode - Automated Testing"
# Check if expect is installed
if ! command -v expect &> /dev/null; then
echo -e "${YELLOW}Warning: 'expect' not installed. Installing for interactive testing...${NC}"
# Try to install expect
if command -v apt-get &> /dev/null; then
sudo apt-get install -y expect > /dev/null 2>&1
else
skip_test "All interactive mode tests" "expect not available and cannot be installed"
print_summary
exit 0
fi
fi
# Check if fzf is installed
if ! command -v fzf &> /dev/null; then
skip_test "All interactive mode tests" "fzf not installed"
print_summary
exit 0
fi
# ============================================================================
# Test 1: Launch interactive mode and exit
# ============================================================================
echo -e "\n${CYAN}Test #1: Launch interactive mode and exit immediately${NC}"
TEST_LOG="$TEST_LOG_DIR/interactive_launch_test.log"
# Create expect script for immediate exit
cat > /tmp/super-man_test_exit.exp << 'EOF'
#!/usr/bin/expect -f
set timeout 10
log_user 0
spawn bash -c "./super-man.sh"
expect {
timeout { exit 1 }
eof { exit 0 }
"*" {
send "\x03"
expect eof
exit 0
}
}
EOF
chmod +x /tmp/super-man_test_exit.exp
cd "$PROJECT_DIR"
start_time=$(get_ms_timestamp)
/tmp/super-man_test_exit.exp > "$TEST_LOG" 2>&1
exit_code=$?
end_time=$(get_ms_timestamp)
duration=$((end_time - start_time))
TOTAL_TESTS=$((TOTAL_TESTS + 1))
if [ $exit_code -eq 0 ]; then
echo -e "${GREEN}✓ PASSED${NC} (${duration}ms)"
PASSED_TESTS=$((PASSED_TESTS + 1))
TEST_RESULTS["Interactive mode launch"]="PASSED"
TEST_TIMES["Interactive mode launch"]=$duration
else
echo -e "${RED}✗ FAILED${NC}"
FAILED_TESTS=$((FAILED_TESTS + 1))
TEST_RESULTS["Interactive mode launch"]="FAILED"
fi
# ============================================================================
# Test 2: Select a command and view flags
# ============================================================================
echo -e "\n${CYAN}Test #2: Select command and view flags${NC}"
TEST_LOG="$TEST_LOG_DIR/interactive_select_test.log"
# Create expect script to select grep and search for -v
cat > /tmp/super-man_test_select.exp << 'EOF'
#!/usr/bin/expect -f
set timeout 15
log_user 1
spawn bash -c "./super-man.sh"
# Wait for fzf to start
sleep 2
# Type 'grep' to filter
send "grep\r"
# Wait for selection
sleep 1
# Enter filter
send -- "-v\r"
# Wait for output
sleep 2
# Exit
send "\x03"
expect eof
EOF
chmod +x /tmp/super-man_test_select.exp
cd "$PROJECT_DIR"
start_time=$(get_ms_timestamp)
/tmp/super-man_test_select.exp > "$TEST_LOG" 2>&1
exit_code=$?
end_time=$(get_ms_timestamp)
duration=$((end_time - start_time))
TOTAL_TESTS=$((TOTAL_TESTS + 1))
# Check if output contains expected flag info
if grep -q "invert" "$TEST_LOG" || grep -q "Flags for: grep" "$TEST_LOG"; then
echo -e "${GREEN}✓ PASSED${NC} (${duration}ms)"
PASSED_TESTS=$((PASSED_TESTS + 1))
TEST_RESULTS["Interactive command selection"]="PASSED"
TEST_TIMES["Interactive command selection"]=$duration
else
echo -e "${YELLOW}⚠ PARTIAL${NC} - Could not verify flag display"
PASSED_TESTS=$((PASSED_TESTS + 1))
TEST_RESULTS["Interactive command selection"]="PARTIAL"
fi
# ============================================================================
# Test 3: Filter commands by category
# ============================================================================
echo -e "\n${CYAN}Test #3: Filter commands by category${NC}"
TEST_LOG="$TEST_LOG_DIR/interactive_filter_test.log"
# Create expect script to filter by "network"
cat > /tmp/super-man_test_filter.exp << 'EOF'
#!/usr/bin/expect -f
set timeout 15
log_user 1
spawn bash -c "./super-man.sh"
# Wait for fzf to start
sleep 2
# Type 'net' to filter network commands
send "net"
# Wait to see filtered results
sleep 2
# Exit
send "\x03"
expect eof
EOF
chmod +x /tmp/super-man_test_filter.exp
cd "$PROJECT_DIR"
start_time=$(get_ms_timestamp)
/tmp/super-man_test_filter.exp > "$TEST_LOG" 2>&1
exit_code=$?
end_time=$(get_ms_timestamp)
duration=$((end_time - start_time))
TOTAL_TESTS=$((TOTAL_TESTS + 1))
# Check if network commands appeared in filter
if grep -qE "ping|curl|wget|ssh|netstat" "$TEST_LOG"; then
echo -e "${GREEN}✓ PASSED${NC} (${duration}ms)"
PASSED_TESTS=$((PASSED_TESTS + 1))
TEST_RESULTS["Interactive filtering"]="PASSED"
TEST_TIMES["Interactive filtering"]=$duration
else
echo -e "${YELLOW}⚠ PARTIAL${NC} - Could not verify filtering"
PASSED_TESTS=$((PASSED_TESTS + 1))
TEST_RESULTS["Interactive filtering"]="PARTIAL"
fi
# ============================================================================
# Test 4: Multiple command selections
# ============================================================================
echo -e "\n${CYAN}Test #4: Test multiple commands (ls, tar, find)${NC}"
COMMANDS_TO_TEST=("ls" "tar" "find")
SUCCESS_COUNT=0
for cmd in "${COMMANDS_TO_TEST[@]}"; do
TEST_LOG="$TEST_LOG_DIR/interactive_${cmd}_test.log"
cat > /tmp/super-man_test_${cmd}.exp << EOF
#!/usr/bin/expect -f
set timeout 10
log_user 1
spawn bash -c "./super-man.sh"
sleep 2
send "${cmd}\r"
sleep 1
send "\r"
sleep 1
send "\x03"
expect eof
EOF
chmod +x /tmp/super-man_test_${cmd}.exp
cd "$PROJECT_DIR"
/tmp/super-man_test_${cmd}.exp > "$TEST_LOG" 2>&1
if [ $? -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
fi
done
TOTAL_TESTS=$((TOTAL_TESTS + 1))
if [ $SUCCESS_COUNT -eq ${#COMMANDS_TO_TEST[@]} ]; then
echo -e "${GREEN}✓ PASSED${NC} - All $SUCCESS_COUNT commands tested"
PASSED_TESTS=$((PASSED_TESTS + 1))
TEST_RESULTS["Multiple command selections"]="PASSED"
elif [ $SUCCESS_COUNT -gt 0 ]; then
echo -e "${YELLOW}⚠ PARTIAL${NC} - $SUCCESS_COUNT/${#COMMANDS_TO_TEST[@]} commands worked"
PASSED_TESTS=$((PASSED_TESTS + 1))
TEST_RESULTS["Multiple command selections"]="PARTIAL"
else
echo -e "${RED}✗ FAILED${NC}"
FAILED_TESTS=$((FAILED_TESTS + 1))
TEST_RESULTS["Multiple command selections"]="FAILED"
fi
# ============================================================================
# INTERACTIVE MODE PERFORMANCE TEST
# ============================================================================
print_section "Interactive Mode - Performance Analysis"
echo -e "\n${MAGENTA}Testing interactive mode startup performance (5 iterations)${NC}\n"
TOTAL_TIME=0
SUCCESS_COUNT=0
for i in {1..5}; do
TEST_LOG="$TEST_LOG_DIR/interactive_perf_$i.log"
cat > /tmp/super-man_perf_test.exp << 'EOF'
#!/usr/bin/expect -f
set timeout 10
log_user 0
spawn bash -c "./super-man.sh"
sleep 1
send "\x03"
expect eof
EOF
chmod +x /tmp/super-man_perf_test.exp
cd "$PROJECT_DIR"
start_time=$(get_ms_timestamp)
/tmp/super-man_perf_test.exp > "$TEST_LOG" 2>&1
exit_code=$?
end_time=$(get_ms_timestamp)
duration=$((end_time - start_time))
if [ $exit_code -eq 0 ]; then
TOTAL_TIME=$((TOTAL_TIME + duration))
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo -e " Iteration $i: ${GREEN}${duration}ms${NC}"
else
echo -e " Iteration $i: ${RED}FAILED${NC}"
fi
done
if [ $SUCCESS_COUNT -gt 0 ]; then
AVG_TIME=$((TOTAL_TIME / SUCCESS_COUNT))
echo -e "\n${CYAN}Average startup time: ${AVG_TIME}ms${NC}"
echo -e "${CYAN}Success rate: $SUCCESS_COUNT/5${NC}"
# Log to performance file
echo "$(get_timestamp)|interactive_mode_startup|$AVG_TIME|n/a|n/a|$SUCCESS_COUNT|5" >> "$PERF_LOG_DIR/benchmarks.csv"
fi
# Cleanup temp files
rm -f /tmp/super-man_*.exp
# ============================================================================
# SUMMARY
# ============================================================================
print_summary
EXIT_CODE=$?
echo -e "\n${CYAN}Interactive mode testing complete!${NC}"
echo -e "${CYAN}Logs: $TEST_LOG_DIR${NC}"
echo -e "${CYAN}Performance: $PERF_LOG_DIR${NC}"
exit $EXIT_CODE