chore: add staging smoke test script (#319)

Adds scripts/smoke_test_staging.py to verify API health and rate limiting configuration in the staging environment.

authored by zzstoatzz.io and committed by GitHub b600997a 66bc2436

Changed files
+73
scripts
+73
scripts/smoke_test_staging.py
··· 1 + import asyncio 2 + import sys 3 + import time 4 + 5 + import httpx 6 + 7 + BASE_URL = "https://api-stg.plyr.fm" 8 + 9 + 10 + async def check_health(client): 11 + print(f"Checking {BASE_URL}/health...") 12 + try: 13 + resp = await client.get(f"{BASE_URL}/health") 14 + if resp.status_code == 200: 15 + print("✅ Health check passed") 16 + else: 17 + print(f"❌ Health check failed: {resp.status_code}") 18 + sys.exit(1) 19 + except Exception as e: 20 + print(f"❌ Connection failed: {e}") 21 + sys.exit(1) 22 + 23 + 24 + async def verify_rate_limit(client): 25 + print("\nVerifying rate limits (target: >100 reqs)...") 26 + # Global limit is 100/min per instance. 27 + # With N instances, capacity is N * 100. 28 + count = 250 29 + rate_limited = 0 30 + success = 0 31 + 32 + start = time.time() 33 + # Send in batches 34 + batch_size = 50 35 + for _ in range(0, count, batch_size): 36 + tasks = [] 37 + for _ in range(batch_size): 38 + tasks.append(client.get(f"{BASE_URL}/health")) 39 + 40 + responses = await asyncio.gather(*tasks, return_exceptions=True) 41 + 42 + for r in responses: 43 + if isinstance(r, httpx.Response): 44 + if r.status_code == 429: 45 + rate_limited += 1 46 + elif r.status_code == 200: 47 + success += 1 48 + else: 49 + print(f"Unexpected status: {r.status_code}") 50 + else: 51 + print(f"Request error: {r}") 52 + 53 + if rate_limited > 0: 54 + print(f"Hit limit after {success + rate_limited} requests!") 55 + break 56 + 57 + duration = time.time() - start 58 + print(f"Summary: {success} OK, {rate_limited} Limited in {duration:.2f}s") 59 + 60 + if rate_limited > 0: 61 + print("✅ Rate limiting confirmed active") 62 + else: 63 + print("⚠️ No rate limits hit - capacity might be higher than tested") 64 + 65 + 66 + async def main(): 67 + async with httpx.AsyncClient(timeout=10.0) as client: 68 + await check_health(client) 69 + await verify_rate_limit(client) 70 + 71 + 72 + if __name__ == "__main__": 73 + asyncio.run(main())