v0.1
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
#!/usr/bin/env bash
|
||||
# ============================================================
|
||||
# Copyparty Content Tag — API Sanity Tests
|
||||
# Run against localhost:8086 (user:12345)
|
||||
# Usage: bash tests/api-tests.sh
|
||||
# ============================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
BASE="http://localhost:8086"
|
||||
PW="12345"
|
||||
PASS=0
|
||||
FAIL=0
|
||||
|
||||
pass() { PASS=$((PASS+1)); echo " PASS $1"; }
|
||||
fail() { FAIL=$((FAIL+1)); echo " FAIL $1"; }
|
||||
|
||||
cleanup() {
|
||||
# Remove test artifacts if they exist
|
||||
curl -sf -X POST "${BASE}/private/user/tests_api_tmp?delete&j" \
|
||||
-H "PW: ${PW}" >/dev/null 2>&1 || true
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
echo ""
|
||||
echo "=== Copyparty API Sanity Tests ==="
|
||||
echo ""
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 1. Authentication
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Auth ---"
|
||||
|
||||
# Anonymous listing should succeed (read-only)
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "${BASE}/?ls")
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
pass "Anonymous GET /?ls → 200"
|
||||
else
|
||||
fail "Anonymous GET /?ls → $HTTP_CODE (expected 200)"
|
||||
fi
|
||||
|
||||
# Authenticated listing with PW header
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "${BASE}/?ls" -H "PW: ${PW}")
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
pass "Authenticated GET /?ls + PW header → 200"
|
||||
else
|
||||
fail "Authenticated GET /?ls + PW header → $HTTP_CODE (expected 200)"
|
||||
fi
|
||||
|
||||
# Wrong password → 403 on write endpoints
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "${BASE}/private/user/?ls" -H "PW: wrongpassword")
|
||||
if [ "$HTTP_CODE" = "403" ]; then
|
||||
pass "Wrong PW → 403"
|
||||
else
|
||||
fail "Wrong PW → $HTTP_CODE (expected 403)"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 2. Directory listing
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Directory ---"
|
||||
|
||||
RESP=$(curl -sf "${BASE}/private/user/?ls" -H "PW: ${PW}")
|
||||
if echo "$RESP" | jq -e '.dirs' >/dev/null 2>&1 || echo "$RESP" | jq -e '.files' >/dev/null 2>&1; then
|
||||
pass "Directory listing returns JSON with dirs/files"
|
||||
else
|
||||
fail "Directory listing missing dirs or files keys"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 3. Create directory
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Mkdir ---"
|
||||
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X POST "${BASE}/private/user/?replace" \
|
||||
-H "PW: ${PW}" \
|
||||
-d "act=mkdir&name=tests_api_tmp")
|
||||
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then
|
||||
pass "Mkdir → $HTTP_CODE"
|
||||
else
|
||||
fail "Mkdir → $HTTP_CODE (expected 200/302)"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 4. Write file (PUT + Replace header)
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Write ---"
|
||||
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X PUT "${BASE}/private/user/tests_api_tmp/testfile.txt?j" \
|
||||
-H "PW: ${PW}" \
|
||||
-H "Replace: 1" \
|
||||
--data-raw "hello world")
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
pass "PUT write (Replace:1) → 200"
|
||||
else
|
||||
fail "PUT write (Replace:1) → $HTTP_CODE (expected 200)"
|
||||
fi
|
||||
|
||||
# Read back the file
|
||||
CONTENT=$(curl -sf "${BASE}/private/user/tests_api_tmp/testfile.txt?txt" -H "PW: ${PW}")
|
||||
if [ "$CONTENT" = "hello world" ]; then
|
||||
pass "Read text returns correct content"
|
||||
else
|
||||
fail "Read text returned: $CONTENT (expected 'hello world')"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 5. Append to file
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Append ---"
|
||||
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X PUT "${BASE}/private/user/tests_api_tmp/testfile.txt?apnd&j" \
|
||||
-H "PW: ${PW}" \
|
||||
--data-raw " appended")
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
pass "Append → 200"
|
||||
else
|
||||
fail "Append → $HTTP_CODE (expected 200)"
|
||||
fi
|
||||
|
||||
CONTENT=$(curl -sf "${BASE}/private/user/tests_api_tmp/testfile.txt?txt" -H "PW: ${PW}")
|
||||
if [ "$CONTENT" = "hello world appended" ]; then
|
||||
pass "Appended content correct"
|
||||
else
|
||||
fail "Appended content: '$CONTENT' (expected 'hello world appended')"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 6. Move file
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Move ---"
|
||||
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X POST "${BASE}/private/user/tests_api_tmp/testfile.txt?move=/private/user/tests_api_tmp/moved_file.txt" \
|
||||
-H "PW: ${PW}")
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
pass "Move → 200"
|
||||
else
|
||||
fail "Move → $HTTP_CODE (expected 200)"
|
||||
fi
|
||||
|
||||
# Verify source gone, dest exists
|
||||
MOVED=$(curl -sf "${BASE}/private/user/tests_api_tmp/moved_file.txt?txt" -H "PW: ${PW}" 2>/dev/null || echo "")
|
||||
if [ "$MOVED" = "hello world appended" ]; then
|
||||
pass "Moved file has correct content"
|
||||
else
|
||||
fail "Moved file content: $MOVED"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 7. Copy file
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Copy ---"
|
||||
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X POST "${BASE}/private/user/tests_api_tmp/moved_file.txt?copy=/private/user/tests_api_tmp/copied_file.txt" \
|
||||
-H "PW: ${PW}")
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
pass "Copy → 200"
|
||||
else
|
||||
fail "Copy → $HTTP_CODE (expected 200)"
|
||||
fi
|
||||
|
||||
COPIED=$(curl -sf "${BASE}/private/user/tests_api_tmp/copied_file.txt?txt" -H "PW: ${PW}" 2>/dev/null || echo "")
|
||||
if [ "$COPIED" = "hello world appended" ]; then
|
||||
pass "Copied file has correct content"
|
||||
else
|
||||
fail "Copied file content: $COPIED"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# 8. Delete file
|
||||
# ------------------------------------------------------------------
|
||||
echo "--- Delete ---"
|
||||
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X POST "${BASE}/private/user/tests_api_tmp/copied_file.txt?delete&j" \
|
||||
-H "PW: ${PW}")
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
pass "Delete → 200"
|
||||
else
|
||||
fail "Delete → $HTTP_CODE (expected 200)"
|
||||
fi
|
||||
|
||||
# Verify file gone
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
"${BASE}/private/user/tests_api_tmp/copied_file.txt?txt" -H "PW: ${PW}")
|
||||
if [ "$HTTP_CODE" = "404" ]; then
|
||||
pass "Deleted file returns 404"
|
||||
else
|
||||
fail "Deleted file still accessible (HTTP $HTTP_CODE)"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Cleanup: delete test directory
|
||||
# ------------------------------------------------------------------
|
||||
curl -sf -X POST "${BASE}/private/user/tests_api_tmp?delete&j" \
|
||||
-H "PW: ${PW}" >/dev/null 2>&1 || true
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Summary
|
||||
# ------------------------------------------------------------------
|
||||
echo ""
|
||||
echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
|
||||
[ "$FAIL" -eq 0 ] && exit 0 || exit 1
|
||||
Reference in New Issue
Block a user