workspace/projects/gamilit/apps/backend/scripts/test-missions-integration.sh
rckrdmrd ea1879f4ad feat: Initial workspace structure with multi-level Git configuration
- Configure workspace Git repository with comprehensive .gitignore
- Add Odoo as submodule for ERP reference code
- Include documentation: SETUP.md, GIT-STRUCTURE.md
- Add gitignore templates for projects (backend, frontend, database)
- Structure supports independent repos per project/subproject level

Workspace includes:
- core/ - Reusable patterns, modules, orchestration system
- projects/ - Active projects (erp-suite, gamilit, trading-platform, etc.)
- knowledge-base/ - Reference code and patterns (includes Odoo submodule)
- devtools/ - Development tools and templates
- customers/ - Client implementations template

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-08 10:44:23 -06:00

144 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
###############################################################################
# Script de Prueba: Integración MissionsService en ExerciseAttemptService
#
# Propósito: Validar que las misiones se actualizan correctamente al completar ejercicios
#
# Flujo de prueba:
# 1. Crear una misión diaria con objetivo 'complete_exercises'
# 2. Completar un ejercicio correctamente
# 3. Verificar que la misión se actualizó
#
# Uso: bash scripts/test-missions-integration.sh
###############################################################################
set -e
# Colores para output
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
API_BASE_URL="http://localhost:3000/api"
AUTH_TOKEN=""
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}Test: Missions Integration - Exercise Completion${NC}"
echo -e "${BLUE}========================================${NC}\n"
# Step 1: Login como estudiante
echo -e "${YELLOW}[1/5] Logging in as student...${NC}"
LOGIN_RESPONSE=$(curl -s -X POST "${API_BASE_URL}/auth/login" \
-H "Content-Type: application/json" \
-d '{
"email": "student1@test.com",
"password": "test123"
}')
AUTH_TOKEN=$(echo $LOGIN_RESPONSE | jq -r '.access_token')
USER_ID=$(echo $LOGIN_RESPONSE | jq -r '.user.id')
if [ -z "$AUTH_TOKEN" ] || [ "$AUTH_TOKEN" = "null" ]; then
echo -e "${RED}❌ Login failed${NC}"
echo "$LOGIN_RESPONSE"
exit 1
fi
echo -e "${GREEN}✅ Logged in successfully (User ID: $USER_ID)${NC}\n"
# Step 2: Obtener misiones diarias actuales
echo -e "${YELLOW}[2/5] Getting current daily missions...${NC}"
MISSIONS_BEFORE=$(curl -s -X GET "${API_BASE_URL}/gamification/missions?type=daily" \
-H "Authorization: Bearer ${AUTH_TOKEN}")
echo -e "${BLUE}Current missions:${NC}"
echo "$MISSIONS_BEFORE" | jq '.[] | {id, title, progress, objectives}'
echo ""
MISSION_ID=$(echo "$MISSIONS_BEFORE" | jq -r '.[0].id')
PROGRESS_BEFORE=$(echo "$MISSIONS_BEFORE" | jq -r '.[0].progress')
echo -e "${GREEN}Mission ID: $MISSION_ID${NC}"
echo -e "${GREEN}Progress before: $PROGRESS_BEFORE%${NC}\n"
# Step 3: Obtener un ejercicio activo
echo -e "${YELLOW}[3/5] Getting active exercise...${NC}"
EXERCISES=$(curl -s -X GET "${API_BASE_URL}/educational/exercises?is_active=true" \
-H "Authorization: Bearer ${AUTH_TOKEN}")
EXERCISE_ID=$(echo "$EXERCISES" | jq -r '.[0].id')
EXERCISE_TITLE=$(echo "$EXERCISES" | jq -r '.[0].title')
if [ -z "$EXERCISE_ID" ] || [ "$EXERCISE_ID" = "null" ]; then
echo -e "${RED}❌ No active exercises found${NC}"
exit 1
fi
echo -e "${GREEN}✅ Exercise found: $EXERCISE_TITLE (ID: $EXERCISE_ID)${NC}\n"
# Step 4: Crear un intento de ejercicio CORRECTO
echo -e "${YELLOW}[4/5] Creating correct exercise attempt...${NC}"
ATTEMPT_RESPONSE=$(curl -s -X POST "${API_BASE_URL}/progress/exercise-attempts" \
-H "Authorization: Bearer ${AUTH_TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"exercise_id\": \"$EXERCISE_ID\",
\"is_correct\": true,
\"score\": 100,
\"xp_earned\": 100,
\"ml_coins_earned\": 10,
\"time_spent\": 60,
\"hints_used\": 0,
\"comodines_used\": [],
\"submitted_answers\": {\"answer\": \"correct\"}
}")
ATTEMPT_ID=$(echo "$ATTEMPT_RESPONSE" | jq -r '.id')
if [ -z "$ATTEMPT_ID" ] || [ "$ATTEMPT_ID" = "null" ]; then
echo -e "${RED}❌ Failed to create attempt${NC}"
echo "$ATTEMPT_RESPONSE"
exit 1
fi
echo -e "${GREEN}✅ Attempt created successfully (ID: $ATTEMPT_ID)${NC}"
echo -e "${BLUE}XP Earned:${NC} $(echo "$ATTEMPT_RESPONSE" | jq -r '.xp_earned')"
echo -e "${BLUE}ML Coins Earned:${NC} $(echo "$ATTEMPT_RESPONSE" | jq -r '.ml_coins_earned')\n"
# Wait for async processing
echo -e "${YELLOW}Waiting 2 seconds for missions update...${NC}"
sleep 2
# Step 5: Verificar que la misión se actualizó
echo -e "${YELLOW}[5/5] Verifying mission progress updated...${NC}"
MISSIONS_AFTER=$(curl -s -X GET "${API_BASE_URL}/gamification/missions?type=daily" \
-H "Authorization: Bearer ${AUTH_TOKEN}")
PROGRESS_AFTER=$(echo "$MISSIONS_AFTER" | jq -r '.[0].progress')
OBJECTIVE_CURRENT=$(echo "$MISSIONS_AFTER" | jq -r '.[0].objectives[0].current')
OBJECTIVE_TARGET=$(echo "$MISSIONS_AFTER" | jq -r '.[0].objectives[0].target')
echo -e "${BLUE}Progress after: $PROGRESS_AFTER%${NC}"
echo -e "${BLUE}Objective progress: $OBJECTIVE_CURRENT / $OBJECTIVE_TARGET${NC}\n"
# Validación
if (( $(echo "$PROGRESS_AFTER > $PROGRESS_BEFORE" | bc -l) )); then
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}✅ TEST PASSED: Mission progress updated!${NC}"
echo -e "${GREEN}Progress increased from $PROGRESS_BEFORE% to $PROGRESS_AFTER%${NC}"
echo -e "${GREEN}========================================${NC}"
exit 0
else
echo -e "${RED}========================================${NC}"
echo -e "${RED}❌ TEST FAILED: Mission progress not updated${NC}"
echo -e "${RED}Progress remained at $PROGRESS_BEFORE%${NC}"
echo -e "${RED}========================================${NC}"
echo -e "\n${YELLOW}Debug Info:${NC}"
echo -e "${BLUE}Missions after:${NC}"
echo "$MISSIONS_AFTER" | jq '.'
exit 1
fi