Files
intotheeast-com-content/plugins/api/tests/newman/run.sh
T

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