#!/usr/bin/env bash # BÜTÇEM duman testi (smoke test) — canlıya alma sonrası, yalnızca OKUMA yapar; veri değiştirmez. # # Kullanım: # scripts/smoke-test.sh https://butcem.ta1sph.website [beklenen-sürüm] # SMOKE_USER=admin SMOKE_PASSWORD='…' scripts/smoke-test.sh https://butcem.ta1sph.website 1.0.0 # # Gerekenler: bash, curl. Çıkış kodu: 0 = hepsi geçti, 1 = en az bir kontrol başarısız. set -uo pipefail BASE="${1:?Kullanım: scripts/smoke-test.sh [beklenen-sürüm]}" BASE="${BASE%/}" EXPECT_VERSION="${2:-}" FAIL=0 TMP="$(mktemp -d)" trap 'rm -rf "$TMP"' EXIT ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; } bad() { printf ' \033[31m✗\033[0m %s\n' "$1"; FAIL=1; } check() { if eval "$2"; then ok "$1"; else bad "$1"; fi; } echo "BÜTÇEM duman testi: $BASE" echo "1) Sağlık kontrolü" HEALTH_CODE=$(curl -s -o "$TMP/health" -w '%{http_code}' "$BASE/api/health") HEALTH=$(cat "$TMP/health") echo " $HEALTH" check "GET /api/health 200" '[ "$HEALTH_CODE" = 200 ]' check "veritabanı erişilebilir" 'grep -q "\"db\":\"ok\"" <<<"$HEALTH"' check "MongoDB replica set (transaction için)" '! grep -q "\"replicaSet\":null" <<<"$HEALTH" && grep -q "\"replicaSet\":\"" <<<"$HEALTH"' if [ -n "$EXPECT_VERSION" ]; then check "sürüm $EXPECT_VERSION" 'grep -q "\"version\":\"$EXPECT_VERSION\"" <<<"$HEALTH"' fi echo "2) Sayfalar ve güvenlik başlıkları" LOGIN_CODE=$(curl -s -D "$TMP/login-headers" -o /dev/null -w '%{http_code}' "$BASE/login") H=$(tr -d '\r' <"$TMP/login-headers" | tr 'A-Z' 'a-z') check "GET /login 200" '[ "$LOGIN_CODE" = 200 ]' check "Content-Security-Policy var" 'grep -q "^content-security-policy:" <<<"$H"' check "X-Frame-Options: DENY" 'grep -q "^x-frame-options: deny" <<<"$H"' check "X-Content-Type-Options: nosniff" 'grep -q "^x-content-type-options: nosniff" <<<"$H"' if [[ "$BASE" == https://* ]]; then check "Strict-Transport-Security var" 'grep -q "^strict-transport-security:" <<<"$H"' HTTP_URL="http://${BASE#https://}/login" HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' "$HTTP_URL") check "HTTP → HTTPS yönlendirmesi ($HTTP_CODE)" '[[ "$HTTP_CODE" =~ ^30[1278]$ ]]' fi echo "3) Oturumsuz erişim engelleniyor" DASH=$(curl -s -o /dev/null -w '%{http_code} %{redirect_url}' "$BASE/dashboard") check "/dashboard → giriş sayfasına yönlendirme ($DASH)" '[[ "$DASH" =~ ^30[27]\ .*/login ]]' FILE_CODE=$(curl -s -o /dev/null -w '%{http_code}' "$BASE/api/files/000000000000000000000000") check "/api/files oturumsuz 401 ($FILE_CODE)" '[ "$FILE_CODE" = 401 ]' CSV=$(curl -s -o "$TMP/csv" -w '%{http_code}' "$BASE/raporlar/kategoriler/csv") check "rapor CSV'si oturumsuz veri vermiyor ($CSV)" '! grep -q "Toplam gidere oran" "$TMP/csv"' if [ -n "${SMOKE_USER:-}" ] && [ -n "${SMOKE_PASSWORD:-}" ]; then echo "4) Giriş ($SMOKE_USER)" SIGN=$(curl -s -c "$TMP/jar" -o "$TMP/signin" -w '%{http_code}' -X POST "$BASE/api/auth/sign-in/username" \ -H 'Content-Type: application/json' -H "Origin: $BASE" \ --data "$(printf '{"username":"%s","password":"%s"}' "$SMOKE_USER" "$SMOKE_PASSWORD")") check "giriş 200 ($SIGN)" '[ "$SIGN" = 200 ]' PAGE=$(curl -s -b "$TMP/jar" -L -o /dev/null -w '%{http_code} %{url_effective}' "$BASE/dashboard") check "oturumla ana sayfa açılıyor ($PAGE)" '[[ "$PAGE" =~ ^200\ ]] && [[ ! "$PAGE" =~ /login ]]' curl -s -b "$TMP/jar" -X POST "$BASE/api/auth/sign-out" -H "Origin: $BASE" -o /dev/null else echo "4) Giriş testi atlandı (SMOKE_USER ve SMOKE_PASSWORD tanımlı değil)" fi echo if [ "$FAIL" = 0 ]; then echo "Sonuç: tüm kontroller geçti."; else echo "Sonuç: başarısız kontrol var."; fi exit "$FAIL"