- 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>
324 lines
9.9 KiB
Bash
Executable File
324 lines
9.9 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
###############################################################################
|
||
# Admin Progress Module - Endpoints Testing Script
|
||
# Tests all 6 endpoints of the Admin Progress Module (Plan 3)
|
||
###############################################################################
|
||
|
||
# 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_URL="${API_URL:-http://localhost:3006}"
|
||
TOKEN="${ADMIN_TOKEN:-}"
|
||
|
||
# Test results
|
||
TESTS_PASSED=0
|
||
TESTS_FAILED=0
|
||
|
||
###############################################################################
|
||
# Helper Functions
|
||
###############################################################################
|
||
|
||
print_header() {
|
||
echo -e "\n${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||
echo -e "${BLUE}$1${NC}"
|
||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
|
||
}
|
||
|
||
print_test() {
|
||
echo -e "${YELLOW}Testing:${NC} $1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✓ PASSED${NC} - $1"
|
||
((TESTS_PASSED++))
|
||
}
|
||
|
||
print_failure() {
|
||
echo -e "${RED}✗ FAILED${NC} - $1"
|
||
((TESTS_FAILED++))
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${BLUE}ℹ${NC} $1"
|
||
}
|
||
|
||
check_prerequisites() {
|
||
if [ -z "$TOKEN" ]; then
|
||
echo -e "${RED}Error: ADMIN_TOKEN environment variable is not set${NC}"
|
||
echo "Please set it with: export ADMIN_TOKEN='your-admin-jwt-token'"
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v jq &> /dev/null; then
|
||
echo -e "${YELLOW}Warning: jq is not installed. JSON output will not be formatted.${NC}"
|
||
fi
|
||
}
|
||
|
||
make_request() {
|
||
local method="$1"
|
||
local endpoint="$2"
|
||
local description="$3"
|
||
|
||
print_test "$description"
|
||
|
||
response=$(curl -s -w "\n%{http_code}" \
|
||
-X "$method" \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
-H "Content-Type: application/json" \
|
||
"$API_URL$endpoint")
|
||
|
||
http_code=$(echo "$response" | tail -n1)
|
||
body=$(echo "$response" | sed '$d')
|
||
|
||
if [ "$http_code" -eq 200 ] || [ "$http_code" -eq 201 ]; then
|
||
print_success "HTTP $http_code"
|
||
if command -v jq &> /dev/null; then
|
||
echo "$body" | jq '.' 2>/dev/null || echo "$body"
|
||
else
|
||
echo "$body"
|
||
fi
|
||
return 0
|
||
else
|
||
print_failure "HTTP $http_code"
|
||
echo "Response: $body"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
###############################################################################
|
||
# Test Cases
|
||
###############################################################################
|
||
|
||
test_progress_overview() {
|
||
print_header "TEST 1: Progress Overview"
|
||
make_request "GET" "/admin/progress/overview" "Get system-wide progress overview"
|
||
}
|
||
|
||
test_classroom_progress() {
|
||
print_header "TEST 2: Classroom Progress"
|
||
|
||
# First, get a classroom ID from the system
|
||
print_info "Fetching available classrooms..."
|
||
classrooms=$(curl -s \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/admin/classrooms" | jq -r '.[0].id' 2>/dev/null)
|
||
|
||
if [ -n "$classrooms" ] && [ "$classrooms" != "null" ]; then
|
||
CLASSROOM_ID="$classrooms"
|
||
make_request "GET" "/admin/progress/classrooms/$CLASSROOM_ID" \
|
||
"Get progress for classroom $CLASSROOM_ID"
|
||
else
|
||
print_info "No classrooms found. Using sample UUID for testing..."
|
||
CLASSROOM_ID="123e4567-e89b-12d3-a456-426614174000"
|
||
make_request "GET" "/admin/progress/classrooms/$CLASSROOM_ID" \
|
||
"Get progress for classroom (may return 404 if not exists)"
|
||
fi
|
||
}
|
||
|
||
test_student_progress() {
|
||
print_header "TEST 3: Student Progress"
|
||
|
||
# First, get a student ID from the system
|
||
print_info "Fetching available students..."
|
||
students=$(curl -s \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/admin/users?role=student" | jq -r '.[0].id' 2>/dev/null)
|
||
|
||
if [ -n "$students" ] && [ "$students" != "null" ]; then
|
||
STUDENT_ID="$students"
|
||
make_request "GET" "/admin/progress/students/$STUDENT_ID" \
|
||
"Get progress for student $STUDENT_ID"
|
||
|
||
# Test with query parameters
|
||
echo ""
|
||
if [ -n "$CLASSROOM_ID" ]; then
|
||
make_request "GET" "/admin/progress/students/$STUDENT_ID?classroom_id=$CLASSROOM_ID" \
|
||
"Get student progress filtered by classroom"
|
||
fi
|
||
else
|
||
print_info "No students found. Using sample UUID for testing..."
|
||
STUDENT_ID="123e4567-e89b-12d3-a456-426614174000"
|
||
make_request "GET" "/admin/progress/students/$STUDENT_ID" \
|
||
"Get progress for student (may return 404 if not exists)"
|
||
fi
|
||
}
|
||
|
||
test_module_progress() {
|
||
print_header "TEST 4: Module Progress Statistics"
|
||
|
||
# First, get a module ID from the system
|
||
print_info "Fetching available modules..."
|
||
modules=$(curl -s \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/modules" | jq -r '.[0].id' 2>/dev/null)
|
||
|
||
if [ -n "$modules" ] && [ "$modules" != "null" ]; then
|
||
MODULE_ID="$modules"
|
||
make_request "GET" "/admin/progress/modules/$MODULE_ID" \
|
||
"Get statistics for module $MODULE_ID"
|
||
|
||
# Test with query parameters
|
||
echo ""
|
||
if [ -n "$CLASSROOM_ID" ]; then
|
||
make_request "GET" "/admin/progress/modules/$MODULE_ID?classroom_id=$CLASSROOM_ID" \
|
||
"Get module statistics filtered by classroom"
|
||
fi
|
||
else
|
||
print_info "No modules found. Using sample UUID for testing..."
|
||
MODULE_ID="123e4567-e89b-12d3-a456-426614174000"
|
||
make_request "GET" "/admin/progress/modules/$MODULE_ID" \
|
||
"Get statistics for module (may return 404 if not exists)"
|
||
fi
|
||
}
|
||
|
||
test_exercise_stats() {
|
||
print_header "TEST 5: Exercise Statistics"
|
||
|
||
# First, get an exercise ID from the system
|
||
print_info "Fetching available exercises..."
|
||
exercises=$(curl -s \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/exercises" | jq -r '.[0].id' 2>/dev/null)
|
||
|
||
if [ -n "$exercises" ] && [ "$exercises" != "null" ]; then
|
||
EXERCISE_ID="$exercises"
|
||
make_request "GET" "/admin/progress/exercises/$EXERCISE_ID" \
|
||
"Get statistics for exercise $EXERCISE_ID"
|
||
else
|
||
print_info "No exercises found. Using sample UUID for testing..."
|
||
EXERCISE_ID="123e4567-e89b-12d3-a456-426614174000"
|
||
make_request "GET" "/admin/progress/exercises/$EXERCISE_ID" \
|
||
"Get statistics for exercise (may return 404 if not exists)"
|
||
fi
|
||
}
|
||
|
||
test_export_progress() {
|
||
print_header "TEST 6: Export Progress Data"
|
||
|
||
# Test exporting students
|
||
print_test "Export students progress to CSV"
|
||
response=$(curl -s -w "\n%{http_code}" \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/admin/progress/export?type=students&format=csv")
|
||
|
||
http_code=$(echo "$response" | tail -n1)
|
||
body=$(echo "$response" | sed '$d')
|
||
|
||
if [ "$http_code" -eq 200 ]; then
|
||
print_success "Students export - HTTP $http_code"
|
||
echo "First 5 lines of CSV:"
|
||
echo "$body" | head -n 5
|
||
else
|
||
print_failure "Students export - HTTP $http_code"
|
||
echo "Response: $body"
|
||
fi
|
||
|
||
echo ""
|
||
|
||
# Test exporting classrooms
|
||
print_test "Export classrooms progress to CSV"
|
||
response=$(curl -s -w "\n%{http_code}" \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/admin/progress/export?type=classrooms&format=csv")
|
||
|
||
http_code=$(echo "$response" | tail -n1)
|
||
body=$(echo "$response" | sed '$d')
|
||
|
||
if [ "$http_code" -eq 200 ]; then
|
||
print_success "Classrooms export - HTTP $http_code"
|
||
echo "First 5 lines of CSV:"
|
||
echo "$body" | head -n 5
|
||
else
|
||
print_failure "Classrooms export - HTTP $http_code"
|
||
echo "Response: $body"
|
||
fi
|
||
|
||
echo ""
|
||
|
||
# Test exporting modules
|
||
print_test "Export modules progress to CSV"
|
||
response=$(curl -s -w "\n%{http_code}" \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/admin/progress/export?type=modules&format=csv")
|
||
|
||
http_code=$(echo "$response" | tail -n1)
|
||
body=$(echo "$response" | sed '$d')
|
||
|
||
if [ "$http_code" -eq 200 ]; then
|
||
print_success "Modules export - HTTP $http_code"
|
||
echo "First 5 lines of CSV:"
|
||
echo "$body" | head -n 5
|
||
else
|
||
print_failure "Modules export - HTTP $http_code"
|
||
echo "Response: $body"
|
||
fi
|
||
|
||
echo ""
|
||
|
||
# Test with classroom filter
|
||
if [ -n "$CLASSROOM_ID" ]; then
|
||
print_test "Export students filtered by classroom"
|
||
response=$(curl -s -w "\n%{http_code}" \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
"$API_URL/admin/progress/export?type=students&classroom_id=$CLASSROOM_ID&format=csv")
|
||
|
||
http_code=$(echo "$response" | tail -n1)
|
||
body=$(echo "$response" | sed '$d')
|
||
|
||
if [ "$http_code" -eq 200 ]; then
|
||
print_success "Filtered export - HTTP $http_code"
|
||
echo "First 5 lines of CSV:"
|
||
echo "$body" | head -n 5
|
||
else
|
||
print_failure "Filtered export - HTTP $http_code"
|
||
echo "Response: $body"
|
||
fi
|
||
fi
|
||
}
|
||
|
||
###############################################################################
|
||
# Main Execution
|
||
###############################################################################
|
||
|
||
main() {
|
||
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${GREEN}║ Admin Progress Module - Endpoint Testing Suite ║${NC}"
|
||
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
echo "API URL: $API_URL"
|
||
echo ""
|
||
|
||
check_prerequisites
|
||
|
||
test_progress_overview
|
||
test_classroom_progress
|
||
test_student_progress
|
||
test_module_progress
|
||
test_exercise_stats
|
||
test_export_progress
|
||
|
||
# Summary
|
||
print_header "TEST SUMMARY"
|
||
TOTAL_TESTS=$((TESTS_PASSED + TESTS_FAILED))
|
||
echo -e "Total Tests: $TOTAL_TESTS"
|
||
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}"
|
||
exit 0
|
||
else
|
||
echo -e "\n${RED}✗ Some tests failed${NC}"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Run main function
|
||
main
|