Spaces:
Running
Running
| # Test client for the FastAPI backend | |
| import requests | |
| import json | |
| import time | |
| class CodeScannerClient: | |
| def __init__(self, base_url="http://localhost:8000"): | |
| self.base_url = base_url | |
| def health_check(self): | |
| # Check if API is running | |
| try: | |
| response = requests.get(f"{self.base_url}/health") | |
| return response.json() | |
| except requests.exceptions.ConnectionError: | |
| return {"status": "error", "message": "API not reachable"} | |
| def analyze_code(self, code: str, mode="combined", detailed=False): | |
| # Analyze a single code snippet | |
| payload = { | |
| "code": code, | |
| "analysis_mode": mode, | |
| "detailed": detailed | |
| } | |
| start_time = time.time() | |
| response = requests.post( | |
| f"{self.base_url}/analyze", | |
| json=payload | |
| ) | |
| response_time = time.time() - start_time | |
| if response.status_code == 200: | |
| result = response.json() | |
| result["response_time"] = response_time | |
| return result | |
| else: | |
| return { | |
| "error": f"API error: {response.status_code}", | |
| "details": response.text | |
| } | |
| def analyze_file(self, filepath: str): | |
| # Analyze code from a file | |
| with open(filepath, 'r') as f: | |
| code = f.read() | |
| return self.analyze_code(code) | |
| def batch_analyze(self, code_list: list, mode="combined"): | |
| # Analyze multiple code snippets | |
| payload = { | |
| "files": code_list, | |
| "analysis_mode": mode | |
| } | |
| response = requests.post( | |
| f"{self.base_url}/analyze/batch", | |
| json=payload | |
| ) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| return {"error": f"API error: {response.status_code}"} | |
| def upload_file(self, filepath: str): | |
| # Upload and analyze a file | |
| with open(filepath, 'rb') as f: | |
| files = {'file': (filepath, f, 'text/python')} | |
| response = requests.post( | |
| f"{self.base_url}/analyze/file", | |
| files=files | |
| ) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| return {"error": f"Upload error: {response.status_code}"} | |
| # Example usage | |
| if __name__ == "__main__": | |
| client = CodeScannerClient() | |
| print("🔍 Testing API Client") | |
| print("="*50) | |
| # 1. Health check | |
| print("1. Health check:") | |
| health = client.health_check() | |
| print(f" Status: {health.get('status')}") | |
| # 2. Analyze vulnerable code | |
| print("\n2. Analyzing vulnerable code:") | |
| vulnerable_code = """def get_user(user_id):\n query = f"SELECT * FROM users WHERE id = {user_id}"\n return query""" | |
| result = client.analyze_code(vulnerable_code, detailed=True) | |
| print(f" Security Score: {result.get('security_score')}") | |
| print(f" Issues Found: {result.get('issues_count')}") | |
| print(f" Response Time: {result.get('response_time', 0):.3f}s") | |
| # 3. Analyze safe code | |
| print("\n3. Analyzing safe code:") | |
| safe_code = """def get_user(user_id):\n query = "SELECT * FROM users WHERE id = %s"\n return execute_query(query, (user_id,))""" | |
| result = client.analyze_code(safe_code) | |
| print(f" Security Score: {result.get('security_score')}") | |
| print(f" Issues Found: {result.get('issues_count')}") | |
| # 4. Batch analysis | |
| print("\n4. Testing batch analysis:") | |
| batch_codes = [vulnerable_code, safe_code] | |
| batch_result = client.batch_analyze(batch_codes) | |
| if "results" in batch_result: | |
| print(f" Processed {len(batch_result['results'])} files") | |
| print(f" Average Score: {batch_result['summary'].get('average_security_score', 0):.1f}") | |
| print("\n✅ API Client Test Complete!") | |
| print(f"\n📚 API Documentation available at: http://localhost:8000/docs") |