feat(PROJ-17): Admin Dashboard Systemauslastung immer anzeigen
- Systemauslastungs-Sektion wird immer gerendert (nicht nur bei Erfolg) - Fehlermeldung wenn /api/admin/system/stats nicht erreichbar ist - Feature-Status auf In Review gesetzt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+144
@@ -0,0 +1,144 @@
|
||||
#!/usr/bin/env bash
|
||||
# test/smoke_test.sh — manual end-to-end smoke test
|
||||
# Run AFTER the daemon is started:
|
||||
# ./bin/mailarchived --config config/config.test.yml
|
||||
#
|
||||
# Requirements: curl, jq, swaks (apt install swaks)
|
||||
set -e
|
||||
|
||||
BASE="http://localhost:8080"
|
||||
PASS=0
|
||||
FAIL=0
|
||||
|
||||
ok() { echo " ✅ $1"; ((PASS++)); }
|
||||
fail() { echo " ❌ $1"; ((FAIL++)); }
|
||||
sep() { echo ""; echo "--- $1 ---"; }
|
||||
|
||||
# ---- helper ----
|
||||
get() { curl -sf -H "Authorization: Bearer $TOKEN" "$BASE$1"; }
|
||||
post() { curl -sf -X POST -H "Content-Type: application/json" -d "$2" "$BASE$1"; }
|
||||
postauth() { curl -sf -X POST -H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $TOKEN" -d "$2" "$BASE$1"; }
|
||||
|
||||
sep "Health"
|
||||
if get /api/health | grep -q '"ok"'; then
|
||||
ok "GET /api/health"
|
||||
else
|
||||
fail "GET /api/health"
|
||||
fi
|
||||
|
||||
sep "Auth: Login"
|
||||
RESP=$(post /api/auth/login '{"username":"admin","password":"adminpass"}')
|
||||
TOKEN=$(echo "$RESP" | jq -r '.token')
|
||||
if [ "$TOKEN" != "null" ] && [ -n "$TOKEN" ]; then
|
||||
ok "POST /api/auth/login → token received"
|
||||
else
|
||||
fail "POST /api/auth/login"
|
||||
echo "Response: $RESP"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sep "Auth: Me"
|
||||
ME=$(get /api/auth/me)
|
||||
if echo "$ME" | grep -q '"admin"'; then
|
||||
ok "GET /api/auth/me"
|
||||
else
|
||||
fail "GET /api/auth/me: $ME"
|
||||
fi
|
||||
|
||||
sep "Auth: Reject wrong password"
|
||||
CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"admin","password":"wrongpass"}' \
|
||||
"$BASE/api/auth/login")
|
||||
if [ "$CODE" = "401" ]; then
|
||||
ok "Wrong password → 401"
|
||||
else
|
||||
fail "Wrong password → expected 401, got $CODE"
|
||||
fi
|
||||
|
||||
sep "User management"
|
||||
# Create user
|
||||
NEW=$(postauth /api/users '{"username":"testuser","email":"test@x.com","password":"testpw","role":"user"}')
|
||||
UID=$(echo "$NEW" | jq -r '.id')
|
||||
if [ "$UID" != "null" ] && [ -n "$UID" ]; then
|
||||
ok "POST /api/users → created id=$UID"
|
||||
else
|
||||
fail "POST /api/users: $NEW"
|
||||
fi
|
||||
|
||||
# List users
|
||||
USERS=$(get /api/users)
|
||||
COUNT=$(echo "$USERS" | jq '. | length')
|
||||
if [ "$COUNT" -ge 2 ]; then
|
||||
ok "GET /api/users → $COUNT users"
|
||||
else
|
||||
fail "GET /api/users → expected ≥2, got $COUNT"
|
||||
fi
|
||||
|
||||
sep "SMTP: Send test mail"
|
||||
if command -v swaks &>/dev/null; then
|
||||
swaks --to archive@localhost --from sender@localhost \
|
||||
--server localhost:2525 \
|
||||
--header "Subject: Smoke Test Invoice" \
|
||||
--body "This is a smoke test mail." \
|
||||
--silent 2 && ok "swaks SMTP send" || fail "swaks SMTP send"
|
||||
sleep 1 # give indexer time
|
||||
else
|
||||
echo " ⚠️ swaks not installed, skipping SMTP test (apt install swaks)"
|
||||
fi
|
||||
|
||||
sep "Search"
|
||||
RESULT=$(get "/api/search?q=smoke")
|
||||
TOTAL=$(echo "$RESULT" | jq -r '.total // 0')
|
||||
if [ "$TOTAL" -ge 0 ]; then
|
||||
ok "GET /api/search → total=$TOTAL"
|
||||
else
|
||||
fail "GET /api/search: $RESULT"
|
||||
fi
|
||||
|
||||
sep "EML Import"
|
||||
mkdir -p /tmp/test-eml
|
||||
cat > /tmp/test-eml/test.eml << 'EML'
|
||||
From: import@example.com
|
||||
To: archive@example.com
|
||||
Subject: Import Test Mail
|
||||
Date: Thu, 12 Mar 2026 10:00:00 +0000
|
||||
|
||||
This mail was imported via CLI.
|
||||
EML
|
||||
./bin/archivmail-import --config config/config.test.yml /tmp/test-eml/ && \
|
||||
ok "mailarchive-import" || fail "mailarchive-import"
|
||||
|
||||
sep "Export"
|
||||
./bin/archivmail-export --config config/config.test.yml --format eml --out /tmp/test-export/ && \
|
||||
ok "archivmail-export (EML)" || fail "archivmail-export (EML)"
|
||||
|
||||
sep "Audit Log"
|
||||
AUDIT=$(get "/api/audit")
|
||||
ATOTAL=$(echo "$AUDIT" | jq -r '.total // 0')
|
||||
if [ "$ATOTAL" -gt 0 ]; then
|
||||
ok "GET /api/audit → $ATOTAL entries"
|
||||
else
|
||||
fail "GET /api/audit → expected entries, got $ATOTAL"
|
||||
fi
|
||||
|
||||
sep "Logout"
|
||||
postauth /api/auth/logout '' > /dev/null && ok "POST /api/auth/logout"
|
||||
|
||||
# Token should now be rejected
|
||||
CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-H "Authorization: Bearer $TOKEN" "$BASE/api/auth/me")
|
||||
if [ "$CODE" = "401" ]; then
|
||||
ok "Token invalid after logout → 401"
|
||||
else
|
||||
fail "Token should be invalid after logout, got $CODE"
|
||||
fi
|
||||
|
||||
# ---- Summary ----
|
||||
echo ""
|
||||
echo "========================================"
|
||||
echo " Smoke test complete"
|
||||
echo " Passed: $PASS Failed: $FAIL"
|
||||
echo "========================================"
|
||||
[ "$FAIL" -eq 0 ]
|
||||
Reference in New Issue
Block a user