ai_qc/backend/scripts/test-system.sh
nickviljoen 3fec052c12 Create frontend and backend folder structure for deployment
Organized the application into separate frontend and backend directories for cleaner deployment and better separation of concerns.

Frontend Directory (frontend/):
- index.html: Single-page web interface (renamed from web_ui.html)
- README.md: Frontend deployment guide
- Total size: ~113 KB (self-contained)
- Smart base path detection (works at / or /ai_qc/)
- No configuration changes required

Backend Directory (backend/):
- All Python files (api_server.py, llm_config.py, etc.)
- visual_qc_apps/: 33 QC check modules
- profiles/: 6 QC profile configurations
- brand_guidelines/: Reference asset storage
- config/: Environment configurations
- scripts/: Deployment automation
- uploads/, output/: Data directories
- requirements.txt, ai_qc.service, apache_config.conf
- Complete documentation

New Documentation:
- FOLDER_STRUCTURE.md: Comprehensive guide to new structure
- frontend/README.md: Frontend deployment instructions
- backend/BACKEND_README.md: Backend deployment guide

Deployment Mapping:
- frontend/ → /var/www/html/ai_qc/ (web root)
- backend/ → /opt/ai_qc/ (application directory)

Benefits:
- Clear separation of concerns
- Backend code not in web-accessible directory
- Independent frontend/backend updates
- Matches server's existing patterns (/opt/veo3, /opt/voice2text)
- Industry-standard architecture
- Easy to deploy and maintain

Original files preserved in root directory for reference.
Ready for production deployment following MIGRATION_GUIDE.md.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 11:55:53 +02:00

167 lines
No EOL
4.7 KiB
Bash
Executable file

#!/bin/bash
# Script to test the Visual AI QC system before deployment
set -e # Exit on any error
echo "==========================================="
echo " Visual AI QC - System Testing"
echo "==========================================="
# Get the script directory and app root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_DIR="$(dirname "$SCRIPT_DIR")"
echo "Testing directory: $APP_DIR"
# Change to app directory
cd "$APP_DIR"
# Determine Python command
if command -v python3 &> /dev/null; then
PYTHON_CMD=python3
elif command -v python &> /dev/null; then
PYTHON_CMD=python
else
echo "ERROR: Python not found!"
exit 1
fi
echo "Using Python: $PYTHON_CMD"
# Test 1: Python syntax check
echo ""
echo "Test 1: Python syntax validation"
echo "================================"
find . -name "*.py" -not -path "./venv/*" | while read -r file; do
echo "Checking: $file"
$PYTHON_CMD -m py_compile "$file" || {
echo "ERROR: Syntax error in $file"
exit 1
}
done
echo "✅ All Python files have valid syntax"
# Test 2: Core module imports
echo ""
echo "Test 2: Core module imports"
echo "=========================="
$PYTHON_CMD -c "
try:
import api_server
import llm_config
import profile_config
import jwt_validator
import auth_middleware
print('✅ All core modules imported successfully')
except Exception as e:
print(f'ERROR: Core module import failed: {e}')
exit(1)
"
# Test 3: Profile system validation
echo ""
echo "Test 3: Profile system validation"
echo "================================="
$PYTHON_CMD -c "
from profile_config import get_profile
profiles = ['general_check', 'unilever_key_visual', 'unilever_packaging', 'diageo_key_visual', 'diageo_packaging', 'inclusive_accessibility']
for p in profiles:
try:
profile = get_profile(p)
enabled_checks = profile.get_enabled_checks()
print(f'✅ {profile.name} ({len(enabled_checks)} checks)')
except Exception as e:
print(f'ERROR: Profile {p} failed to load: {e}')
exit(1)
"
# Test 4: QC module validation
echo ""
echo "Test 4: QC module validation"
echo "============================"
$PYTHON_CMD -c "
import os
import importlib.util
import sys
qc_apps_dir = 'visual_qc_apps'
error_count = 0
for item in os.listdir(qc_apps_dir):
item_path = os.path.join(qc_apps_dir, item)
if os.path.isdir(item_path) and not item.startswith('__'):
app_file = os.path.join(item_path, 'app.py')
if os.path.exists(app_file):
try:
spec = importlib.util.spec_from_file_location(f'{item}.app', app_file)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
print(f'✅ {item}/app.py')
except Exception as e:
print(f'ERROR: {item}/app.py - {e}')
error_count += 1
if error_count > 0:
print(f'ERROR: {error_count} QC modules failed to load')
sys.exit(1)
else:
print(f'✅ All QC modules loaded successfully')
"
# Test 5: Configuration validation
echo ""
echo "Test 5: Configuration validation"
echo "==============================="
if [ ! -f "config.env" ] && [ ! -f "config/production.env" ] && [ ! -f "config/development.env" ]; then
echo "ERROR: No configuration files found!"
exit 1
fi
# Check for required environment variables
$PYTHON_CMD -c "
import os
from dotenv import load_dotenv
# Try to load any available config
if os.path.exists('config/development.env'):
load_dotenv('config/development.env')
elif os.path.exists('config/production.env'):
load_dotenv('config/production.env')
elif os.path.exists('config.env'):
load_dotenv('config.env')
required_vars = ['OPENAI_API_KEY', 'GOOGLE_API_KEY', 'AZURE_TENANT_ID', 'AZURE_CLIENT_ID']
missing_vars = []
for var in required_vars:
if not os.environ.get(var):
missing_vars.append(var)
if missing_vars:
print(f'ERROR: Missing required environment variables: {missing_vars}')
exit(1)
else:
print('✅ All required environment variables are set')
"
# Test 6: Brand guidelines database
echo ""
echo "Test 6: Brand guidelines database"
echo "================================"
$PYTHON_CMD -c "
try:
from brand_guidelines_db import BrandGuidelinesDB
brand_db = BrandGuidelinesDB()
brands = brand_db.get_all_brands()
print(f'✅ Brand guidelines database loaded ({len(brands)} brands)')
except Exception as e:
print(f'ERROR: Brand guidelines database failed: {e}')
exit(1)
"
# Final summary
echo ""
echo "==========================================="
echo "🎉 ALL TESTS PASSED!"
echo "The system is ready for deployment."
echo "==========================================="