# API Testing Guide คู่มือการทดสอบ API สำหรับ Job Failure Prediction & Anomaly Detection ## 🚀 วิธีที่ 1: ใช้ Test Script (แนะนำ) ### Local Testing ```bash # Test API ที่รันบน localhost:8000 (default) python test_api.py # Test API ที่รันบน localhost:7860 (Hugging Face Spaces port) python test_api.py --port 7860 # Test API ที่ URL เฉพาะ python test_api.py --url http://localhost:8000 ``` ### Hugging Face Spaces Testing ```bash # Test API บน Hugging Face Spaces python test_api.py --url https://your-username-your-space.hf.space ``` --- ## 🧪 วิธีที่ 2: ใช้ cURL ### Health Check ```bash # Local curl http://localhost:8000/health # Hugging Face Spaces curl https://your-username-your-space.hf.space/health ``` ### Job Failure Prediction ```bash # Local curl -X POST http://localhost:8000/predict/job-fail \ -H "Content-Type: application/json" \ -d '{ "zone": "prod", "job_nm": "daily_export_customer", "job_start_time": "2026-01-21T01:00:00", "duration_sec": 5400, "status": "SUCCESS", "err_msg": "", "explain": true }' # Hugging Face Spaces curl -X POST https://your-username-your-space.hf.space/predict/job-fail \ -H "Content-Type: application/json" \ -d '{ "zone": "prod", "job_nm": "daily_export_customer", "job_start_time": "2026-01-21T01:00:00", "duration_sec": 5400, "status": "SUCCESS", "explain": true }' ``` ### Anomaly Detection ```bash # Local curl -X POST http://localhost:8000/detect/anomaly \ -H "Content-Type: application/json" \ -d '{ "features": { "duration_sec": 5400, "duration_zscore": 1.6, "avg_duration_7": 3000, "failure_rate_7": 0.15, "err_msg_len": 0, "hour_sin": 0.2588, "hour_cos": 0.9659 }, "threshold": 0.01 }' # Hugging Face Spaces curl -X POST https://your-username-your-space.hf.space/detect/anomaly \ -H "Content-Type: application/json" \ -d '{ "features": { "duration_sec": 5400, "duration_zscore": 1.6, "avg_duration_7": 3000, "failure_rate_7": 0.15, "err_msg_len": 0 } }' ``` --- ## 🌐 วิธีที่ 3: ใช้ Swagger UI (Interactive) ### Local 1. เริ่ม API server: ```bash uvicorn app:app --host 0.0.0.0 --port 8000 ``` 2. เปิด browser ไปที่: ``` http://localhost:8000/docs ``` 3. ทดสอบ endpoints ผ่าน interactive UI ### Hugging Face Spaces 1. ไปที่ Space page 2. คลิก "API" tab หรือไปที่: ``` https://your-username-your-space.hf.space/docs ``` 3. ทดสอบ endpoints ผ่าน interactive UI --- ## 📝 วิธีที่ 4: ใช้ Python Requests ### Example Script ```python import requests import json # Base URL BASE_URL = "http://localhost:8000" # หรือ URL ของ Hugging Face Space # Test Health response = requests.get(f"{BASE_URL}/health") print("Health Check:", response.json()) # Test Prediction payload = { "zone": "prod", "job_nm": "daily_export", "job_start_time": "2026-01-21T01:00:00", "duration_sec": 5400, "status": "SUCCESS", "explain": True } response = requests.post( f"{BASE_URL}/predict/job-fail", json=payload ) print("Prediction:", response.json()) # Test Anomaly Detection payload = { "features": { "duration_sec": 5400, "duration_zscore": 1.6, "err_msg_len": 0 } } response = requests.post( f"{BASE_URL}/detect/anomaly", json=payload ) print("Anomaly Detection:", response.json()) ``` --- ## 🔍 วิธีที่ 5: ใช้ Postman / Insomnia ### Import Collection 1. สร้าง new collection 2. เพิ่ม requests: **Health Check** - Method: `GET` - URL: `http://localhost:8000/health` **Job Failure Prediction** - Method: `POST` - URL: `http://localhost:8000/predict/job-fail` - Headers: `Content-Type: application/json` - Body (JSON): ```json { "zone": "prod", "job_nm": "daily_export", "job_start_time": "2026-01-21T01:00:00", "duration_sec": 5400, "status": "SUCCESS", "explain": true } ``` **Anomaly Detection** - Method: `POST` - URL: `http://localhost:8000/detect/anomaly` - Headers: `Content-Type: application/json` - Body (JSON): ```json { "features": { "duration_sec": 5400, "duration_zscore": 1.6, "err_msg_len": 0 } } ``` --- ## ✅ Expected Responses ### Health Check Response ```json { "status": "healthy", "service": "job-failure-prediction", "models_loaded": { "predictor": true, "anomaly_detector": true } } ``` ### Job Failure Prediction Response ```json { "fail_probability": 0.79, "risk_level": "MEDIUM", "top_drivers": [ { "feature": "failure_rate_7", "shap_value": 0.30, "effect": "increase" } ], "recommended_actions": [ "Monitor upstream dependencies and recent job history" ] } ``` ### Anomaly Detection Response ```json { "reconstruction_error": 0.0235, "is_anomaly": true, "threshold": 0.01, "top_drivers": [ { "feature": "duration_zscore", "error": 0.0142 } ] } ``` --- ## 🐛 Troubleshooting ### Connection Error **ปัญหา:** `ConnectionError: Could not connect to API` **แก้ไข:** - ตรวจสอบว่า API server กำลังรันอยู่ - ตรวจสอบ URL และ port - ตรวจสอบ firewall settings ### 404 Not Found **ปัญหา:** `404 Not Found` **แก้ไข:** - ตรวจสอบ endpoint path (`/health`, `/predict/job-fail`, `/detect/anomaly`) - ตรวจสอบว่า API server รันอยู่ ### 500 Internal Server Error **ปัญหา:** `500 Internal Server Error` **แก้ไข:** - ตรวจสอบ logs ของ API server - ตรวจสอบว่า models ถูก load ถูกต้อง - ตรวจสอบ request payload format ### Models Not Loaded **ปัญหา:** `models_loaded: {"predictor": false, "anomaly_detector": false}` **แก้ไข:** - ตรวจสอบว่า models อยู่ใน `models/` directory - ตรวจสอบว่า model files มีครบถ้วน - ตรวจสอบ logs สำหรับ error messages --- ## 📊 Test Cases ### Test Case 1: Basic Health Check ```bash curl http://localhost:8000/health ``` **Expected:** Status 200, models_loaded = true ### Test Case 2: Prediction with Minimal Data ```bash curl -X POST http://localhost:8000/predict/job-fail \ -H "Content-Type: application/json" \ -d '{"job_nm": "test_job", "job_start_time": "2026-01-21T01:00:00"}' ``` **Expected:** Status 200, fail_probability between 0-1 ### Test Case 3: Prediction with Full Data ```bash curl -X POST http://localhost:8000/predict/job-fail \ -H "Content-Type: application/json" \ -d '{ "zone": "prod", "job_nm": "daily_export", "job_start_time": "2026-01-21T01:00:00", "duration_sec": 5400, "status": "SUCCESS", "explain": true }' ``` **Expected:** Status 200, includes top_drivers and recommended_actions ### Test Case 4: Anomaly Detection ```bash curl -X POST http://localhost:8000/detect/anomaly \ -H "Content-Type: application/json" \ -d '{ "features": { "duration_sec": 10000, "duration_zscore": 3.0, "err_msg_len": 0 } }' ``` **Expected:** Status 200, is_anomaly = true (for high zscore) --- ## 🎯 Quick Test Checklist - [ ] Health endpoint returns 200 - [ ] Models are loaded (check health response) - [ ] Prediction endpoint accepts requests - [ ] Prediction returns valid probability (0-1) - [ ] Risk level is one of: MINIMAL, LOW, MEDIUM, CRITICAL - [ ] SHAP explanations work (when explain=true) - [ ] Anomaly detection accepts feature dict - [ ] Anomaly detection returns is_anomaly boolean - [ ] Error handling works (invalid requests return 422/500) - [ ] CORS works (if testing from browser) --- ## 📚 Additional Resources - **Swagger UI**: `/docs` - Interactive API documentation - **ReDoc**: `/redoc` - Alternative API documentation - **OpenAPI Schema**: `/openapi.json` - Machine-readable API schema