Resolve the operational/config sprawl (#10-#14 from the review): the app read NORMOGEN_*/MONGODB_* env vars but every env/compose file set SERVER_*/DATABASE_*, the ports were all over the place (8080/8000/6500/6800), there were 5 inconsistent Dockerfiles (rust:1.82 vs rust:1.93, missing curl), and an 18 MB binary was committed. Env-var names — standardize on what the code reads: * config/mod.rs: NORMOGEN_PORT default 8080 -> 6500 (avoid the over-common 8000/8080). * db/mod.rs: create_database() now reads MONGODB_DATABASE (was DATABASE_NAME). * .env.example, defaults.env, docker-compose.yml, docker-compose.dev.yml, DEPLOYMENT_GUIDE.md, deployment/README.md, deploy-and-test-solaria.sh, deploy-local-build.sh: use NORMOGEN_HOST/NORMOGEN_PORT/MONGODB_URI/ MONGODB_DATABASE/APP_ENVIRONMENT; drop the dead SERVER_*/DATABASE_URI/ DATABASE_NAME names. Ports — canonical container port 6500 everywhere: * Both Dockerfiles EXPOSE 6500; prod compose maps 6500:6500, dev 6501:6500. * Bulk-replaced the long tail of solaria:8000/localhost:8000/localhost:8080 in docs and test scripts -> 6500. Dockerfiles — 2 canonical, rust:latest, curl + healthcheck: * backend/Dockerfile (prod): rust:latest builder, debian runtime now installs curl (so the compose HEALTHCHECK actually works), EXPOSE 6500. * backend/docker/Dockerfile.dev (dev): rust:latest both stages, EXPOSE 6500. * Deleted 3 redundant Dockerfiles (Dockerfile.improved x2, docker/Dockerfile). * Deleted the committed 18 MB binary backend/docker/normogen-backend. * Deleted 2 stray fix-notes in backend/docker/. Compose: * docker-compose.yml: correct env names, 6500:6500, APP_ENVIRONMENT=production, JWT_SECRET/ENCRYPTION_KEY required via compose interpolation, dropped the obsolete top-level version: key. * docker-compose.dev.yml: correct env names, 6501:6500, mongo:7 (was 6.0), added a working backend healthcheck. * Deleted docker/docker-compose.improved.yml + backend/deploy-to-solaria-improved.sh (built around the now-deleted 'improved' Docker files). Verified: cargo fmt --check clean, build + clippy --all-targets clean, 18 unit tests pass; grep confirms no SERVER_*/DATABASE_* env names and no rust:1.x tags remain outside docs/archive and docs/adr (historical).
137 lines
4.9 KiB
Bash
Executable file
137 lines
4.9 KiB
Bash
Executable file
#!/bin/bash
|
|
set -e
|
|
|
|
BASE_URL="http://solaria:6500/api"
|
|
EMAIL="test@normogen.com"
|
|
PASSWORD="TestPassword123!"
|
|
NEW_PASSWORD="NewPassword456!"
|
|
|
|
echo "========================================="
|
|
echo "Testing Normogen API Endpoints"
|
|
echo "========================================="
|
|
echo "Base URL: $BASE_URL"
|
|
echo ""
|
|
|
|
# Colors for output
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
test_endpoint() {
|
|
local name=$1
|
|
local method=$2
|
|
local endpoint=$3
|
|
local data=$4
|
|
local token=$5
|
|
|
|
echo -e "${YELLOW}Testing: $name${NC}"
|
|
echo "Request: $method $endpoint"
|
|
|
|
if [ -z "$token" ]; then
|
|
if [ -z "$data" ]; then
|
|
response=$(curl -s -X $method "$BASE_URL$endpoint" -H "Content-Type: application/json")
|
|
else
|
|
response=$(curl -s -X $method "$BASE_URL$endpoint" -H "Content-Type: application/json" -d "$data")
|
|
fi
|
|
else
|
|
if [ -z "$data" ]; then
|
|
response=$(curl -s -X $method "$BASE_URL$endpoint" -H "Content-Type: application/json" -H "Authorization: Bearer $token")
|
|
else
|
|
response=$(curl -s -X $method "$BASE_URL$endpoint" -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d "$data")
|
|
fi
|
|
fi
|
|
|
|
echo "Response: $response"
|
|
echo ""
|
|
}
|
|
|
|
echo "========================================="
|
|
echo "Phase 1: Health Check (No Auth Required)"
|
|
echo "========================================="
|
|
test_endpoint "Health Check" "GET" "/../health" "" ""
|
|
|
|
echo "========================================="
|
|
echo "Phase 2: Authentication"
|
|
echo "========================================="
|
|
|
|
# Register a new user
|
|
REGISTER_DATA='{"email": "'"$EMAIL"'", "password": "'"$PASSWORD"'", "full_name": "Test User"}'
|
|
test_endpoint "Register User" "POST" "/auth/register" "$REGISTER_DATA" ""
|
|
|
|
# Login
|
|
LOGIN_DATA='{"email": "'"$EMAIL"'", "password": "'"$PASSWORD"'"}'
|
|
echo -e "${YELLOW}Testing: Login${NC}"
|
|
echo "Request: POST /auth/login"
|
|
LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/auth/login" -H "Content-Type: application/json" -d "$LOGIN_DATA")
|
|
echo "Response: $LOGIN_RESPONSE"
|
|
|
|
# Extract token
|
|
ACCESS_TOKEN=$(echo $LOGIN_RESPONSE | jq -r '.access_token // empty')
|
|
REFRESH_TOKEN=$(echo $LOGIN_RESPONSE | jq -r '.refresh_token // empty')
|
|
|
|
if [ -z "$ACCESS_TOKEN" ]; then
|
|
echo -e "${RED}Failed to get access token${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}Access Token: ${ACCESS_TOKEN:0:50}...${NC}"
|
|
echo ""
|
|
|
|
echo "========================================="
|
|
echo "Phase 3: User Management"
|
|
echo "========================================="
|
|
test_endpoint "Get Profile" "GET" "/users/me" "" "$ACCESS_TOKEN"
|
|
|
|
UPDATE_PROFILE_DATA='{"full_name": "Updated Test User"}'
|
|
test_endpoint "Update Profile" "PUT" "/users/me" "$UPDATE_PROFILE_DATA" "$ACCESS_TOKEN"
|
|
|
|
test_endpoint "Get Settings" "GET" "/users/me/settings" "" "$ACCESS_TOKEN"
|
|
|
|
UPDATE_SETTINGS_DATA='{"theme": "dark"}'
|
|
test_endpoint "Update Settings" "PUT" "/users/me/settings" "$UPDATE_SETTINGS_DATA" "$ACCESS_TOKEN"
|
|
|
|
echo "========================================="
|
|
echo "Phase 4: Password Recovery"
|
|
echo "========================================="
|
|
|
|
# Setup recovery phrase first
|
|
SET_RECOVERY_DATA='{"email": "'"$EMAIL"'", "recovery_phrase": "my-secret-recovery-phrase"}'
|
|
test_endpoint "Set Recovery Phrase" "POST" "/auth/set-recovery-phrase" "$SET_RECOVERY_DATA" ""
|
|
|
|
# Test password recovery
|
|
RECOVER_DATA='{"email": "'"$EMAIL"'", "recovery_phrase": "my-secret-recovery-phrase", "new_password": "'"$NEW_PASSWORD"'"}'
|
|
test_endpoint "Recover Password" "POST" "/auth/recover-password" "$RECOVER_DATA" ""
|
|
|
|
# Login with new password
|
|
NEW_LOGIN_DATA='{"email": "'"$EMAIL"'", "password": "'"$NEW_PASSWORD"'"}'
|
|
test_endpoint "Login with New Password" "POST" "/auth/login" "$NEW_LOGIN_DATA" ""
|
|
|
|
# Change password back
|
|
CHANGE_PASSWORD_DATA='{"old_password": "'"$NEW_PASSWORD"'", "new_password": "'"$PASSWORD"'"}'
|
|
test_endpoint "Change Password" "POST" "/users/me/change-password" "$CHANGE_PASSWORD_DATA" "$ACCESS_TOKEN"
|
|
|
|
echo "========================================="
|
|
echo "Phase 5: Share Management"
|
|
echo "========================================="
|
|
|
|
CREATE_SHARE_DATA='{"target_email": "another@user.com", "resource_type": "profiles", "permissions": ["read"]}'
|
|
test_endpoint "Create Share" "POST" "/shares" "$CREATE_SHARE_DATA" "$ACCESS_TOKEN"
|
|
|
|
test_endpoint "List Shares" "GET" "/shares" "" "$ACCESS_TOKEN"
|
|
|
|
echo "========================================="
|
|
echo "Phase 6: Permissions"
|
|
echo "========================================="
|
|
|
|
CHECK_PERMISSION_DATA='{"resource_id": "507f1f77bcf86cd799439011", "permission": "read"}'
|
|
test_endpoint "Check Permission" "POST" "/permissions/check" "$CHECK_PERMISSION_DATA" "$ACCESS_TOKEN"
|
|
|
|
echo "========================================="
|
|
echo "Phase 7: Session Management (NEW)"
|
|
echo "========================================="
|
|
test_endpoint "Get Sessions" "GET" "/sessions" "" "$ACCESS_TOKEN"
|
|
|
|
echo "========================================="
|
|
echo "All Tests Complete!"
|
|
echo "========================================="
|