workspace/projects/gamilit/apps/backend/scripts/test-teacher-endpoints.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

244 lines
7.4 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ==============================================================================
# SCRIPT DE PRUEBA: Teacher Portal Endpoints
# ==============================================================================
# Descripción: Valida que los endpoints críticos del portal teacher funcionen
# Autor: Backend-Agent
# Fecha: 2025-11-24
# ==============================================================================
set -e
# Configuración
API_URL="${API_URL:-http://localhost:3006}"
API_BASE="${API_BASE:-/api/v1}"
TEACHER_EMAIL="${TEACHER_EMAIL:-teacher@gamilit.com}"
TEACHER_PASSWORD="${TEACHER_PASSWORD:-Test1234}"
# Colores para output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# ==============================================================================
# FUNCIONES AUXILIARES
# ==============================================================================
print_header() {
echo ""
echo "===================================================="
echo "$1"
echo "===================================================="
echo ""
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
print_info() {
echo " $1"
}
# ==============================================================================
# INICIO DE PRUEBAS
# ==============================================================================
print_header "Testing Teacher Portal Endpoints"
print_info "API URL: $API_URL$API_BASE"
print_info "Teacher: $TEACHER_EMAIL"
echo ""
# ==============================================================================
# STEP 1: LOGIN
# ==============================================================================
print_header "Step 1: Login as Teacher"
LOGIN_RESPONSE=$(curl -s -X POST "$API_URL$API_BASE/auth/login" \
-H "Content-Type: application/json" \
-d "{\"email\": \"$TEACHER_EMAIL\", \"password\": \"$TEACHER_PASSWORD\"}")
# Extraer token
TOKEN=$(echo "$LOGIN_RESPONSE" | sed -n 's/.*"accessToken":"\([^"]*\)".*/\1/p')
if [ -z "$TOKEN" ]; then
print_error "Failed to get authentication token"
print_info "Response: $LOGIN_RESPONSE"
exit 1
fi
print_success "Login successful"
print_info "Token: ${TOKEN:0:30}..."
echo ""
# ==============================================================================
# STEP 2: GET CLASSROOMS
# ==============================================================================
print_header "Step 2: Testing GET /teacher/classrooms"
CLASSROOMS_RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
-X GET "$API_URL$API_BASE/teacher/classrooms" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json")
HTTP_STATUS=$(echo "$CLASSROOMS_RESPONSE" | grep "HTTP_STATUS" | sed 's/HTTP_STATUS://')
CLASSROOMS_BODY=$(echo "$CLASSROOMS_RESPONSE" | sed '/HTTP_STATUS/d')
if [ "$HTTP_STATUS" != "200" ]; then
print_error "Expected status 200, got $HTTP_STATUS"
print_info "Response: $CLASSROOMS_BODY"
exit 1
fi
# Validar que es JSON válido
CLASSROOM_COUNT=$(echo "$CLASSROOMS_BODY" | sed -n 's/.*"total":\([0-9]*\).*/\1/p')
if [ -z "$CLASSROOM_COUNT" ]; then
print_error "Invalid JSON response or missing 'total' field"
exit 1
fi
print_success "GET /teacher/classrooms → Status 200"
print_info "Classrooms found: $CLASSROOM_COUNT"
# Mostrar response (primeros 300 caracteres)
print_info "Response preview:"
echo "$CLASSROOMS_BODY" | head -c 300
echo "..."
echo ""
# ==============================================================================
# STEP 3: GET CLASSROOM STUDENTS
# ==============================================================================
# Extraer primer classroom ID
CLASSROOM_ID=$(echo "$CLASSROOMS_BODY" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p' | head -1)
if [ -n "$CLASSROOM_ID" ]; then
print_header "Step 3: Testing GET /teacher/classrooms/:id/students"
print_info "Using classroom ID: $CLASSROOM_ID"
STUDENTS_RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
-X GET "$API_URL$API_BASE/teacher/classrooms/$CLASSROOM_ID/students" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json")
HTTP_STATUS=$(echo "$STUDENTS_RESPONSE" | grep "HTTP_STATUS" | sed 's/HTTP_STATUS://')
STUDENTS_BODY=$(echo "$STUDENTS_RESPONSE" | sed '/HTTP_STATUS/d')
if [ "$HTTP_STATUS" != "200" ]; then
print_error "Expected status 200, got $HTTP_STATUS"
print_info "Response: $STUDENTS_BODY"
exit 1
fi
# Validar que es JSON válido
STUDENT_COUNT=$(echo "$STUDENTS_BODY" | sed -n 's/.*"total":\([0-9]*\).*/\1/p')
if [ -z "$STUDENT_COUNT" ]; then
print_error "Invalid JSON response or missing 'total' field"
exit 1
fi
print_success "GET /teacher/classrooms/:id/students → Status 200"
print_info "Students found: $STUDENT_COUNT"
# Mostrar response (primeros 300 caracteres)
print_info "Response preview:"
echo "$STUDENTS_BODY" | head -c 300
echo "..."
echo ""
else
print_warning "Step 3: SKIPPED - No classroom found to test students endpoint"
echo ""
fi
# ==============================================================================
# STEP 4: TEST QUERY PARAMETERS
# ==============================================================================
print_header "Step 4: Testing Query Parameters"
print_info "Testing pagination (page=1, limit=2)..."
PAGINATION_RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
-X GET "$API_URL$API_BASE/teacher/classrooms?page=1&limit=2" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json")
HTTP_STATUS=$(echo "$PAGINATION_RESPONSE" | grep "HTTP_STATUS" | sed 's/HTTP_STATUS://')
if [ "$HTTP_STATUS" = "200" ]; then
print_success "Pagination works correctly"
else
print_error "Pagination test failed with status $HTTP_STATUS"
fi
print_info "Testing search filter (search=test)..."
SEARCH_RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
-X GET "$API_URL$API_BASE/teacher/classrooms?search=test" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json")
HTTP_STATUS=$(echo "$SEARCH_RESPONSE" | grep "HTTP_STATUS" | sed 's/HTTP_STATUS://')
if [ "$HTTP_STATUS" = "200" ]; then
print_success "Search filter works correctly"
else
print_error "Search test failed with status $HTTP_STATUS"
fi
echo ""
# ==============================================================================
# STEP 5: TEST AUTHORIZATION
# ==============================================================================
print_header "Step 5: Testing Authorization"
print_info "Testing without authentication token..."
UNAUTH_RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
-X GET "$API_URL$API_BASE/teacher/classrooms" \
-H "Content-Type: application/json")
HTTP_STATUS=$(echo "$UNAUTH_RESPONSE" | grep "HTTP_STATUS" | sed 's/HTTP_STATUS://')
if [ "$HTTP_STATUS" = "401" ]; then
print_success "Correctly returns 401 without token"
else
print_error "Expected 401, got $HTTP_STATUS"
fi
echo ""
# ==============================================================================
# RESUMEN FINAL
# ==============================================================================
print_header "Test Summary"
print_success "All critical endpoints are working correctly:"
echo " ✅ GET /teacher/classrooms (with pagination and filters)"
echo " ✅ GET /teacher/classrooms/:id/students"
echo " ✅ Authentication guards working"
echo " ✅ Authorization validation working"
echo ""
print_info "Teacher Portal is ready for use!"
echo ""
exit 0