- Standalone SQS-service repository - Multi-tenant message queue service, AWS SQS compatible - Based on GoAws, with mutable tenants, auth, WebUI, Redis persistence - Ready for independent development and deployment - See doc/ and README.md for architecture and usage
177 lines
6.9 KiB
Bash
Executable File
177 lines
6.9 KiB
Bash
Executable File
#!/bin/bash
|
||
# tests/quick_test.sh — Быстрая проверка shared-sqs (smoke test)
|
||
# Created: 2026-04-09
|
||
# Покрывает: создание тенанта + очереди, send/receive/delete сообщения,
|
||
# UI API peek/send/purge, удаление очереди и тенанта.
|
||
# Требования: curl, aws CLI, python3
|
||
# Запуск:
|
||
# bash tests/quick_test.sh
|
||
# BASE_URL=https://qu.kube5s.ru ADMIN_TOKEN=... bash tests/quick_test.sh
|
||
|
||
set -uo pipefail
|
||
|
||
BASE_URL="${BASE_URL:-https://qu.kube5s.ru}"
|
||
ADMIN_TOKEN="${ADMIN_TOKEN:-sqs-admin-7a7d8bd0c060a75c198d48680f34077a}"
|
||
REGION="us-east-1"
|
||
TS=$(date +%s)
|
||
|
||
PASS=0
|
||
FAIL=0
|
||
|
||
ok() { echo " ✅ $1"; PASS=$((PASS+1)); }
|
||
fail() { echo " ❌ $1"; FAIL=$((FAIL+1)); }
|
||
|
||
check() {
|
||
local label="$1" body="$2" pattern="$3"
|
||
if echo "$body" | grep -qE "$pattern"; then ok "$label"; else fail "$label"; fi
|
||
}
|
||
|
||
check_not() {
|
||
local label="$1" body="$2" pattern="$3"
|
||
if echo "$body" | grep -qE "$pattern"; then fail "$label"; else ok "$label"; fi
|
||
}
|
||
|
||
check_http() {
|
||
local label="$1" want="$2" got="$3"
|
||
if [[ "$got" == "$want" ]]; then ok "$label (HTTP $got)"; else fail "$label — ожидалось $want, получено $got"; fi
|
||
}
|
||
|
||
# aws CLI с credentials тенанта
|
||
sqs() {
|
||
local ak="$1" sk="$2"; shift 2
|
||
AWS_ACCESS_KEY_ID="$ak" AWS_SECRET_ACCESS_KEY="$sk" AWS_DEFAULT_REGION="$REGION" \
|
||
aws --endpoint-url "$BASE_URL" --output json sqs "$@" 2>&1
|
||
}
|
||
|
||
admin() {
|
||
local method="$1" path="$2" body="${3:-}"
|
||
if [[ -n "$body" ]]; then
|
||
curl -sf --max-time 15 -X "$method" \
|
||
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
||
-H "Content-Type: application/json" \
|
||
-d "$body" "${BASE_URL}${path}" 2>&1
|
||
else
|
||
curl -sf --max-time 15 -X "$method" \
|
||
-H "Authorization: Bearer $ADMIN_TOKEN" \
|
||
"${BASE_URL}${path}" 2>&1
|
||
fi
|
||
}
|
||
|
||
# ui_api — UI API без авторизации (публичный)
|
||
ui() {
|
||
local method="$1" path="$2" body="${3:-}"
|
||
if [[ -n "$body" ]]; then
|
||
curl -sf --max-time 15 -X "$method" \
|
||
-H "Content-Type: application/json" \
|
||
-d "$body" "${BASE_URL}/ui/api${path}" 2>&1
|
||
else
|
||
curl -sf --max-time 15 -X "$method" "${BASE_URL}/ui/api${path}" 2>&1
|
||
fi
|
||
}
|
||
|
||
echo "════════════════════════════════════════"
|
||
echo " shared-sqs Quick Test"
|
||
echo " Endpoint: $BASE_URL"
|
||
echo "════════════════════════════════════════"
|
||
echo ""
|
||
|
||
# ── 1. Health ──
|
||
echo "── 1. Health ──"
|
||
R=$(curl -sf --max-time 10 "${BASE_URL}/health" 2>&1)
|
||
check "GET /health → OK" "$R" "[Oo][Kk]|status"
|
||
R=$(ui GET /health)
|
||
check "GET /ui/api/health → ok" "$R" "ok"
|
||
echo ""
|
||
|
||
# ── 2. Создание тенанта ──
|
||
echo "── 2. Создание тенанта ──"
|
||
RESP=$(admin POST /admin/tenants '{"name":"quick-'"$TS"'","max_queues":5}')
|
||
check "POST /admin/tenants → access_key" "$RESP" "access_key"
|
||
AK=$(echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin)['access_key'])")
|
||
SK=$(echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin)['secret_key'])")
|
||
TID=$(echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
|
||
echo " Tenant ID: $TID"
|
||
echo " Access Key: $AK"
|
||
echo ""
|
||
|
||
# ── 3. AWS CLI CRUD ──
|
||
echo "── 3. AWS CLI CRUD ──"
|
||
QNAME="quick-q-$TS"
|
||
|
||
R=$(sqs "$AK" "$SK" create-queue --queue-name "$QNAME")
|
||
check "CreateQueue → QueueUrl" "$R" "QueueUrl"
|
||
QURL=$(echo "$R" | python3 -c "import sys,json; print(json.load(sys.stdin)['QueueUrl'])")
|
||
|
||
R=$(sqs "$AK" "$SK" list-queues)
|
||
check "ListQueues → очередь $QNAME в списке" "$R" "$QNAME"
|
||
|
||
R=$(sqs "$AK" "$SK" send-message --queue-url "$QURL" --message-body "hello-quick-$TS")
|
||
check "SendMessage → MessageId" "$R" "MessageId"
|
||
|
||
R=$(sqs "$AK" "$SK" receive-message --queue-url "$QURL")
|
||
check "ReceiveMessage → тело сообщения" "$R" "hello-quick-$TS"
|
||
RECEIPT=$(echo "$R" | python3 -c "import sys,json; msgs=json.load(sys.stdin).get('Messages',[]); print(msgs[0]['ReceiptHandle'] if msgs else '')" 2>/dev/null || true)
|
||
|
||
if [[ -n "$RECEIPT" ]]; then
|
||
sqs "$AK" "$SK" delete-message --queue-url "$QURL" --receipt-handle "$RECEIPT" >/dev/null 2>&1
|
||
ok "DeleteMessage → без ошибок"
|
||
else
|
||
fail "DeleteMessage — нет ReceiptHandle"
|
||
fi
|
||
echo ""
|
||
|
||
# ── 4. UI API — создание очереди ──
|
||
echo "── 4. UI API очереди ──"
|
||
R=$(ui POST "/tenants/$TID/queues" '{"name":"ui-quick-q"}')
|
||
check "UI POST /queues → создана" "$R" "ui-quick-q"
|
||
|
||
R=$(ui GET "/tenants/$TID/queues")
|
||
check "UI GET /queues → ui-quick-q в списке" "$R" "ui-quick-q"
|
||
echo ""
|
||
|
||
# ── 5. UI API — send/peek/purge ──
|
||
echo "── 5. UI API send/peek/purge ──"
|
||
R=$(ui POST "/tenants/$TID/queues/ui-quick-q/messages" '{"body":"msg-a"}')
|
||
check "UI POST /messages → id" "$R" '"id"'
|
||
ui POST "/tenants/$TID/queues/ui-quick-q/messages" '{"body":"msg-b"}' >/dev/null 2>&1
|
||
|
||
R=$(ui GET "/tenants/$TID/queues/ui-quick-q/messages")
|
||
check "UI GET /messages → msg-a" "$R" "msg-a"
|
||
check "UI GET /messages → msg-b" "$R" "msg-b"
|
||
check_not "UI GET /messages → нет receipt_handle" "$R" "receipt_handle"
|
||
|
||
# Purge
|
||
ui DELETE "/tenants/$TID/queues/ui-quick-q/messages" >/dev/null 2>&1
|
||
R=$(ui GET "/tenants/$TID/queues/ui-quick-q/messages")
|
||
check_not "UI DELETE /messages (purge) → msg-a исчезло" "$R" "msg-a"
|
||
echo ""
|
||
|
||
# ── 6. UI API — удаление очереди ──
|
||
echo "── 6. UI API удаление очереди ──"
|
||
HTTP=$(curl -sf --max-time 15 -o /dev/null -w "%{http_code}" -X DELETE \
|
||
"${BASE_URL}/ui/api/tenants/${TID}/queues/ui-quick-q")
|
||
check_http "UI DELETE /queues/ui-quick-q → 204/200" "204" "$HTTP" 2>/dev/null || \
|
||
check_http "UI DELETE /queues/ui-quick-q → 200" "200" "$HTTP"
|
||
|
||
R=$(ui GET "/tenants/$TID/queues")
|
||
check_not "Очередь ui-quick-q исчезла из списка" "$R" "ui-quick-q"
|
||
echo ""
|
||
|
||
# ── 7. AWS CLI DeleteQueue ──
|
||
echo "── 7. DeleteQueue ──"
|
||
AWS_ACCESS_KEY_ID="$AK" AWS_SECRET_ACCESS_KEY="$SK" AWS_DEFAULT_REGION="$REGION" \
|
||
aws --endpoint-url "$BASE_URL" --output json sqs delete-queue --queue-url "$QURL" >/dev/null 2>&1
|
||
if [[ $? -eq 0 ]]; then ok "DeleteQueue → без ошибки"; else fail "DeleteQueue → ошибка"; fi
|
||
echo ""
|
||
|
||
# ── Cleanup ──
|
||
echo "── Cleanup ──"
|
||
admin DELETE "/admin/tenants/$TID" >/dev/null 2>&1 && ok "DELETE тенанта" || fail "DELETE тенанта"
|
||
echo ""
|
||
|
||
echo "════════════════════════════════════════"
|
||
printf " Результат: ✅ %d ❌ %d\n" "$PASS" "$FAIL"
|
||
echo "════════════════════════════════════════"
|
||
|
||
[[ $FAIL -eq 0 ]] && exit 0 || exit 1
|