🎓 Initial commit: Math2 Platform - Plataforma de Álgebra Lineal PRO
Some checks failed
Test Suite / test-backend (push) Has been cancelled
Test Suite / test-frontend (push) Has been cancelled
Test Suite / e2e-tests (push) Has been cancelled
Test Suite / coverage-check (push) Has been cancelled

 Características:
- 45 ejercicios universitarios (Basic → Advanced)
- Renderizado LaTeX profesional
- IA generativa (Z.ai/DashScope)
- Docker 9 servicios
- Tests 123/123 pasando
- Seguridad enterprise (JWT, XSS, Rate limiting)

🐳 Infraestructura:
- Next.js 14 + Node.js 20
- PostgreSQL 15 + Redis 7
- Docker Compose completo
- Nginx + SSL ready

📚 Documentación:
- 5 informes técnicos completos
- README profesional
- Scripts de deployment automatizados

Estado: Producción lista 
This commit is contained in:
Renato
2026-03-31 11:27:11 -03:00
commit bc43c9e772
309 changed files with 84845 additions and 0 deletions

436
scripts/test-e2e.sh Executable file
View File

@@ -0,0 +1,436 @@
#!/bin/bash
# ================================================
# Math Platform - End-to-End Testing Script
# ================================================
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
API_BASE_URL="http://localhost:3001"
FRONTEND_URL="http://localhost:3000"
TEST_USER_EMAIL="test_$(date +%s)@example.com"
TEST_USER_PASSWORD="Test123456!"
TEST_USER_NAME="Test User"
# Test results
TESTS_PASSED=0
TESTS_FAILED=0
TESTS_TOTAL=0
# Helper functions
print_header() {
echo -e "\n${BLUE}============================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}============================================${NC}"
}
print_test() {
echo -e "\n${YELLOW}TEST: $1${NC}"
TESTS_TOTAL=$((TESTS_TOTAL + 1))
}
print_success() {
echo -e "${GREEN}✓ PASSED: $1${NC}"
TESTS_PASSED=$((TESTS_PASSED + 1))
}
print_error() {
echo -e "${RED}✗ FAILED: $1${NC}"
TESTS_FAILED=$((TESTS_FAILED + 1))
}
print_info() {
echo -e "${BLUE} $1${NC}"
}
# Function to wait for service
wait_for_service() {
local url=$1
local max_attempts=30
local attempt=1
print_info "Waiting for $url..."
while [ $attempt -le $max_attempts ]; do
if curl -s -f "$url" > /dev/null 2>&1; then
print_success "Service is ready"
return 0
fi
sleep 2
attempt=$((attempt + 1))
done
print_error "Service not ready after $max_attempts attempts"
return 1
}
# Function to make API request
api_request() {
local method=$1
local endpoint=$2
local data=$3
local token=$4
local url="${API_BASE_URL}${endpoint}"
local headers="-H 'Content-Type: application/json'"
if [ -n "$token" ]; then
headers="$headers -H 'Authorization: Bearer $token'"
fi
if [ "$method" = "GET" ]; then
curl -s -X GET "$url" $headers
elif [ "$method" = "POST" ]; then
curl -s -X POST "$url" $headers -d "$data"
elif [ "$method" = "PUT" ]; then
curl -s -X PUT "$url" $headers -d "$data"
elif [ "$method" = "DELETE" ]; then
curl -s -X DELETE "$url" $headers
fi
}
# Function to test user registration
test_registration() {
print_test "User Registration"
local response=$(api_request "POST" "/api/auth/register" "{\"email\":\"$TEST_USER_EMAIL\",\"password\":\"$TEST_USER_PASSWORD\",\"name\":\"$TEST_USER_NAME\"}")
if echo "$response" | grep -q "token"; then
USER_TOKEN=$(echo "$response" | grep -o '"token":"[^"]*' | cut -d'"' -f4)
USER_ID=$(echo "$response" | grep -o '"id":"[^"]*' | cut -d'"' -f4)
print_success "User registered successfully"
print_info "User ID: $USER_ID"
print_info "Email: $TEST_USER_EMAIL"
return 0
else
print_error "Registration failed"
print_info "Response: $response"
return 1
fi
}
# Function to test user login
test_login() {
print_test "User Login"
local response=$(api_request "POST" "/api/auth/login" "{\"email\":\"$TEST_USER_EMAIL\",\"password\":\"$TEST_USER_PASSWORD\"}")
if echo "$response" | grep -q "token"; then
USER_TOKEN=$(echo "$response" | grep -o '"token":"[^"]*' | cut -d'"' -f4)
print_success "User logged in successfully"
return 0
else
print_error "Login failed"
print_info "Response: $response"
return 1
fi
}
# Function to test getting modules
test_get_modules() {
print_test "Get Learning Modules"
local response=$(api_request "GET" "/api/modules" "" "$USER_TOKEN")
if echo "$response" | grep -q "modules"; then
MODULE_COUNT=$(echo "$response" | grep -o '"id"' | wc -l)
print_success "Retrieved $MODULE_COUNT modules"
# Get first module ID
if [ $MODULE_COUNT -gt 0 ]; then
MODULE_ID=$(echo "$response" | grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4)
print_info "First Module ID: $MODULE_ID"
fi
return 0
else
print_error "Failed to retrieve modules"
print_info "Response: $response"
return 1
fi
}
# Function to test accessing a specific module
test_access_module() {
print_test "Access Module Content"
if [ -z "$MODULE_ID" ]; then
print_error "No module ID available"
return 1
fi
local response=$(api_request "GET" "/api/modules/$MODULE_ID" "" "$USER_TOKEN")
if echo "$response" | grep -q "title"; then
MODULE_TITLE=$(echo "$response" | grep -o '"title":"[^"]*' | cut -d'"' -f4)
print_success "Accessed module: $MODULE_TITLE"
return 0
else
print_error "Failed to access module"
print_info "Response: $response"
return 1
fi
}
# Function to test getting exercises
test_get_exercises() {
print_test "Get Exercises for Module"
if [ -z "$MODULE_ID" ]; then
print_error "No module ID available"
return 1
fi
local response=$(api_request "GET" "/api/exercises?moduleId=$MODULE_ID" "" "$USER_TOKEN")
if echo "$response" | grep -q "exercises"; then
EXERCISE_COUNT=$(echo "$response" | grep -o '"id"' | wc -l)
print_success "Retrieved $EXERCISE_COUNT exercises"
# Get first exercise ID
if [ $EXERCISE_COUNT -gt 0 ]; then
EXERCISE_ID=$(echo "$response" | grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4)
print_info "First Exercise ID: $EXERCISE_ID"
fi
return 0
else
print_error "Failed to retrieve exercises"
print_info "Response: $response"
return 1
fi
}
# Function to test submitting an exercise
test_submit_exercise() {
print_test "Submit Exercise Answer"
if [ -z "$EXERCISE_ID" ]; then
print_error "No exercise ID available"
return 1
fi
# Submit a test answer
local response=$(api_request "POST" "/api/exercises/$EXERCISE_ID/submit" "{\"answer\":\"42\",\"timeSpent\":60}" "$USER_TOKEN")
if echo "$response" | grep -q "correct"; then
print_success "Exercise submitted successfully"
return 0
else
print_error "Failed to submit exercise"
print_info "Response: $response"
return 1
fi
}
# Function to test getting user progress
test_get_progress() {
print_test "Get User Progress"
local response=$(api_request "GET" "/api/users/progress" "" "$USER_TOKEN")
if echo "$response" | grep -q "progress"; then
print_success "Retrieved user progress"
return 0
else
print_error "Failed to retrieve progress"
print_info "Response: $response"
return 1
fi
}
# Function to test getting ranking
test_get_ranking() {
print_test "Get User Ranking"
local response=$(api_request "GET" "/api/users/ranking?limit=10" "" "$USER_TOKEN")
if echo "$response" | grep -q "ranking"; then
print_success "Retrieved user ranking"
return 0
else
print_error "Failed to retrieve ranking"
print_info "Response: $response"
return 1
fi
}
# Function to test getting achievements
test_get_achievements() {
print_test "Get User Achievements"
local response=$(api_request "GET" "/api/users/achievements" "" "$USER_TOKEN")
if echo "$response" | grep -q "achievements"; then
ACHIEVEMENT_COUNT=$(echo "$response" | grep -o '"id"' | wc -l)
print_success "Retrieved $ACHIEVEMENT_COUNT achievements"
return 0
else
print_error "Failed to retrieve achievements"
print_info "Response: $response"
return 1
fi
}
# Function to test updating user profile
test_update_profile() {
print_test "Update User Profile"
local new_name="Updated Test User"
local response=$(api_request "PUT" "/api/users/profile" "{\"name\":\"$new_name\"}" "$USER_TOKEN")
if echo "$response" | grep -q "name"; then
print_success "Profile updated successfully"
return 0
else
print_error "Failed to update profile"
print_info "Response: $response"
return 1
fi
}
# Function to test health endpoint
test_health() {
print_test "Health Check Endpoint"
local response=$(curl -s "$API_BASE_URL/health")
if echo "$response" | grep -q "status.*ok\|healthy"; then
print_success "Health check passed"
return 0
else
print_error "Health check failed"
print_info "Response: $response"
return 1
fi
}
# Function to test frontend accessibility
test_frontend() {
print_test "Frontend Accessibility"
local response=$(curl -s -o /dev/null -w "%{http_code}" "$FRONTEND_URL")
if [ "$response" = "200" ]; then
print_success "Frontend is accessible"
return 0
else
print_error "Frontend returned status code: $response"
return 1
fi
}
# Function to run all tests
run_all_tests() {
print_header "Math Platform E2E Test Suite"
# Check if services are running
print_info "Checking service availability..."
if ! wait_for_service "$API_BASE_URL/health"; then
print_error "Backend service is not available. Please start the services first."
print_info "Run: ./docker/start.sh"
exit 1
fi
if ! wait_for_service "$FRONTEND_URL"; then
print_error "Frontend service is not available. Please start the services first."
print_info "Run: ./docker/start.sh"
exit 1
fi
echo -e "\n${GREEN}All services are running! Starting tests...${NC}\n"
# Run tests
test_health
test_frontend
test_registration
test_login
test_get_modules
test_access_module
test_get_exercises
test_submit_exercise
test_get_progress
test_get_ranking
test_get_achievements
test_update_profile
# Print summary
print_header "Test Summary"
echo -e "Total Tests: $TESTS_TOTAL"
echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
echo -e "${RED}Failed: $TESTS_FAILED${NC}"
if [ $TESTS_FAILED -eq 0 ]; then
echo -e "\n${GREEN}All tests passed!${NC}\n"
exit 0
else
echo -e "\n${RED}Some tests failed!${NC}\n"
exit 1
fi
}
# Function to run specific test
run_specific_test() {
local test_name=$1
case $test_name in
"health")
test_health
;;
"frontend")
test_frontend
;;
"register")
test_registration
;;
"login")
test_login
;;
"modules")
test_get_modules
;;
"module")
test_access_module
;;
"exercises")
test_get_exercises
;;
"submit")
test_submit_exercise
;;
"progress")
test_get_progress
;;
"ranking")
test_get_ranking
;;
"achievements")
test_get_achievements
;;
"profile")
test_update_profile
;;
*)
print_error "Unknown test: $test_name"
echo "Available tests: health, frontend, register, login, modules, module, exercises, submit, progress, ranking, achievements, profile"
exit 1
;;
esac
}
# Main execution
main() {
if [ $# -eq 0 ]; then
run_all_tests
else
run_specific_test "$1"
fi
}
# Run main function
main "$@"