Reorganize project: move docs to docs/ and test scripts to tests/
Moved 9 documentation .md files from root into docs/. Moved 4 test scripts from root into tests/. Updated cross-references in README.md and docs to reflect new paths. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
268
tests/test-webhook.sh
Executable file
268
tests/test-webhook.sh
Executable file
@@ -0,0 +1,268 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Webhook Test Script (Bash/curl version)
|
||||
# This script tests the webhook system using only curl and bash
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Configuration
|
||||
API_URL="${API_URL:-https://hso.cottongin.xyz/api}"
|
||||
WEBHOOK_PORT="${WEBHOOK_PORT:-3001}"
|
||||
WEBHOOK_SECRET="test_secret_$(date +%s)"
|
||||
|
||||
echo -e "\n${BLUE}╔════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Webhook Test Script (curl) ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════╝${NC}\n"
|
||||
|
||||
# Check if JWT_TOKEN is set
|
||||
if [ -z "$JWT_TOKEN" ]; then
|
||||
echo -e "${RED}❌ ERROR: JWT_TOKEN not set!${NC}\n"
|
||||
echo "Please set your JWT token:"
|
||||
echo " 1. Get token:"
|
||||
echo " curl -X POST https://hso.cottongin.xyz/api/auth/login \\"
|
||||
echo " -H \"Content-Type: application/json\" \\"
|
||||
echo " -d '{\"key\":\"YOUR_ADMIN_KEY\"}'"
|
||||
echo ""
|
||||
echo " 2. Export the token:"
|
||||
echo " export JWT_TOKEN=\"your_token_here\""
|
||||
echo ""
|
||||
echo " 3. Run this script:"
|
||||
echo " ./test-webhook.sh"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if nc (netcat) is available
|
||||
if ! command -v nc &> /dev/null; then
|
||||
echo -e "${RED}❌ ERROR: 'nc' (netcat) command not found!${NC}"
|
||||
echo "Please install netcat to run this test."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓${NC} JWT_TOKEN is set"
|
||||
echo -e "${GREEN}✓${NC} API URL: $API_URL"
|
||||
echo -e "${GREEN}✓${NC} Webhook Port: $WEBHOOK_PORT"
|
||||
echo -e "${GREEN}✓${NC} Webhook Secret: $WEBHOOK_SECRET"
|
||||
echo ""
|
||||
|
||||
# Start a simple webhook receiver in the background
|
||||
echo -e "${BLUE}🚀 Starting webhook receiver on port $WEBHOOK_PORT...${NC}"
|
||||
|
||||
# Create a named pipe for communication
|
||||
FIFO="/tmp/webhook_test_$$"
|
||||
mkfifo "$FIFO"
|
||||
|
||||
# Simple HTTP server using netcat
|
||||
(
|
||||
while true; do
|
||||
{
|
||||
# Read the request
|
||||
read -r REQUEST
|
||||
|
||||
# Read headers until empty line
|
||||
CONTENT_LENGTH=0
|
||||
SIGNATURE=""
|
||||
EVENT=""
|
||||
while read -r HEADER; do
|
||||
HEADER=$(echo "$HEADER" | tr -d '\r')
|
||||
[ -z "$HEADER" ] && break
|
||||
|
||||
if [[ "$HEADER" =~ ^Content-Length:\ ([0-9]+) ]]; then
|
||||
CONTENT_LENGTH="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
if [[ "$HEADER" =~ ^X-Webhook-Signature:\ (.+) ]]; then
|
||||
SIGNATURE="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
if [[ "$HEADER" =~ ^X-Webhook-Event:\ (.+) ]]; then
|
||||
EVENT="${BASH_REMATCH[1]}"
|
||||
fi
|
||||
done
|
||||
|
||||
# Read body if Content-Length is set
|
||||
BODY=""
|
||||
if [ "$CONTENT_LENGTH" -gt 0 ]; then
|
||||
BODY=$(dd bs=1 count="$CONTENT_LENGTH" 2>/dev/null)
|
||||
fi
|
||||
|
||||
# Log the webhook
|
||||
if [ -n "$BODY" ]; then
|
||||
echo "" >> "$FIFO"
|
||||
echo "📨 Webhook received!" >> "$FIFO"
|
||||
echo " Event: $EVENT" >> "$FIFO"
|
||||
echo " Signature: $SIGNATURE" >> "$FIFO"
|
||||
echo " Body: $BODY" >> "$FIFO"
|
||||
echo "" >> "$FIFO"
|
||||
fi
|
||||
|
||||
# Send response
|
||||
echo "HTTP/1.1 200 OK"
|
||||
echo "Content-Type: text/plain"
|
||||
echo "Content-Length: 2"
|
||||
echo ""
|
||||
echo "OK"
|
||||
} | nc -l -p "$WEBHOOK_PORT" -q 1
|
||||
done
|
||||
) &
|
||||
|
||||
WEBHOOK_PID=$!
|
||||
|
||||
# Display webhook output in background
|
||||
tail -f "$FIFO" &
|
||||
TAIL_PID=$!
|
||||
|
||||
# Give the server a moment to start
|
||||
sleep 2
|
||||
|
||||
echo -e "${GREEN}✓${NC} Webhook receiver started (PID: $WEBHOOK_PID)"
|
||||
echo -e "${GREEN}✓${NC} Listening on http://localhost:$WEBHOOK_PORT/webhook/jackbox"
|
||||
echo ""
|
||||
|
||||
# Cleanup function
|
||||
cleanup() {
|
||||
echo ""
|
||||
echo -e "${YELLOW}🧹 Cleaning up...${NC}"
|
||||
|
||||
if [ -n "$WEBHOOK_ID" ]; then
|
||||
echo " Deleting webhook $WEBHOOK_ID..."
|
||||
DELETE_RESPONSE=$(curl -s -w "\n%{http_code}" -X DELETE \
|
||||
"$API_URL/api/webhooks/$WEBHOOK_ID" \
|
||||
-H "Authorization: Bearer $JWT_TOKEN")
|
||||
|
||||
DELETE_CODE=$(echo "$DELETE_RESPONSE" | tail -n1)
|
||||
if [ "$DELETE_CODE" = "200" ]; then
|
||||
echo -e " ${GREEN}✓${NC} Webhook deleted"
|
||||
else
|
||||
echo -e " ${YELLOW}⚠${NC} Could not delete webhook (you may need to delete it manually)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo " Stopping webhook receiver..."
|
||||
kill $WEBHOOK_PID 2>/dev/null || true
|
||||
kill $TAIL_PID 2>/dev/null || true
|
||||
rm -f "$FIFO"
|
||||
echo -e " ${GREEN}✓${NC} Cleanup complete"
|
||||
echo ""
|
||||
echo -e "${BLUE}👋 Goodbye!${NC}\n"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Trap Ctrl+C
|
||||
trap cleanup SIGINT SIGTERM
|
||||
|
||||
echo -e "${BLUE}═══════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${BLUE}Starting Webhook Tests${NC}"
|
||||
echo -e "${BLUE}═══════════════════════════════════════════════════════${NC}\n"
|
||||
|
||||
# Test 1: Create webhook
|
||||
echo -e "${YELLOW}📝 Test 1: Creating webhook...${NC}"
|
||||
CREATE_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
||||
"$API_URL/api/webhooks" \
|
||||
-H "Authorization: Bearer $JWT_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{
|
||||
\"name\": \"Test Webhook\",
|
||||
\"url\": \"http://host.docker.internal:$WEBHOOK_PORT/webhook/jackbox\",
|
||||
\"secret\": \"$WEBHOOK_SECRET\",
|
||||
\"events\": [\"game.added\"]
|
||||
}")
|
||||
|
||||
CREATE_CODE=$(echo "$CREATE_RESPONSE" | tail -n1)
|
||||
CREATE_BODY=$(echo "$CREATE_RESPONSE" | head -n-1)
|
||||
|
||||
if [ "$CREATE_CODE" = "201" ]; then
|
||||
WEBHOOK_ID=$(echo "$CREATE_BODY" | grep -o '"id":[0-9]*' | grep -o '[0-9]*')
|
||||
echo -e "${GREEN}✓${NC} Webhook created with ID: $WEBHOOK_ID"
|
||||
echo " Response: $CREATE_BODY"
|
||||
else
|
||||
echo -e "${RED}✗${NC} Failed to create webhook (HTTP $CREATE_CODE)"
|
||||
echo " Response: $CREATE_BODY"
|
||||
cleanup
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 2: List webhooks
|
||||
echo -e "${YELLOW}📝 Test 2: Listing webhooks...${NC}"
|
||||
LIST_RESPONSE=$(curl -s -w "\n%{http_code}" \
|
||||
"$API_URL/api/webhooks" \
|
||||
-H "Authorization: Bearer $JWT_TOKEN")
|
||||
|
||||
LIST_CODE=$(echo "$LIST_RESPONSE" | tail -n1)
|
||||
LIST_BODY=$(echo "$LIST_RESPONSE" | head -n-1)
|
||||
|
||||
if [ "$LIST_CODE" = "200" ]; then
|
||||
WEBHOOK_COUNT=$(echo "$LIST_BODY" | grep -o '"id":' | wc -l)
|
||||
echo -e "${GREEN}✓${NC} Found $WEBHOOK_COUNT webhook(s)"
|
||||
else
|
||||
echo -e "${RED}✗${NC} Failed to list webhooks (HTTP $LIST_CODE)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 3: Send test webhook
|
||||
echo -e "${YELLOW}📝 Test 3: Sending test webhook...${NC}"
|
||||
TEST_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
||||
"$API_URL/api/webhooks/test/$WEBHOOK_ID" \
|
||||
-H "Authorization: Bearer $JWT_TOKEN")
|
||||
|
||||
TEST_CODE=$(echo "$TEST_RESPONSE" | tail -n1)
|
||||
|
||||
if [ "$TEST_CODE" = "200" ]; then
|
||||
echo -e "${GREEN}✓${NC} Test webhook sent"
|
||||
else
|
||||
echo -e "${RED}✗${NC} Failed to send test webhook (HTTP $TEST_CODE)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Wait for webhook delivery
|
||||
echo -e "${YELLOW}⏳ Waiting for webhook delivery (5 seconds)...${NC}"
|
||||
sleep 5
|
||||
echo ""
|
||||
|
||||
# Test 4: Check webhook logs
|
||||
echo -e "${YELLOW}📝 Test 4: Checking webhook logs...${NC}"
|
||||
LOGS_RESPONSE=$(curl -s -w "\n%{http_code}" \
|
||||
"$API_URL/api/webhooks/$WEBHOOK_ID/logs?limit=10" \
|
||||
-H "Authorization: Bearer $JWT_TOKEN")
|
||||
|
||||
LOGS_CODE=$(echo "$LOGS_RESPONSE" | tail -n1)
|
||||
LOGS_BODY=$(echo "$LOGS_RESPONSE" | head -n-1)
|
||||
|
||||
if [ "$LOGS_CODE" = "200" ]; then
|
||||
LOG_COUNT=$(echo "$LOGS_BODY" | grep -o '"id":' | wc -l)
|
||||
echo -e "${GREEN}✓${NC} Found $LOG_COUNT log entries"
|
||||
echo ""
|
||||
echo "Recent webhook deliveries:"
|
||||
echo "$LOGS_BODY" | python3 -m json.tool 2>/dev/null || echo "$LOGS_BODY"
|
||||
else
|
||||
echo -e "${RED}✗${NC} Failed to get webhook logs (HTTP $LOGS_CODE)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Summary
|
||||
echo -e "${BLUE}═══════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${BLUE}Test Summary${NC}"
|
||||
echo -e "${BLUE}═══════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${GREEN}✓${NC} Webhook created: ID $WEBHOOK_ID"
|
||||
echo -e "${GREEN}✓${NC} Test webhook sent"
|
||||
echo -e "${GREEN}✓${NC} Webhook logs: $LOG_COUNT entries"
|
||||
echo -e "${BLUE}═══════════════════════════════════════════════════════${NC}\n"
|
||||
|
||||
echo -e "${GREEN}🎉 All tests completed!${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}💡 Next steps:${NC}"
|
||||
echo " 1. Add a game to an active session in the Picker page"
|
||||
echo " 2. Watch for the webhook to be received above"
|
||||
echo " 3. Press Ctrl+C to cleanup and exit"
|
||||
echo ""
|
||||
echo -e "${YELLOW}⏳ Webhook receiver is still running...${NC}"
|
||||
echo ""
|
||||
|
||||
# Keep running until Ctrl+C
|
||||
wait $WEBHOOK_PID
|
||||
|
||||
Reference in New Issue
Block a user