#!/bin/bash # E2E Test: Full Authentication Flow # Tests: Login → JWT → MFA → RBAC → Authenticated Request set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Configuration TRADING_SERVICE_HOST="${TRADING_SERVICE_HOST:-localhost}" TRADING_SERVICE_PORT="${TRADING_SERVICE_PORT:-50051}" DATABASE_URL="${DATABASE_URL:-postgresql://postgres:postgres@localhost:5433/foxhunt}" echo -e "${BLUE}=== E2E Test: Full Authentication Flow ===${NC}" echo "Trading Service: $TRADING_SERVICE_HOST:$TRADING_SERVICE_PORT" echo "Database: $DATABASE_URL" echo "" # Test user credentials TEST_USER="test_trader" TEST_PASS="SecureP@ssw0rd123" TEST_EMAIL="test.trader@foxhunt.com" echo -e "${YELLOW}Step 1: Verify trading service is accessible...${NC}" # Check if trading service is running if ! nc -z "$TRADING_SERVICE_HOST" "$TRADING_SERVICE_PORT" 2>/dev/null; then echo -e "${RED}✗ Trading service is not accessible at $TRADING_SERVICE_HOST:$TRADING_SERVICE_PORT${NC}" echo -e "${YELLOW}Start trading service with:${NC}" echo " cd $PROJECT_ROOT" echo " DATABASE_URL=$DATABASE_URL cargo run --bin trading_service" exit 1 fi echo -e "${GREEN}✓ Trading service is accessible${NC}" echo -e "\n${YELLOW}Step 2: Setup test user in database...${NC}" # Create test user with proper password hashing psql "$DATABASE_URL" > /dev/null 2>&1 < "$TOKEN_FILE" chmod 600 "$TOKEN_FILE" echo -e "${GREEN}✓ Token stored at $TOKEN_FILE${NC}" # Verify token structure JWT_PARTS=$(echo "$JWT_TOKEN" | tr '.' '\n' | wc -l) if [ "$JWT_PARTS" -eq 3 ]; then echo -e "${GREEN}✓ JWT token has valid structure (header.payload.signature)${NC}" else echo -e "${RED}✗ JWT token has invalid structure${NC}" exit 1 fi echo -e "\n${YELLOW}Step 7: Verify token expiration...${NC}" # Extract expiration from JWT payload JWT_PAYLOAD_DECODED=$(echo "$JWT_PAYLOAD_B64" | base64 -d 2>/dev/null || echo "$JWT_PAYLOAD") JWT_EXP=$(echo "$JWT_PAYLOAD_DECODED" | jq -r '.exp' 2>/dev/null || echo "0") CURRENT_TIME=$(date +%s) if [ "$JWT_EXP" -gt "$CURRENT_TIME" ]; then REMAINING=$((JWT_EXP - CURRENT_TIME)) echo -e "${GREEN}✓ Token is valid (expires in ${REMAINING}s)${NC}" else echo -e "${RED}✗ Token is expired${NC}" exit 1 fi echo -e "\n${YELLOW}Step 8: Test authentication with invalid credentials...${NC}" # Verify invalid credentials are rejected INVALID_USER_EXISTS=$(psql "$DATABASE_URL" -t -c " SELECT COUNT(*) FROM users WHERE username = 'invalid_user_$$'; " | tr -d ' ') if [ "$INVALID_USER_EXISTS" -eq 0 ]; then echo -e "${GREEN}✓ Invalid user does not exist (security validated)${NC}" else echo -e "${RED}✗ Test database contamination detected${NC}" exit 1 fi echo -e "\n${YELLOW}Step 9: Verify audit trail for authentication...${NC}" # Check authentication events are logged psql "$DATABASE_URL" > /dev/null 2>&1 < /tmp/foxhunt_test_env_$$ echo -e "${BLUE}Source /tmp/foxhunt_test_env_$$ to use token in other tests${NC}"