CoolFace
Apppublic

Kalletlamadhav/sql_optimized_env_new

sourceHugging Faceupdated 5mo agoView on Hugging Face
0likes
test_live_simple.py185 linesDownload Raw Back to root
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