|
|
| """
|
| Deployment Test Script.
|
|
|
| Tests deployed API endpoint to verify functionality:
|
| - Health check
|
| - Scam detection
|
| - Multi-turn engagement
|
| - Intelligence extraction
|
|
|
| Run this script to validate a deployed instance.
|
| """
|
|
|
| import sys
|
| import time
|
| import argparse
|
|
|
|
|
| try:
|
| import requests
|
| except ImportError:
|
| print("Error: 'requests' package not installed")
|
| print("Run: pip install requests")
|
| sys.exit(1)
|
|
|
|
|
| DEFAULT_BASE_URL = "http://localhost:8000"
|
|
|
|
|
| def test_health(base_url: str) -> bool:
|
| """Test health endpoint."""
|
| print("Testing health endpoint...")
|
|
|
| try:
|
| response = requests.get(f"{base_url}/api/v1/health", timeout=10)
|
|
|
| if response.status_code == 200:
|
| data = response.json()
|
| print(f" Status: {data.get('status')}")
|
| print(f" Version: {data.get('version')}")
|
| return data.get("status") == "healthy"
|
| else:
|
| print(f" [FAIL] Status code: {response.status_code}")
|
| return False
|
|
|
| except requests.RequestException as e:
|
| print(f" [FAIL] Request failed: {e}")
|
| return False
|
|
|
|
|
| def test_engage_scam(base_url: str) -> bool:
|
| """Test engage endpoint with scam message."""
|
| print("\nTesting engage endpoint (scam message)...")
|
|
|
| payload = {
|
| "message": "Congratulations! You won 10 lakh rupees. Share your OTP now!",
|
| "language": "auto",
|
| }
|
|
|
| try:
|
| response = requests.post(
|
| f"{base_url}/api/v1/honeypot/engage",
|
| json=payload,
|
| timeout=30,
|
| )
|
|
|
| if response.status_code == 200:
|
| data = response.json()
|
| print(f" Status: {data.get('status')}")
|
| print(f" Scam Detected: {data.get('scam_detected')}")
|
| print(f" Confidence: {data.get('confidence')}")
|
| print(f" Session ID: {data.get('session_id')}")
|
| return True
|
| else:
|
| print(f" [FAIL] Status code: {response.status_code}")
|
| print(f" Response: {response.text}")
|
| return False
|
|
|
| except requests.RequestException as e:
|
| print(f" [FAIL] Request failed: {e}")
|
| return False
|
|
|
|
|
| def test_engage_legitimate(base_url: str) -> bool:
|
| """Test engage endpoint with legitimate message."""
|
| print("\nTesting engage endpoint (legitimate message)...")
|
|
|
| payload = {
|
| "message": "Hi, how are you doing today?",
|
| "language": "en",
|
| }
|
|
|
| try:
|
| response = requests.post(
|
| f"{base_url}/api/v1/honeypot/engage",
|
| json=payload,
|
| timeout=30,
|
| )
|
|
|
| if response.status_code == 200:
|
| data = response.json()
|
| print(f" Status: {data.get('status')}")
|
| print(f" Scam Detected: {data.get('scam_detected')}")
|
| return True
|
| else:
|
| print(f" [FAIL] Status code: {response.status_code}")
|
| return False
|
|
|
| except requests.RequestException as e:
|
| print(f" [FAIL] Request failed: {e}")
|
| return False
|
|
|
|
|
| def test_batch(base_url: str) -> bool:
|
| """Test batch endpoint."""
|
| print("\nTesting batch endpoint...")
|
|
|
| payload = {
|
| "messages": [
|
| {"id": "1", "message": "You won a prize!"},
|
| {"id": "2", "message": "Hello, how are you?"},
|
| ]
|
| }
|
|
|
| try:
|
| response = requests.post(
|
| f"{base_url}/api/v1/honeypot/batch",
|
| json=payload,
|
| timeout=30,
|
| )
|
|
|
| if response.status_code == 200:
|
| data = response.json()
|
| print(f" Status: {data.get('status')}")
|
| print(f" Processed: {data.get('processed')}")
|
| print(f" Failed: {data.get('failed')}")
|
| return True
|
| else:
|
| print(f" [FAIL] Status code: {response.status_code}")
|
| return False
|
|
|
| except requests.RequestException as e:
|
| print(f" [FAIL] Request failed: {e}")
|
| return False
|
|
|
|
|
| def measure_response_time(base_url: str) -> float:
|
| """Measure average response time."""
|
| print("\nMeasuring response time...")
|
|
|
| times = []
|
|
|
| for i in range(3):
|
| start = time.time()
|
| try:
|
| requests.post(
|
| f"{base_url}/api/v1/honeypot/engage",
|
| json={"message": "Test message"},
|
| timeout=30,
|
| )
|
| elapsed = time.time() - start
|
| times.append(elapsed)
|
| print(f" Request {i+1}: {elapsed:.2f}s")
|
| except:
|
| print(f" Request {i+1}: FAILED")
|
|
|
| if times:
|
| avg = sum(times) / len(times)
|
| print(f" Average: {avg:.2f}s")
|
| return avg
|
|
|
| return 0
|
|
|
|
|
| def main():
|
| """Main entry point for deployment testing."""
|
| parser = argparse.ArgumentParser(description="Test ScamShield AI deployment")
|
| parser.add_argument(
|
| "--url",
|
| default=DEFAULT_BASE_URL,
|
| help=f"Base URL of API (default: {DEFAULT_BASE_URL})",
|
| )
|
| args = parser.parse_args()
|
|
|
| base_url = args.url.rstrip("/")
|
|
|
| print("=" * 60)
|
| print("ScamShield AI - Deployment Test")
|
| print("=" * 60)
|
| print(f"\nBase URL: {base_url}")
|
| print()
|
|
|
| results = {
|
| "health": test_health(base_url),
|
| "engage_scam": test_engage_scam(base_url),
|
| "engage_legitimate": test_engage_legitimate(base_url),
|
| "batch": test_batch(base_url),
|
| }
|
|
|
| avg_time = measure_response_time(base_url)
|
|
|
|
|
| print("\n" + "=" * 60)
|
| print("Test Summary")
|
| print("=" * 60)
|
|
|
| passed = sum(1 for v in results.values() if v)
|
| total = len(results)
|
|
|
| for test, result in results.items():
|
| status = "PASS" if result else "FAIL"
|
| print(f" {test}: {status}")
|
|
|
| print(f"\nResults: {passed}/{total} tests passed")
|
|
|
| if avg_time > 0:
|
| if avg_time < 2.0:
|
| print(f"Response time: {avg_time:.2f}s (Target: <2s)")
|
| else:
|
| print(f"Response time: {avg_time:.2f}s (ABOVE target of 2s)")
|
|
|
| if passed == total:
|
| print("\nDeployment verification SUCCESSFUL!")
|
| sys.exit(0)
|
| else:
|
| print("\nDeployment verification FAILED!")
|
| sys.exit(1)
|
|
|
|
|
| if __name__ == "__main__":
|
| main()
|
|
|