#!/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 ""