Files
EventHubBack/test/scripts/test_websocket_api.sh

313 lines
9.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
BASE_URL="http://localhost:8080"
WS_URL="ws://localhost:8081/ws"
ADMIN_WS_URL="ws://localhost:8446/admin/ws"
DEBUG=${DEBUG:-false}
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_debug() {
if [ "$DEBUG" = "true" ]; then
echo -e "${CYAN}[DEBUG]${NC} $1"
fi
}
extract_json() {
echo "$1" | grep -o "\"$2\":\"[^\"]*\"" | head -1 | sed "s/\"$2\":\"//;s/\"$//"
}
http_post() {
local url=$1; local data=$2; local token=$3
log_debug "POST $url"
if [ -n "$token" ]; then
curl -s -X POST "$url" -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d "$data"
else
curl -s -X POST "$url" -H "Content-Type: application/json" -d "$data"
fi
}
http_get() {
local url=$1; local token=$2
log_debug "GET $url"
if [ -n "$token" ]; then
curl -s -X GET "$url" -H "Authorization: Bearer $token"
else
curl -s -X GET "$url"
fi
}
http_put() {
local url=$1; local data=$2; local token=$3
log_debug "PUT $url"
curl -s -X PUT "$url" -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d "$data"
}
# Проверка curl WebSocket (ручная проверка заголовков)
test_ws_curl() {
local url=$1
local token=$2
local full_url="${url}?token=${token}"
log_debug "Testing WebSocket with curl: $full_url"
# Используем --include для заголовков, --no-buffer для немедленного вывода
response=$(curl -s --include --no-buffer \
-H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==" \
-H "Sec-WebSocket-Version: 13" \
--max-time 2 \
"$full_url" 2>&1)
log_debug "Response: $(echo "$response" | head -5)"
if echo "$response" | grep -q "101"; then
log_debug "Got 101 Switching Protocols"
return 0
elif echo "$response" | grep -q "401"; then
log_debug "Got 401 Unauthorized"
return 1
elif echo "$response" | grep -q "403"; then
log_debug "Got 403 Forbidden"
return 2
elif echo "$response" | grep -q "404"; then
log_debug "Got 404 Not Found"
return 4
elif echo "$response" | grep -q "Invalid token"; then
log_debug "Got 'Invalid token' message"
return 1
else
log_debug "Unknown response"
return 3
fi
}
# Проверка наличия websocat
check_websocat() {
if ! command -v websocat &> /dev/null; then
log_warning "websocat не установлен"
echo "Установите websocat:"
echo " cargo install websocat"
echo " или скачайте с https://github.com/vi/websocat/releases"
return 1
fi
log_debug "websocat found: $(which websocat)"
return 0
}
echo "============================================================"
echo " EVENTHUB WEBSOCKET API TEST SCRIPT"
echo "============================================================"
echo ""
if [ "$DEBUG" = "true" ]; then
log_info "DEBUG MODE ENABLED"
fi
log_info "Checking if servers are running..."
if ! curl -s "$BASE_URL/health" | grep -q "ok"; then
log_error "Main server is not running on port 8080"
exit 1
fi
log_success "Main server is running"
if ! curl -s "http://localhost:8445/admin/health" | grep -q "ok"; then
log_warning "Admin server is not running on port 8445"
else
log_success "Admin server is running"
fi
echo ""
log_info "============================================================"
log_info "STEP 1: Create test users"
log_info "============================================================"
# Админ
ADMIN_EMAIL="ws_admin_$(date +%s)@example.com"
ADMIN_PASSWORD="admin123"
log_info "Creating admin user..."
response=$(http_post "$BASE_URL/v1/register" "{\"email\":\"$ADMIN_EMAIL\",\"password\":\"$ADMIN_PASSWORD\"}" "")
log_debug "Register response: $response"
ADMIN_TOKEN=$(extract_json "$response" "token")
ADMIN_ID=$(extract_json "$response" "id")
log_success "Admin created: $ADMIN_EMAIL"
log_debug "Admin token: ${ADMIN_TOKEN:0:30}..."
# Обычный пользователь
USER_EMAIL="ws_user_$(date +%s)@example.com"
USER_PASSWORD="user123"
log_info "Creating regular user..."
response=$(http_post "$BASE_URL/v1/register" "{\"email\":\"$USER_EMAIL\",\"password\":\"$USER_PASSWORD\"}" "")
USER_TOKEN=$(extract_json "$response" "token")
USER_ID=$(extract_json "$response" "id")
log_success "User created: $USER_EMAIL"
log_debug "User token: ${USER_TOKEN:0:30}..."
echo ""
log_info "============================================================"
log_info "STEP 2: Create calendar and event"
log_info "============================================================"
log_info "Creating calendar..."
response=$(http_post "$BASE_URL/v1/calendars" \
"{\"title\":\"WS Test Calendar\"}" "$USER_TOKEN")
CALENDAR_ID=$(extract_json "$response" "id")
log_success "Calendar created: $CALENDAR_ID"
log_debug "Calendar ID: $CALENDAR_ID"
log_info "Creating event..."
EVENT_START="2026-06-01T10:00:00Z"
response=$(http_post "$BASE_URL/v1/calendars/$CALENDAR_ID/events" \
"{\"title\":\"WS Test Event\",\"start_time\":\"$EVENT_START\",\"duration\":60,\"capacity\":10}" "$USER_TOKEN")
EVENT_ID=$(extract_json "$response" "id")
log_success "Event created: $EVENT_ID"
log_debug "Event ID: $EVENT_ID"
echo ""
log_info "============================================================"
log_info "TEST 1: Connect to WebSocket with valid token (curl test)"
log_info "============================================================"
test_ws_curl "$WS_URL" "$USER_TOKEN"
CURL_RESULT=$?
case $CURL_RESULT in
0)
log_success "WebSocket upgrade successful (101 Switching Protocols)"
;;
1)
log_error "WebSocket authentication failed (401 Unauthorized)"
log_debug "Token might be invalid or expired"
;;
2)
log_error "WebSocket access denied (403 Forbidden)"
;;
*)
log_error "WebSocket connection failed (unknown error)"
log_debug "Check if WebSocket server is running on port 8081"
;;
esac
echo ""
log_info "============================================================"
log_info "TEST 2: Connect with invalid token (curl test)"
log_info "============================================================"
test_ws_curl "$WS_URL" "invalid.token.here"
CURL_RESULT=$?
if [ $CURL_RESULT -eq 1 ]; then
log_success "Invalid token correctly rejected (401 Unauthorized)"
else
log_error "Invalid token should be rejected with 401"
fi
echo ""
log_info "============================================================"
log_info "TEST 3: Admin WebSocket with valid token (curl test)"
log_info "============================================================"
test_ws_curl "$ADMIN_WS_URL" "$ADMIN_TOKEN"
CURL_RESULT=$?
case $CURL_RESULT in
0)
log_success "Admin WebSocket upgrade successful"
;;
1)
log_error "Admin WebSocket authentication failed"
;;
2)
log_error "Admin WebSocket access denied (not admin)"
log_debug "Check if token has admin role"
;;
*)
log_error "Admin WebSocket connection failed"
;;
esac
echo ""
log_info "============================================================"
log_info "TEST 4: Admin WebSocket with user token (should fail)"
log_info "============================================================"
test_ws_curl "$ADMIN_WS_URL" "$USER_TOKEN"
CURL_RESULT=$?
if [ $CURL_RESULT -eq 2 ]; then
log_success "User token correctly rejected for admin WebSocket (403 Forbidden)"
elif [ $CURL_RESULT -eq 1 ]; then
log_warning "User token rejected with 401 instead of 403"
else
log_error "User token should be rejected"
fi
echo ""
log_info "============================================================"
log_info "WEBSOCKET API TESTS (curl validation) COMPLETED!"
log_info "============================================================"
# Опциональные тесты с websocat
if check_websocat; then
echo ""
log_info "============================================================"
log_info "OPTIONAL: Testing with websocat"
log_info "============================================================"
WS_URL_WITH_TOKEN="${WS_URL}?token=${USER_TOKEN}"
log_debug "WebSocket URL: $WS_URL_WITH_TOKEN"
TEMP_FILE=$(mktemp)
log_debug "Temp file: $TEMP_FILE"
# Запускаем websocat в фоне
log_info "Connecting with websocat..."
timeout 3 websocat "$WS_URL_WITH_TOKEN" > "$TEMP_FILE" 2>&1 &
WS_PID=$!
log_debug "WebSocket PID: $WS_PID"
sleep 1
if kill -0 $WS_PID 2>/dev/null; then
log_success "WebSocket connection established with websocat"
# Отправляем ping
echo '{"action":"ping"}' | timeout 2 websocat "$WS_URL_WITH_TOKEN" > "$TEMP_FILE" 2>&1
if grep -q "pong" "$TEMP_FILE"; then
log_success "Ping-pong successful"
fi
kill $WS_PID 2>/dev/null
else
log_warning "Websocket connection failed"
fi
rm -f "$TEMP_FILE"
fi
echo ""
echo "============================================================"
log_success "ALL WEBSOCKET TESTS COMPLETED!"
echo "============================================================"
echo ""
echo "Summary:"
echo " Admin: $ADMIN_EMAIL"
echo " User: $USER_EMAIL"
echo " Calendar: $CALENDAR_ID"
echo " Event: $EVENT_ID"
echo ""
echo "Run with DEBUG=true for more details:"
echo " DEBUG=true ./test/scripts/test_websocket_api.sh"
echo ""