163 lines
5.3 KiB
Bash
163 lines
5.3 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Newman API Integration Test Runner
|
|
#
|
|
# Usage:
|
|
# ./tests/newman/run.sh [--base-url URL] [--user USER] [--password PASS] [--env ENV]
|
|
#
|
|
# Defaults to localhost with admin/Password1
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
|
|
# Defaults (reads from env vars set in ~/.zshrc if available)
|
|
BASE_URL="${GRAV_BASE_URL:-${BASE_URL:-https://localhost/grav-api}}"
|
|
API_PREFIX="${GRAV_API_PREFIX:-/api/v1}"
|
|
GRAV_ENV="${GRAV_ENVIRONMENT:-${GRAV_ENV:-localhost}}"
|
|
USERNAME="${USERNAME:-admin}"
|
|
PASSWORD="${PASSWORD:-Password1}"
|
|
STATIC_API_KEY="${GRAV_API_KEY:-}"
|
|
CURL_OPTS="-sk"
|
|
|
|
# Parse args
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--base-url) BASE_URL="$2"; shift 2;;
|
|
--user) USERNAME="$2"; shift 2;;
|
|
--password) PASSWORD="$2"; shift 2;;
|
|
--env) GRAV_ENV="$2"; shift 2;;
|
|
*) echo "Unknown option: $1"; exit 1;;
|
|
esac
|
|
done
|
|
|
|
API_BASE="${BASE_URL}${API_PREFIX}"
|
|
|
|
echo "============================================"
|
|
echo " Grav API — Newman Integration Tests"
|
|
echo "============================================"
|
|
echo " Server: ${BASE_URL}"
|
|
echo " Environment: ${GRAV_ENV}"
|
|
echo " User: ${USERNAME}"
|
|
echo ""
|
|
|
|
# Step 1: Authenticate and get JWT token
|
|
echo "→ Authenticating..."
|
|
AUTH_RESPONSE=$(curl ${CURL_OPTS} "${API_BASE}/auth/token" \
|
|
-H "Content-Type: application/json" \
|
|
-H "X-Grav-Environment: ${GRAV_ENV}" \
|
|
-d "{\"username\":\"${USERNAME}\",\"password\":\"${PASSWORD}\"}")
|
|
|
|
ACCESS_TOKEN=$(echo "$AUTH_RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['access_token'])" 2>/dev/null)
|
|
|
|
if [ -z "$ACCESS_TOKEN" ]; then
|
|
echo " ✗ Authentication failed"
|
|
echo " Response: $AUTH_RESPONSE"
|
|
exit 1
|
|
fi
|
|
echo " ✓ Got JWT token"
|
|
|
|
# Step 2: Use static API key from env, or create a temporary one
|
|
CLEANUP_KEY=false
|
|
if [ -n "$STATIC_API_KEY" ]; then
|
|
API_KEY="$STATIC_API_KEY"
|
|
echo "→ Using API key from environment: ${API_KEY:0:20}..."
|
|
else
|
|
echo "→ Creating test API key..."
|
|
KEY_RESPONSE=$(curl ${CURL_OPTS} "${API_BASE}/users/${USERNAME}/api-keys" \
|
|
-H "X-API-Token: ${ACCESS_TOKEN}" \
|
|
-H "X-Grav-Environment: ${GRAV_ENV}" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"name":"Newman Test Key","expires_in_days":1}')
|
|
|
|
API_KEY=$(echo "$KEY_RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['api_key'])" 2>/dev/null)
|
|
KEY_ID=$(echo "$KEY_RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['id'])" 2>/dev/null)
|
|
|
|
if [ -z "$API_KEY" ]; then
|
|
echo " ✗ Failed to create API key"
|
|
echo " Response: $KEY_RESPONSE"
|
|
exit 1
|
|
fi
|
|
echo " ✓ Created API key: ${API_KEY:0:20}..."
|
|
CLEANUP_KEY=true
|
|
fi
|
|
|
|
# Step 3: Generate temporary environment file with real credentials
|
|
TEMP_ENV=$(mktemp)
|
|
cat > "$TEMP_ENV" << EOF
|
|
{
|
|
"id": "grav-api-newman-test",
|
|
"name": "Newman Test (auto-generated)",
|
|
"values": [
|
|
{"key": "base_url", "value": "${BASE_URL}", "enabled": true},
|
|
{"key": "api_prefix", "value": "${API_PREFIX}", "enabled": true},
|
|
{"key": "grav_environment", "value": "${GRAV_ENV}", "enabled": true},
|
|
{"key": "username", "value": "${USERNAME}", "enabled": true},
|
|
{"key": "password", "value": "${PASSWORD}", "enabled": true},
|
|
{"key": "api_key", "value": "${API_KEY}", "enabled": true},
|
|
{"key": "access_token", "value": "", "enabled": true},
|
|
{"key": "refresh_token", "value": "", "enabled": true},
|
|
{"key": "test_username", "value": "testuser", "enabled": true},
|
|
{"key": "test_api_key_id", "value": "", "enabled": true},
|
|
{"key": "page_route", "value": "blog", "enabled": true},
|
|
{"key": "lang", "value": "en", "enabled": true},
|
|
{"key": "package_slug", "value": "", "enabled": true},
|
|
{"key": "webhook_id", "value": "", "enabled": true},
|
|
{"key": "notification_id", "value": "", "enabled": true}
|
|
]
|
|
}
|
|
EOF
|
|
|
|
# Step 4: Run Newman
|
|
echo ""
|
|
echo "→ Running Newman tests..."
|
|
echo ""
|
|
|
|
NEWMAN_BIN="${PROJECT_DIR}/node_modules/.bin/newman"
|
|
|
|
${NEWMAN_BIN} run "${PROJECT_DIR}/grav-api.postman_collection.json" \
|
|
--environment "$TEMP_ENV" \
|
|
--env-var "api_key=${API_KEY}" \
|
|
--env-var "base_url=${BASE_URL}" \
|
|
--env-var "api_prefix=${API_PREFIX}" \
|
|
--env-var "grav_environment=${GRAV_ENV}" \
|
|
--env-var "username=${USERNAME}" \
|
|
--env-var "password=${PASSWORD}" \
|
|
--env-var "test_username=${GRAV_TEST_USERNAME:-test_username}" \
|
|
--env-var "page_route=${GRAV_PAGE_ROUTE:-typography}" \
|
|
--env-var "lang=${GRAV_LANG:-en}" \
|
|
--env-var "package_slug=${GRAV_PACKAGE_SLUG:-form}" \
|
|
--insecure \
|
|
--reporters cli \
|
|
--color on \
|
|
--timeout-request 10000 \
|
|
"$@"
|
|
|
|
NEWMAN_EXIT=$?
|
|
|
|
# Step 5: Cleanup — revoke the test API key (only if we created one)
|
|
if [ "$CLEANUP_KEY" = true ] && [ -n "$KEY_ID" ]; then
|
|
echo ""
|
|
echo "→ Cleaning up test API key..."
|
|
curl ${CURL_OPTS} -X DELETE "${API_BASE}/users/${USERNAME}/api-keys/${KEY_ID}" \
|
|
-H "X-API-Token: ${ACCESS_TOKEN}" \
|
|
-H "X-Grav-Environment: ${GRAV_ENV}" \
|
|
-o /dev/null -w " ✓ Revoked test key (HTTP %{http_code})\n"
|
|
fi
|
|
|
|
rm -f "$TEMP_ENV"
|
|
|
|
echo ""
|
|
if [ $NEWMAN_EXIT -eq 0 ]; then
|
|
echo "============================================"
|
|
echo " ✓ All tests passed!"
|
|
echo "============================================"
|
|
else
|
|
echo "============================================"
|
|
echo " ✗ Some tests failed (exit code: $NEWMAN_EXIT)"
|
|
echo "============================================"
|
|
fi
|
|
|
|
exit $NEWMAN_EXIT
|