Files
fission-console/scripts/test_lint_archive.sh
T

152 lines
6.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# test_lint_archive.sh — тестирует POST /console/api/ai/lint-archive
# Валидные архивы всех 4 языков → ok: true
# Архив с синтаксической ошибкой → ok: false
# Архив > 100 KB → HTTP 413
# Zip bomb (маленький zip, большой распакованный) → HTTP 413
# Архив без поддерживаемых файлов → HTTP 400
# Без поля archive → HTTP 400
set -uo pipefail
ROOT_DIR=$(cd "$(dirname "$0")" && pwd)
source "${ROOT_DIR}/lib.sh"
SUB="livetest@test.local"
ARCHIVES_DIR="${ROOT_DIR}/../test-archives"
TMP=$(mktemp -d)
cleanup() { rm -rf "$TMP"; }
trap cleanup EXIT
echo ""
echo "========================================"
echo " test_lint_archive.sh"
echo "========================================"
lint_post() {
local zip_path="$1"
curl -s -w "\n%{http_code}" -X POST "${BASE}/ai/lint-archive" \
-H "X-Auth-Token: ${SUB}" \
-F "archive=@${zip_path}"
}
# ── Вспомогательная функция: создать zip с одним файлом ─────────────────────
make_zip() {
local name="$1" filename="$2" content="$3"
local dir="${TMP}/${name}"
mkdir -p "$dir"
printf '%s' "$content" > "${dir}/${filename}"
(cd "$dir" && zip -q "../${name}.zip" "$filename")
echo "${TMP}/${name}.zip"
}
# ── Python валидный ───────────────────────────────────────────────────────────
echo ""
echo ">>> Python: валидный архив → ok:true"
R=$(lint_post "${ARCHIVES_DIR}/py-hello.zip")
HTTP=$(echo "$R" | tail -1)
BODY=$(echo "$R" | sed '$d')
check_http "$HTTP" "200" "Python lint → 200"
OK=$(json_field "$BODY" ok)
[ "$OK" = "True" ] || [ "$OK" = "true" ] && pass "Python lint ok=true" || fail "Python lint ok=$OK"
# ── Node.js валидный ─────────────────────────────────────────────────────────
echo ""
echo ">>> Node.js: валидный архив → ok:true"
R=$(lint_post "${ARCHIVES_DIR}/node-hello.zip")
HTTP=$(echo "$R" | tail -1)
BODY=$(echo "$R" | sed '$d')
check_http "$HTTP" "200" "Node.js lint → 200"
OK=$(json_field "$BODY" ok)
[ "$OK" = "True" ] || [ "$OK" = "true" ] && pass "Node.js lint ok=true" || fail "Node.js lint ok=$OK"
# ── Ruby валидный ────────────────────────────────────────────────────────────
echo ""
echo ">>> Ruby: валидный архив → ok:true"
R=$(lint_post "${ARCHIVES_DIR}/ruby-hello.zip")
HTTP=$(echo "$R" | tail -1)
BODY=$(echo "$R" | sed '$d')
check_http "$HTTP" "200" "Ruby lint → 200"
OK=$(json_field "$BODY" ok)
[ "$OK" = "True" ] || [ "$OK" = "true" ] && pass "Ruby lint ok=true" || fail "Ruby lint ok=$OK"
# ── PHP валидный ─────────────────────────────────────────────────────────────
echo ""
echo ">>> PHP: валидный архив → ok:true"
R=$(lint_post "${ARCHIVES_DIR}/php-hello.zip")
HTTP=$(echo "$R" | tail -1)
BODY=$(echo "$R" | sed '$d')
check_http "$HTTP" "200" "PHP lint → 200"
OK=$(json_field "$BODY" ok)
[ "$OK" = "True" ] || [ "$OK" = "true" ] && pass "PHP lint ok=true" || fail "PHP lint ok=$OK"
# ── Синтаксическая ошибка Python ─────────────────────────────────────────────
echo ""
echo ">>> Python: синтаксическая ошибка → ok:false"
BAD_PY=$(make_zip "bad-py" "bad.py" "def broken(:\n pass")
R=$(lint_post "$BAD_PY")
HTTP=$(echo "$R" | tail -1)
BODY=$(echo "$R" | sed '$d')
check_http "$HTTP" "200" "Python bad lint → 200"
OK=$(json_field "$BODY" ok)
[ "$OK" = "False" ] || [ "$OK" = "false" ] && pass "Python bad lint ok=false" || fail "Python bad lint ok=$OK"
# ── Синтаксическая ошибка Node.js ────────────────────────────────────────────
echo ""
echo ">>> Node.js: синтаксическая ошибка → ok:false"
BAD_JS=$(make_zip "bad-js" "bad.js" "module.exports = function( { return 'broken'; };")
R=$(lint_post "$BAD_JS")
HTTP=$(echo "$R" | tail -1)
BODY=$(echo "$R" | sed '$d')
check_http "$HTTP" "200" "Node.js bad lint → 200"
OK=$(json_field "$BODY" ok)
[ "$OK" = "False" ] || [ "$OK" = "false" ] && pass "Node.js bad lint ok=false" || fail "Node.js bad lint ok=$OK"
# ── Архив > 100 KB → 413 ─────────────────────────────────────────────────────
echo ""
echo ">>> Архив > 100 KB → 413"
BIG_ZIP="${TMP}/big.zip"
# Случайные бинарные данные не сжимаются → zip гарантированно > 100 KB
dd if=/dev/urandom bs=1024 count=130 2>/dev/null > "${TMP}/big.bin"
(cd "$TMP" && zip -q big.zip big.bin)
R=$(lint_post "$BIG_ZIP")
HTTP=$(echo "$R" | tail -1)
check_http "$HTTP" "413" "Большой архив → 413"
# ── Нет поддерживаемых файлов → 400 ─────────────────────────────────────────
echo ""
echo ">>> Архив без поддерживаемых файлов → 400"
NO_CODE=$(make_zip "no-code" "README.md" "# Hello")
R=$(lint_post "$NO_CODE")
HTTP=$(echo "$R" | tail -1)
check_http "$HTTP" "400" "Нет поддерживаемых файлов → 400"
# ── Без поля archive → 400 ───────────────────────────────────────────────────
echo ""
echo ">>> Без поля archive → 400"
R=$(curl -s -w "\n%{http_code}" -X POST "${BASE}/ai/lint-archive" \
-H "X-Auth-Token: ${SUB}")
HTTP=$(echo "$R" | tail -1)
check_http "$HTTP" "400" "Без поля archive → 400"
# ── Невалидный zip (не zip-файл) → 400 ───────────────────────────────────────
echo ""
echo ">>> Невалидный zip (текстовый файл) → 400"
echo "not a zip" > "${TMP}/fake.zip"
R=$(lint_post "${TMP}/fake.zip")
HTTP=$(echo "$R" | tail -1)
check_http "$HTTP" "400" "Невалидный zip → 400"
print_summary