Kalletlamadhav/sql_optimized_env_new
0
1#!/usr/bin/env python32"""3Simple test with retries for HuggingFace Space (handles cold starts).4"""5 6import requests7import json8import time9 10BASE_URL = "https://kalletlamadhav-sql-optimized-env-new.hf.space"11TIMEOUT = 60 # Longer timeout for cold starts12MAX_RETRIES = 313 14def test_with_retry(method, endpoint, body=None, retries=MAX_RETRIES):15 """Test endpoint with retry logic for cold starts."""16 url = f"{BASE_URL}{endpoint}"17 18 for attempt in range(retries):19 try:20 print(f"\n{'๐' if attempt > 0 else '๐'} {method} {endpoint} (attempt {attempt + 1}/{retries})")21 22 if method == "GET":23 response = requests.get(url, timeout=TIMEOUT)24 else:25 response = requests.post(url, json=body, timeout=TIMEOUT)26 27 if response.status_code == 200:28 data = response.json()29 print(f"โ
Success! Status: {response.status_code}")30 return data31 else:32 print(f"โ ๏ธ Status: {response.status_code}")33 print(f" Response: {response.text[:300]}")34 35 except requests.exceptions.Timeout:36 print(f"โฑ๏ธ Timeout after {TIMEOUT}s")37 if attempt < retries - 1:38 wait = 10 * (attempt + 1)39 print(f" Waiting {wait}s before retry (Space may be waking up)...")40 time.sleep(wait)41 except Exception as e:42 print(f"โ Error: {str(e)}")43 if attempt < retries - 1:44 time.sleep(5)45 46 print(f"โ Failed after {retries} attempts")47 return None48 49def main():50 print("="*70)51 print(" TESTING LIVE HUGGINGFACE SPACE")52 print("="*70)53 print(f"Base URL: {BASE_URL}")54 print(f"Timeout: {TIMEOUT}s per request")55 print(f"Max retries: {MAX_RETRIES}")56 print("\nNote: First request may take 30-60s if Space is sleeping...")57 58 # Test 1: Health check59 print("\n" + "="*70)60 print("TEST 1: GET /health")61 print("="*70)62 health = test_with_retry("GET", "/health")63 if health:64 print(f"\n๐ Health Response:")65 print(json.dumps(health, indent=2))66 if health.get("status") == "ok":67 print("\nโ
PASS: Health check OK")68 else:69 print(f"\nโ FAIL: Status is '{health.get('status')}', expected 'ok'")70 else:71 print("\nโ FAIL: Health endpoint not responding")72 print("\nโ ๏ธ Your Space may be:")73 print(" 1. Still building/deploying")74 print(" 2. In sleep mode (try accessing it in browser first)")75 print(" 3. Having runtime errors")76 print(f"\n Visit: {BASE_URL} to check status")77 return78 79 time.sleep(2)80 81 # Test 2: Tasks82 print("\n" + "="*70)83 print("TEST 2: GET /tasks")84 print("="*70)85 tasks = test_with_retry("GET", "/tasks")86 if tasks and isinstance(tasks, list):87 print(f"\nโ
PASS: Found {len(tasks)} tasks")88 for i, task in enumerate(tasks[:3]):89 print(f" {i+1}. {task.get('task_id')} - {task.get('expected_pattern')}")90 else:91 print(f"\nโ FAIL: Expected list of tasks, got: {type(tasks)}")92 93 time.sleep(2)94 95 # Test 3: Reset96 print("\n" + "="*70)97 print("TEST 3: POST /reset")98 print("="*70)99 reset = test_with_retry("POST", "/reset")100 if reset and "task_id" in reset:101 print(f"\nโ
PASS: Reset successful")102 print(f" Task: {reset.get('task_id')}")103 print(f" Pattern: {reset.get('expected_pattern')}")104 else:105 print(f"\nโ FAIL: Invalid reset response")106 107 time.sleep(2)108 109 # Test 4: Reset with specific task110 print("\n" + "="*70)111 print("TEST 4: POST /reset?task_id=pds_select_star")112 print("="*70)113 reset_pds = test_with_retry("POST", "/reset?task_id=pds_select_star")114 if reset_pds and reset_pds.get("task_id") == "pds_select_star":115 print(f"\nโ
PASS: Reset to pds_select_star")116 else:117 print(f"\nโ FAIL: Expected pds_select_star, got {reset_pds.get('task_id') if reset_pds else None}")118 119 time.sleep(2)120 121 # Test 5: Step with reward validation122 print("\n" + "="*70)123 print("TEST 5: POST /step (REWARD VALIDATION)")124 print("="*70)125 126 action = {127 "optimized_query": "SELECT allotment_id, state_code FROM pds_allotments WHERE state_code='MH'",128 "identified_pattern": "SELECT_STAR",129 "explanation": "Removed SELECT * to reduce bandwidth",130 "index_statements": ["CREATE INDEX idx_state ON pds_allotments(state_code)"],131 "schema_analysis": "No index on state_code"132 }133 134 step = test_with_retry("POST", "/step", action)135 if step:136 print(f"\n๐ Step Response:")137 print(json.dumps(step, indent=2)[:800])138 139 # Extract reward140 reward = step.get("reward")141 if isinstance(reward, dict):142 reward_value = reward.get("total", 0)143 else:144 reward_value = reward145 146 print(f"\n๐ฐ Reward: {reward_value}")147 print(f" Type: {type(reward_value)}")148 149 # Validate reward150 if isinstance(reward_value, (int, float)):151 if reward_value == 0.0:152 print(f"\nโ FAIL: Reward is exactly 0.0 (FORBIDDEN)")153 elif reward_value == 1.0:154 print(f"\nโ FAIL: Reward is exactly 1.0 (FORBIDDEN)")155 elif reward_value <= 0.01:156 print(f"\nโ FAIL: Reward {reward_value} is <= 0.01")157 elif reward_value >= 0.99:158 print(f"\nโ FAIL: Reward {reward_value} is >= 0.99")159 elif 0.01 < reward_value < 0.99:160 print(f"\nโ
PASS: Reward {reward_value} is strictly between 0.01 and 0.99 โ")161 else:162 print(f"\nโ FAIL: Reward {reward_value} is invalid")163 else:164 print(f"\nโ FAIL: Reward is not numeric: {type(reward_value)}")165 166 # Check other fields167 if "done" in step and isinstance(step["done"], bool):168 print(f"โ
'done' field present: {step['done']}")169 else:170 print(f"โ 'done' field missing or invalid")171 172 if "observation" in step and isinstance(step["observation"], dict):173 print(f"โ
'observation' field present")174 else:175 print(f"โ 'observation' field missing or invalid")176 else:177 print(f"\nโ FAIL: Step endpoint not responding")178 179 print("\n" + "="*70)180 print(" TEST COMPLETE")181 print("="*70)182 183if __name__ == "__main__":184 main()185 